Index: src/uk/me/parabola/mkgmap/reader/osm/LocationHook.java
===================================================================
--- src/uk/me/parabola/mkgmap/reader/osm/LocationHook.java	(revision 4265)
+++ src/uk/me/parabola/mkgmap/reader/osm/LocationHook.java	(working copy)
@@ -13,6 +13,7 @@
 
 package uk.me.parabola.mkgmap.reader.osm;
 
+import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map.Entry;
@@ -53,6 +54,7 @@
 	
 	private EnhancedProperties props;
 
+	@Override
 	public boolean init(ElementSaver saver, EnhancedProperties props) {
 		boundaryDirName = props.getProperty("bounds");
 		
@@ -70,7 +72,7 @@
 			// checking of the boundary dir is expensive
 			// check once only and reuse the result
 			if (boundaryDirName.equals(checkedBoundaryDirName)) {
-				if (checkBoundaryDirOk == false) {
+				if (!checkBoundaryDirOk) {
 					log.error("Disable LocationHook because bounds directory is unusable. Dir: "+boundaryDirName);
 					return false;
 				}
@@ -79,7 +81,7 @@
 				checkBoundaryDirOk = false;
 
 				List<String> boundaryFiles = BoundaryUtil.getBoundaryDirContent(boundaryDirName);
-				if (boundaryFiles == null || boundaryFiles.size() == 0) {
+				if (boundaryFiles == null || boundaryFiles.isEmpty()) {
 					log.error("LocationHook is disabled because no bounds files are available. Dir: "
 							+ boundaryDirName);
 					return false;
@@ -92,6 +94,7 @@
 		return true;
 	}
 
+	@Override
 	public void end() {
 		long t1 = System.currentTimeMillis();
 		log.info("Starting with location hook");
@@ -120,12 +123,10 @@
 	private void processLocationRelevantElements() {
 		// process all nodes that might be converted to a garmin node (tagcount > 0)
 		for (Node node : saver.getNodes().values()) {
-			if (node.getTagCount() > 0) {
-				if (saver.getBoundingBox().contains(node.getLocation())){
-					processElem(node);
-					if (resultLog.isDebugEnabled())
-						resultLog.debug("N", node.getId(), locationTagsToString(node));
-				}
+			if (node.getTagCount() > 0 && saver.getBoundingBox().contains(node.getLocation())) {
+				processElem(node);
+				if (resultLog.isDebugEnabled())
+					resultLog.debug("N", node.getId(), locationTagsToString(node));
 			}
 		}
 
@@ -178,14 +179,22 @@
 		}
 		else if (elem instanceof Way){
 			Way way = (Way) elem;
+			Coord midPoint = null;
 			// try the mid point of the way first
-			int middle = way.getPoints().size() / 2;
-			Coord midPoint;
-			if (way.getPoints().size() == 2) {
-				midPoint = way.getPoints().get(0).makeBetweenPoint(way.getPoints().get(1), 0.5);
-			} else {
-				midPoint = way.getPoints().get(middle);
+			final int middle = way.getPoints().size() / 2;
+			if (way.isClosed()) {
+				midPoint = way.getCofG();
+				Way test = new Way(0, Collections.singletonList(midPoint));
+				if (!way.containsPointsOf(test))
+					midPoint = null;
 			}
+			if (midPoint == null) {
+				if (way.getPoints().size() == 2) {
+					midPoint = way.getPoints().get(0).makeBetweenPoint(way.getPoints().get(1), 0.5);
+				} else {
+					midPoint = way.getPoints().get(middle);
+				}
+			}
 			tags = search(midPoint);
 			if (tags == null){
 				// try 1st point next
@@ -198,8 +207,6 @@
 			if (tags == null){
 				// still not found, try rest
 				for (int i = 1; i < way.getPoints().size()-1; i++){
-					if (i == middle)
-						continue;
 					tags = search(way.getPoints().get(i));
 					if (tags != null) 
 						break;
@@ -245,7 +252,7 @@
 	 * @param elem the element 
 	 * @return A new String object
 	 */
-	private String locationTagsToString(Element elem){
+	private static String locationTagsToString(Element elem){
 		StringBuilder res = new StringBuilder();
 		for (int i = BoundaryQuadTree.mkgmapTagsArray.length-1; i >= 0; --i){
 			String tagVal = elem.getTag(BoundaryQuadTree.mkgmapTagsArray[i] );
@@ -257,5 +264,3 @@
 	}
 
 }
-
-
Index: src/uk/me/parabola/mkgmap/reader/osm/Way.java
===================================================================
--- src/uk/me/parabola/mkgmap/reader/osm/Way.java	(revision 4265)
+++ src/uk/me/parabola/mkgmap/reader/osm/Way.java	(working copy)
@@ -236,9 +236,14 @@
 		return area <= 0;
 	}
 
-	// simplistic check to see if this way "contains" another - for
-	// speed, all we do is check that all of the other way's points
-	// are inside this way's polygon
+	/**
+	 * Simplistic check to see if this way "contains" another - for speed, all
+	 * we do is check that all of the other way's points are inside this way's
+	 * polygon.
+	 * 
+	 * @param other the other way
+	 * @return
+	 */
 	public boolean containsPointsOf(Way other) {
 		Polygon thisPoly = new Polygon();
 		for(Coord p : points)
