Index: src/uk/me/parabola/mkgmap/CommandArgsReader.java
===================================================================
--- src/uk/me/parabola/mkgmap/CommandArgsReader.java	(revision 4397)
+++ src/uk/me/parabola/mkgmap/CommandArgsReader.java	(working copy)
@@ -63,7 +63,7 @@
 		add(new CommandOption("overview-mapnumber", "63240000"));
 		add(new CommandOption("poi-address", ""));
 		add(new CommandOption("merge-lines", ""));
-		add(new CommandOption("is-in-landuse", "residential"));
+		add(new CommandOption("is-in-hook", "landuse=residential"));
 	}
 
 	/**
Index: src/uk/me/parabola/mkgmap/reader/osm/LanduseHook.java
===================================================================
--- src/uk/me/parabola/mkgmap/reader/osm/LanduseHook.java	(revision 4397)
+++ src/uk/me/parabola/mkgmap/reader/osm/LanduseHook.java	(working copy)
@@ -21,6 +21,7 @@
 import java.util.Map.Entry;
 import java.util.Set;
 
+import uk.me.parabola.imgfmt.ExitException;
 import uk.me.parabola.imgfmt.app.Coord;
 import uk.me.parabola.log.Logger;
 import uk.me.parabola.mkgmap.osmstyle.NameFinder;
@@ -42,22 +43,33 @@
 public class LanduseHook implements OsmReadingHooks {
 	private static final Logger log = Logger.getLogger(LanduseHook.class);
 
-	private static final String LANDUSE_PREFIX = "mkgmap:lu:";
+	private static final String IS_IN_PREFIX = "mkgmap:is-in:";
 	private Map<String, BoundaryQuadTree> landuseTreeMap = new LinkedHashMap<>();
 	private String[] wantedTrees;
 	private boolean legacyStyle;
 	private ElementSaver saver;
 	private NameFinder nameFinder;
+	Set<String> used = new HashSet<>();
 
 	@Override
 	public boolean init(ElementSaver saver, EnhancedProperties props) {
-		String opt = props.getProperty("is-in-landuse");
+		String opt = props.getProperty("is-in-hook");
 		if (!props.getProperty("residential-hook", true)) {
-			System.err.println("Found undocumented option residential-hook=false, is now ignored, please see option --is-in-landuse");
+			System.err.println("Found undocumented option residential-hook=false, is now ignored, please see option --is-in-hook");
 		}
 		wantedTrees = getCommaSeparatedTrimmedList(opt);
 		if (wantedTrees.length == 0) 
 			return false; // hook is disabled
+		for (String tag : wantedTrees) {
+			String[] kv = tag.split("=");
+			if (kv.length != 2) {
+				throw new ExitException("invalid value in is-in-hook parameter:'"  + tag + "' is not a key=value pair");
+			}
+			if ("*".equals(kv[1])) {
+				throw new ExitException("invalid value in is-in-hook parameter:'"  + tag + "' *  is not allowed as tag value");
+			}
+			used.add(kv[0].trim());
+		}
 		
 		legacyStyle = props.getProperty(OsmMapDataSource.ADD_MKGMAP_RESIDENTIAL, false);
 		this.nameFinder = new NameFinder(props);
@@ -90,8 +102,8 @@
 	public void end() {
 		log.info("Starting with landuse hook");
 		long t1 = System.currentTimeMillis();
-		for (String landuse: wantedTrees) {
-			landuseTreeMap.put(landuse, buildInsideBoundaryTree(landuseTagKey, landuse));
+		for (String tag: wantedTrees) {
+			landuseTreeMap.put(tag, buildInsideBoundaryTree(tag));
 		}
 		long t2 = System.currentTimeMillis();
 		log.info("Creating landuse bounds took", (t2 - t1), "ms");
@@ -115,12 +127,14 @@
 		landuseTreeMap.clear();
 	}
 
-	private static final short landuseTagKey = TagDict.getInstance().xlate("landuse"); 
 	private static final short nameTagKey = TagDict.getInstance().xlate("name");  
 	private static final short styleFilterTagKey = TagDict.getInstance().xlate("mkgmap:stylefilter");
 	private static final short otherKey = TagDict.getInstance().xlate("mkgmap:other");
 	
-	private BoundaryQuadTree buildInsideBoundaryTree(short tagKey, String val) {
+	private BoundaryQuadTree buildInsideBoundaryTree(String tag) {
+		String[] kv = tag.split("=");
+		short tagKey = TagDict.getInstance().xlate(kv[0].trim());
+		String val = kv[1].trim();
 		List<Boundary> rings = new ArrayList<>();
 		Tags tags = new Tags();
 
@@ -134,7 +148,7 @@
 				rings.add(b);
 			}
 		}
-		log.info("adding ", rings.size(), "areas for", val, "to spatial index");
+		log.info("adding ", rings.size(), "areas for tag", tag, "to spatial index");
 		return new BoundaryQuadTree(saver.getBoundingBox(), rings, null);
 	}
 
@@ -146,7 +160,10 @@
 	private void processElem(Element elem) {
 		for (Entry<String, BoundaryQuadTree> entry : landuseTreeMap.entrySet()) {
 			BoundaryQuadTree tree = entry.getValue();
-			String tagVal = entry.getKey();
+			String tag = entry.getKey();
+			String[] kv = tag.split("=");
+			short tagKey = TagDict.getInstance().xlate(kv[0]);
+			String tagVal = kv[1];
 			Tags isinTags = null;
 			if (elem instanceof Node) {
 				Node node = (Node) elem;
@@ -156,16 +173,16 @@
 				// try the mid point of the way first
 				int middle = way.getPoints().size() / 2;
 				Coord loc = way.hasIdenticalEndPoints() ? way.getCofG() : way.getPoints().get(middle);
-				if (!tagVal.equals(way.getTag(landuseTagKey)))
+				if (!tagVal.equals(way.getTag(tagKey)))
 					isinTags = tree.get(loc);
 			}
 
 			if (isinTags != null) {
-				String prefix = LANDUSE_PREFIX;
+				String prefix = IS_IN_PREFIX;
 				if (legacyStyle && "residential".equals(tagVal)) {
 					prefix = "mkgmap:";
 				}
-				elem.addTag(prefix + tagVal, isinTags.get(otherKey));
+				elem.addTag(prefix + tag.replace('=', '-'), isinTags.get(otherKey));
 			}
 		}
 	}
@@ -172,8 +189,6 @@
 	
 	@Override
 	public Set<String> getUsedTags() {
-		Set<String> used = new HashSet<>();
-		used.add("landuse");
 		used.add("name");
 		return used;
 	}
