Index: src/uk/me/parabola/mkgmap/osmstyle/StyledConverter.java
===================================================================
--- src/uk/me/parabola/mkgmap/osmstyle/StyledConverter.java	(revision 3564)
+++ src/uk/me/parabola/mkgmap/osmstyle/StyledConverter.java	(working copy)
@@ -59,6 +59,7 @@
 import uk.me.parabola.mkgmap.osmstyle.housenumber.HousenumberGenerator;
 import uk.me.parabola.mkgmap.reader.osm.CoordPOI;
 import uk.me.parabola.mkgmap.reader.osm.Element;
+import uk.me.parabola.mkgmap.reader.osm.FakeIdGenerator;
 import uk.me.parabola.mkgmap.reader.osm.FeatureKind;
 import uk.me.parabola.mkgmap.reader.osm.GType;
 import uk.me.parabola.mkgmap.reader.osm.Node;
@@ -111,7 +112,8 @@
 	private IdentityHashMap<Coord, CoordNode> nodeIdMap = new IdentityHashMap<>();
 
 	public final static String WAY_POI_NODE_IDS = "mkgmap:way-poi-node-ids";
-	
+	private final HashMap<Integer, Map<String,MapPoint>> pointMap;
+
 	private List<ConvertedWay> roads = new ArrayList<>();
 	private List<ConvertedWay> lines = new ArrayList<>();
 	private HashMap<Long, ConvertedWay> modifiedRoads = new HashMap<>();
@@ -163,6 +165,7 @@
 		} else 
 			nameTagList = null;
 		this.style = style;
+		pointMap = new HashMap<>();
 		wayRules = style.getWayRules();
 		nodeRules = style.getNodeRules();
 		lineRules = style.getLineRules();
@@ -552,6 +555,7 @@
 	}
 	
 	public void end() {
+		pointMap.clear();
 		style.reportStats();
 		driveOnLeft = calcDrivingSide();
 		
@@ -1011,9 +1015,39 @@
 		elementSetup(mp, gt, node);
 		mp.setLocation(node.getLocation());
 
+		boolean dupPOI = checkDuplicatePOI(mp);
+		if (dupPOI){
+			if (FakeIdGenerator.isFakeId(node.getId()))
+				log.info("ignmoring duplicate POI with type",GType.formatType(type),mp.getName(),"for generated element with id",node.getId(),"at",mp.getLocation().toDegreeString());
+			else 
+				log.info("ignmoring duplicate POI with type",GType.formatType(type),mp.getName(),"for element",node.toBrowseURL());
+			return;
+		}
+		
 		collector.addPoint(mp);
 	}
 
+	/**
+	 * Check if we already have added a point with the same type + name and equal location.
+	 * @param mp
+	 * @return
+	 */
+	private boolean checkDuplicatePOI(MapPoint mp) {
+		Map<String, MapPoint> typeMap = pointMap.get(mp.getType());
+		if (typeMap == null){
+			typeMap = new HashMap<>();
+			pointMap.put(mp.getType(), typeMap);
+		}
+		MapPoint old = typeMap.get(mp.getName());
+		if (old == null){
+			typeMap.put(mp.getName(), mp);
+		} else {
+			if (old.getLocation().equals(mp.getLocation()))
+				return true;
+		}
+		return false;
+	}
+
 	private static final short[] labelTagKeys = {
 		TagDict.getInstance().xlate("mkgmap:label:1"),
 		TagDict.getInstance().xlate("mkgmap:label:2"),
Index: src/uk/me/parabola/mkgmap/reader/osm/POIGeneratorHook.java
===================================================================
--- src/uk/me/parabola/mkgmap/reader/osm/POIGeneratorHook.java	(revision 3564)
+++ src/uk/me/parabola/mkgmap/reader/osm/POIGeneratorHook.java	(working copy)
@@ -232,7 +232,6 @@
 		if (poisToAreas == false) {
 			return;
 		}
-
 		// get the coord where the poi is placed
 		Coord poiCoord = null;
 		// do we have some labeling coords?
@@ -259,7 +258,6 @@
 			// use the common center point of the area
 			poiCoord = polygon.getCofG();
 		}
-		
 		Node poi = createPOI(polygon, poiCoord, AREA2POI_TAG); 
 		saver.addNode(poi);
 	}
@@ -340,13 +338,29 @@
 	private void addPOIsToMPs() {
 		int mps2POI = 0;
 		for (Relation r : saver.getRelations().values()) {
-			
 			// create POIs for multipolygon relations only
 			if (r instanceof MultiPolygonRelation == false) {
 				continue;
 			}
+			Node existingPOI = null;
 			
-			Coord point = ((MultiPolygonRelation)r).getCofG();
+			if ("boundary".equals(r.getTag("type")) && "administrative".equals(r.getTag("boundary"))){
+				for (Entry<String, Element> pair : r.getElements()){
+					String role = pair.getKey();
+					Element el = pair.getValue(); 
+					if ("admin_centre".equals(role)){
+						if (el instanceof Node){
+							existingPOI = (Node) el;
+							break;
+						}
+					}
+				}
+			}
+			Coord point;
+			if (existingPOI ==null)
+				point = ((MultiPolygonRelation)r).getCofG();
+			else 
+				point = existingPOI.getLocation();
 			if (point == null) {
 				continue;
 			}
