Index: src/uk/me/parabola/imgfmt/app/dem/DEMFile.java
===================================================================
--- src/uk/me/parabola/imgfmt/app/dem/DEMFile.java	(revision 4048)
+++ src/uk/me/parabola/imgfmt/app/dem/DEMFile.java	(working copy)
@@ -13,15 +13,19 @@
 
 package uk.me.parabola.imgfmt.app.dem;
 
+import java.awt.geom.AffineTransform;
 import java.util.List;
 
 import uk.me.parabola.imgfmt.app.Area;
 import uk.me.parabola.imgfmt.app.BufferedImgFileReader;
 import uk.me.parabola.imgfmt.app.BufferedImgFileWriter;
+import uk.me.parabola.imgfmt.app.Coord;
 import uk.me.parabola.imgfmt.app.ImgFile;
 import uk.me.parabola.imgfmt.app.ImgFileWriter;
 import uk.me.parabola.imgfmt.fs.ImgChannel;
 import uk.me.parabola.mkgmap.reader.hgt.HGTConverter;
+import uk.me.parabola.util.GpxCreator;
+import uk.me.parabola.util.Java2DConverter;
 
 /**
  * The DEM file. This consists of information about elevation. It is used for hill shading
Index: src/uk/me/parabola/mkgmap/build/MapBuilder.java
===================================================================
--- src/uk/me/parabola/mkgmap/build/MapBuilder.java	(revision 4048)
+++ src/uk/me/parabola/mkgmap/build/MapBuilder.java	(working copy)
@@ -31,8 +31,6 @@
 import java.util.Set;
 import java.util.function.UnaryOperator;
 
-import org.openstreetmap.osmosis.core.filter.common.PolygonFileReader;
-
 import uk.me.parabola.imgfmt.ExitException;
 import uk.me.parabola.imgfmt.MapFailedException;
 import uk.me.parabola.imgfmt.Utils;
@@ -216,26 +214,10 @@
 		demOutsidePolygonHeight = (short) props.getProperty("dem-outside-polygon", HGTReader.UNDEF);
 		String demPolygonFile = props.getProperty("dem-poly", null);
 		if (demPolygonFile != null) {
-			demPolygon = readPolyFile(demPolygonFile);
+			demPolygon = Java2DConverter.readPolyFile(demPolygonFile);
 		}
 	}
 
-	private java.awt.geom.Area readPolyFile(String polygonFile) {
-		File f = new File(polygonFile);
-		if (!f.exists()) {
-			throw new IllegalArgumentException("polygon file doesn't exist: " + polygonFile);
-		}
-		try {
-			PolygonFileReader pfr = new PolygonFileReader(f);
-			java.awt.geom.Area polygonInDegrees = pfr.loadPolygon();
-			return Java2DConverter.AreaDegreesToMapUnit(polygonInDegrees);
-		} catch (Exception e) {
-			log.error("cannot read polygon file", polygonFile);
-		}
-		return null;
-	}
-
-
 	private List<Integer> parseDemDists(String demDists) {
 		List<Integer> dists = new ArrayList<>();
 		if (demDists == null)
Index: src/uk/me/parabola/mkgmap/combiners/OverviewBuilder.java
===================================================================
--- src/uk/me/parabola/mkgmap/combiners/OverviewBuilder.java	(revision 4048)
+++ src/uk/me/parabola/mkgmap/combiners/OverviewBuilder.java	(working copy)
@@ -42,6 +42,7 @@
 import uk.me.parabola.mkgmap.reader.overview.OverviewMapDataSource;
 import uk.me.parabola.mkgmap.srt.SrtTextReader;
 import uk.me.parabola.util.EnhancedProperties;
+import uk.me.parabola.util.Java2DConverter;
 
 /**
  * Build the overview map.  This is a low resolution map that covers the whole
@@ -98,7 +99,6 @@
 	}
 
 	public void onFinish() {
-		overviewSource.addBackground();
 		calcLevels();
 		writeOverviewMap();
 		bounds = overviewSource.getBounds();
@@ -359,10 +359,6 @@
 			for (Polygon shape : list) {
 				if (log.isDebugEnabled())
 					log.debug("got polygon", shape);
-				if (shape.getType() == 0x4b){
-					// ignore existing background polygons as we will add our own
-					continue;
-				}
 				MapShape ms = new MapShape();
 
 				List<Coord> points = shape.getPoints();
@@ -393,10 +389,32 @@
 	 */
 	private void addMapCoverageArea(FileInfo finfo) {
 		Area bounds = finfo.getBounds();
+		String demPolygonFile = demProps.getProperty("dem-poly", null); 
+		if (demPolygonFile != null) {
+			java.awt.geom.Area demPolygon = Java2DConverter.readPolyFile(demPolygonFile);
+			java.awt.geom.Area backgroundArea = Java2DConverter.createBoundsArea(finfo.getBounds());
+			backgroundArea.intersect(demPolygon);
+			List<List<Coord>> shapes = Java2DConverter.areaToShapes(backgroundArea);
+			for (List<Coord> shape : shapes) {
+				for (Coord co: shape){
+					overviewSource.addToBounds(co);
+				}
+
+				MapShape bg = new MapShape();
+				bg.setType(0x4a);
+				bg.setPoints(shape);
+				bg.setMinResolution(0);
+				bg.setName(finfo.getDescription() + '\u001d' + finfo.getMapname());
+				overviewSource.addShape(bg); 
+			}
+			return;
+		}
+		
 		List<Coord> points = bounds.toCoords();
 		for (Coord co: points){
 			overviewSource.addToBounds(co);
 		}
+
 		// Create the tile coverage rectangle
 		MapShape bg = new MapShape();
 		bg.setType(0x4a);
Index: src/uk/me/parabola/mkgmap/reader/MapperBasedMapDataSource.java
===================================================================
--- src/uk/me/parabola/mkgmap/reader/MapperBasedMapDataSource.java	(revision 4048)
+++ src/uk/me/parabola/mkgmap/reader/MapperBasedMapDataSource.java	(working copy)
@@ -30,6 +30,7 @@
 import uk.me.parabola.imgfmt.app.net.RoadNetwork;
 import uk.me.parabola.util.Configurable;
 import uk.me.parabola.util.EnhancedProperties;
+import uk.me.parabola.util.Java2DConverter;
 
 /**
  * A convenient base class for all map data that is based on the MapDetails
@@ -104,6 +105,22 @@
 	 * We add the background polygons if the map is not transparent.
 	 */
 	public void addBackground() {
+		String demPolygonFile = configProps.getProperty("dem-poly", null);
+		if (demPolygonFile != null) {
+			java.awt.geom.Area demPolygon = Java2DConverter.readPolyFile(demPolygonFile);
+			java.awt.geom.Area backgroundArea = Java2DConverter.createBoundsArea(mapper.getBounds());
+			backgroundArea.intersect(demPolygon);
+			List<List<Coord>> shapes = Java2DConverter.areaToShapes(backgroundArea);
+			for (List<Coord> shape : shapes) {
+				MapShape background = new MapShape();
+				background.setPoints(shape);
+				background.setType(0x4b); // background type
+				background.setMinResolution(0); // On all levels
+				mapper.addShape(background);
+			}
+			return;
+		}
+
 		MapShape background = new MapShape();
 		background.setPoints(mapper.getBounds().toCoords());
 		background.setType(0x4b); // background type
Index: src/uk/me/parabola/util/Java2DConverter.java
===================================================================
--- src/uk/me/parabola/util/Java2DConverter.java	(revision 4048)
+++ src/uk/me/parabola/util/Java2DConverter.java	(working copy)
@@ -18,10 +18,13 @@
 import java.awt.geom.Area;
 import java.awt.geom.Path2D;
 import java.awt.geom.PathIterator;
+import java.io.File;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 
+import org.openstreetmap.osmosis.core.filter.common.PolygonFileReader;
+
 import uk.me.parabola.imgfmt.Utils;
 import uk.me.parabola.imgfmt.app.Coord;
 import uk.me.parabola.log.Logger;
@@ -358,4 +361,19 @@
 		return new java.awt.geom.Area(path);
 	} 
 
+	public static java.awt.geom.Area readPolyFile(String polygonFile) {
+		File f = new File(polygonFile);
+		if (!f.exists()) {
+			throw new IllegalArgumentException("polygon file doesn't exist: " + polygonFile);
+		}
+		try {
+			PolygonFileReader pfr = new PolygonFileReader(f);
+			java.awt.geom.Area polygonInDegrees = pfr.loadPolygon();
+			return Java2DConverter.AreaDegreesToMapUnit(polygonInDegrees);
+		} catch (Exception e) {
+			log.error("cannot read polygon file", polygonFile);
+		}
+		return null;
+	}
+
 } 
\ No newline at end of file
