Index: src/uk/me/parabola/mkgmap/osmstyle/ExpressionArranger.java
===================================================================
--- src/uk/me/parabola/mkgmap/osmstyle/ExpressionArranger.java	(revision 4127)
+++ src/uk/me/parabola/mkgmap/osmstyle/ExpressionArranger.java	(working copy)
@@ -377,6 +377,10 @@
 	private int selectivity(Op op) {
 		switch (op.getType()) {
 		case EQUALS:
+			// Non-indexable functions must go to the back.
+			if (!isIndexable(op))
+				return 1000;
+
 			return 0;
 		case EXISTS:
 			return 100;
Index: test/uk/me/parabola/mkgmap/osmstyle/ExpressionArrangerTest.java
===================================================================
--- test/uk/me/parabola/mkgmap/osmstyle/ExpressionArrangerTest.java	(revision 4127)
+++ test/uk/me/parabola/mkgmap/osmstyle/ExpressionArrangerTest.java	(working copy)
@@ -18,6 +18,7 @@
 
 import uk.me.parabola.mkgmap.osmstyle.eval.ExpressionReader;
 import uk.me.parabola.mkgmap.osmstyle.eval.LinkedOp;
+import uk.me.parabola.mkgmap.osmstyle.eval.NodeType;
 import uk.me.parabola.mkgmap.osmstyle.eval.Op;
 import uk.me.parabola.mkgmap.reader.osm.FeatureKind;
 import uk.me.parabola.mkgmap.scan.TokenScanner;
@@ -183,6 +184,16 @@
 		assertEquals(EQUALS, op.getType());
 	}
 
+	@Test
+	public void testExitsAndFunction() {
+		Op op = createOp("$a=* & is_closed()=true {name 'n466'} [0x2]");
+		System.out.println(fmtExpr(op));
+		op = arranger.arrange(op);
+		System.out.println(fmtExpr(op));
+		assertTrue(isSolved(op));
+		assertTrue(op.getFirst().getType() != NodeType.FUNCTION);
+	}
+	
 	private Op createOp(String s) {
 		TokenScanner scanner = new TokenScanner("test.file", new StringReader(s));
 		ExpressionReader er = new ExpressionReader(scanner, FeatureKind.POLYLINE);
