Index: src/uk/me/parabola/imgfmt/app/map/MapReader.java
===================================================================
--- src/uk/me/parabola/imgfmt/app/map/MapReader.java	(revision 2640)
+++ src/uk/me/parabola/imgfmt/app/map/MapReader.java	(working copy)
@@ -127,6 +127,9 @@
 		return treFile.getMapLevels();
 	}
 
+	public String[] getCopyrights(){
+		return treFile.getCopyrights(lblFile);
+	}
 	/**
 	 * Get a list of all the lines for a given level.
 	 * @param level The level, lower numbers are the most detailed.
Index: src/uk/me/parabola/imgfmt/app/trergn/TREFileReader.java
===================================================================
--- src/uk/me/parabola/imgfmt/app/trergn/TREFileReader.java	(revision 2640)
+++ src/uk/me/parabola/imgfmt/app/trergn/TREFileReader.java	(working copy)
@@ -19,6 +19,9 @@
 import uk.me.parabola.imgfmt.app.BufferedImgFileReader;
 import uk.me.parabola.imgfmt.app.ImgFileReader;
 import uk.me.parabola.imgfmt.app.ImgReader;
+import uk.me.parabola.imgfmt.app.Label;
+import uk.me.parabola.imgfmt.app.Section;
+import uk.me.parabola.imgfmt.app.lbl.LBLFileReader;
 import uk.me.parabola.imgfmt.fs.ImgChannel;
 import uk.me.parabola.util.EnhancedProperties;
 
@@ -193,7 +196,7 @@
 		header.config(props);
 	}
 
-	public String[] getCopyrights() {
+	public String[] getMapInfo() {
 
 		List<String> msgs = new ArrayList<String>();
 
@@ -205,27 +208,26 @@
 			msgs.add(m);
 		}
 
-		// Now get the copyright messages that are listed in the section.
-		//Section sect = header.getCopyrightSection();
 
-		// TODO This needs the label section to work...
-		//
-		//long pos = sect.getPosition();
-		//while (pos < sect.getEndPos()) {
-		//	reader.position(pos);
-		//	int labelNum = header.getHeaderLength() + reader.get3();
-		//
-		//
-		//	System.out.println("position at " + labelNum);
-		//	reader.position(labelNum);
-		//	String m = reader.getZString();
-		//	System.out.println("C/R msg " + m);
-		//
-		//	messages.add(m);
-		//
-		//	pos += sect.getItemSize();
-		//}
+		return msgs.toArray(new String[msgs.size()]);
+	}
 
+	public String[] getCopyrights(LBLFileReader lblReader) {
+		Section sect = header.getCopyrightSection();
+		ImgFileReader reader = getReader();
+		List<String> msgs = new ArrayList<String>();
+
+		long pos = sect.getPosition();
+		while (pos < sect.getEndPos()) {
+			reader.position(pos);
+			int offset = reader.get3();
+			Label label = lblReader.fetchLabel(offset);
+			if (label != null) {
+				msgs.add(label.getText());
+			}
+		
+			pos += sect.getItemSize();
+		}
 		return msgs.toArray(new String[msgs.size()]);
 	}
 }
\ No newline at end of file
Index: src/uk/me/parabola/imgfmt/app/trergn/TREHeader.java
===================================================================
--- src/uk/me/parabola/imgfmt/app/trergn/TREHeader.java	(revision 2640)
+++ src/uk/me/parabola/imgfmt/app/trergn/TREHeader.java	(working copy)
@@ -140,14 +140,6 @@
 			mapInfoOff = copyright.getPosition();
 
 		mapInfoSize = mapInfoOff - getHeaderLength();
-		
-		reader.getInt();
-		reader.getInt();
-		reader.getInt();
-
-		copyright.readSectionInfo(reader, true);
-		reader.getInt();
-
 		if (getHeaderLength() > 116) {
 			reader.position(116);
 			mapId = reader.getInt();
@@ -394,4 +386,8 @@
 	public int getExtTypeSectionSize() {
 		return extTypeOffsets.getItemSize();
 	}
+
+	public Section getCopyrightSection() {
+		return copyright;
+	}
 }
Index: src/uk/me/parabola/mkgmap/build/MapBuilder.java
===================================================================
--- src/uk/me/parabola/mkgmap/build/MapBuilder.java	(revision 2640)
+++ src/uk/me/parabola/mkgmap/build/MapBuilder.java	(working copy)
@@ -107,6 +107,8 @@
 
 	private final java.util.Map<MapPoint,POIRecord> poimap = new HashMap<MapPoint,POIRecord>();
 	private final java.util.Map<MapPoint,City> cityMap = new HashMap<MapPoint,City>();
+	private List<String> mapInfo = new ArrayList<String>();
+	private List<String> copyrights = new ArrayList<String>();
 
 	private boolean doRoads;
 	private boolean routingErrorMsgPrinted;
@@ -199,6 +201,8 @@
 				((MapperBasedMapDataSource)src).addBoundaryLine(rc.getArea(), routeCenterBoundaryType, rc.reportSizes());
 			}
 		}
+		if (mapInfo.isEmpty())
+			getMapInfo();
 
 		normalizeCountries(src);
 		
@@ -769,18 +773,7 @@
 	 * @param map The map to write to.
 	 * @param src The source of map information.
 	 */
-	protected void processInfo(Map map, LoadableMapDataSource src) {
-		// The bounds of the map.
-		map.setBounds(src.getBounds());
-
-		if(poiDisplayFlags != 0)					// POI requested alternate address notation
-			map.addPoiDisplayFlags(poiDisplayFlags);
-
-		// You can add anything here.
-		// But there has to be something, otherwise the map does not show up.
-		//
-		// We use it to add copyright information that there is no room for
-		// elsewhere.
+	protected void getMapInfo() {
 		if (licenseFileName != null) {
 			File file = new File(licenseFileName);
 
@@ -791,7 +784,7 @@
 				// repeat until all lines is read
 				while ((text = reader.readLine()) != null) {
 					if (!text.isEmpty()) {
-						map.addInfo(text);
+						mapInfo.add(text);
 					}
 				}
 
@@ -802,32 +795,69 @@
 				throw new ExitException("Error reading license file " + licenseFileName);
 			}
 		} else {
-			map.addInfo("Map data (c) OpenStreetMap and its contributors");
-			map.addInfo("http://www.openstreetmap.org/copyright");
-			map.addInfo("");
-			map.addInfo("This map data is made available under the Open Database License:");
-			map.addInfo("http://opendatacommons.org/licenses/odbl/1.0/");
-			map.addInfo("Any rights in individual contents of the database are licensed under the");
-			map.addInfo("Database Contents License: http://opendatacommons.org/licenses/dbcl/1.0/");
-			map.addInfo("");
+			mapInfo.add("Map data (c) OpenStreetMap and its contributors");
+			mapInfo.add("http://www.openstreetmap.org/copyright");
+			mapInfo.add("");
+			mapInfo.add("This map data is made available under the Open Database License:");
+			mapInfo.add("http://opendatacommons.org/licenses/odbl/1.0/");
+			mapInfo.add("Any rights in individual contents of the database are licensed under the");
+			mapInfo.add("Database Contents License: http://opendatacommons.org/licenses/dbcl/1.0/");
+			mapInfo.add("");
 
 			// Pad the version number with spaces so that version
 			// strings that are different lengths do not change the size and
 			// offsets of the following sections.
-			map.addInfo("Map created with mkgmap-r"
+			mapInfo.add("Map created with mkgmap-r"
 					+ String.format("%-10s", Version.VERSION));
 
-			map.addInfo("Program released under the GPL");
+			mapInfo.add("Program released under the GPL");
 		}
-		// There has to be (at least) two copyright messages or else the map
-		// does not show up.  The second one will be displayed at startup,
-		// although the conditions where that happens are not known.
-		map.addCopyright("program licenced under GPL v2");
+	}
+	
+	public void setMapInfo(List<String> msgs){
+		mapInfo = msgs;
+	}
+	
+	public void setCopyrights(List<String> msgs){
+		copyrights = msgs;
+	}
+	
+	
+	/**
+	 * Set all the information that appears in the header.
+	 *
+	 * @param map The map to write to.
+	 * @param src The source of map information.
+	 */
+	protected void processInfo(Map map, LoadableMapDataSource src) {
+		// The bounds of the map.
+		map.setBounds(src.getBounds());
 
-		// This one gets shown when you switch on, so put the actual
-		// map copyright here.
-		for (String cm : src.copyrightMessages())
-			map.addCopyright(cm);
+		if(poiDisplayFlags != 0)					// POI requested alternate address notation
+			map.addPoiDisplayFlags(poiDisplayFlags);
+
+		// You can add anything here.
+		// But there has to be something, otherwise the map does not show up.
+		//
+		// We use it to add copyright information that there is no room for
+		// elsewhere.
+		for (String s: mapInfo)
+			map.addInfo(s);
+		
+		if (copyrights.isEmpty()){
+			// There has to be (at least) two copyright messages or else the map
+			// does not show up.  The second one will be displayed at startup,
+			// although the conditions where that happens are not known.
+			map.addCopyright("program licenced under GPL v2");
+
+			// This one gets shown when you switch on, so put the actual
+			// map copyright here.
+			for (String cm : src.copyrightMessages())
+				map.addCopyright(cm);
+		} else {
+			for (String cm : copyrights)
+				map.addCopyright(cm);
+		}
 	}
 
 	/**
Index: src/uk/me/parabola/mkgmap/combiners/FileInfo.java
===================================================================
--- src/uk/me/parabola/mkgmap/combiners/FileInfo.java	(revision 2640)
+++ src/uk/me/parabola/mkgmap/combiners/FileInfo.java	(working copy)
@@ -77,7 +77,7 @@
 	private int nodsize;
 
 	private final List<Integer> fileSizes = new ArrayList<Integer>();
-	private String[] copyrights;
+	private String[] licenceInfo;
 	private CommandArgs args;
 	private String mpsName;
 	private int codePage;
@@ -297,7 +297,7 @@
 
 			info.setBounds(treFile.getBounds());
 
-			info.setCopyrights(treFile.getCopyrights());
+			info.setLicenceInfo(treFile.getMapInfo());
 
 			info.setHexname(((TREHeader) treFile.getHeader()).getMapId());
 		} finally {
@@ -398,12 +398,13 @@
 		}
 	}
 
-	protected void setCopyrights(String[] copyrights) {
-		this.copyrights = copyrights;
+	
+	protected void setLicenceInfo(String[] info) {
+		this.licenceInfo = info;
 	}
 
-	public String[] getCopyrights() {
-		return copyrights;
+	public String[] getLicenseInfo() {
+		return licenceInfo;
 	}
 
 	public int getNetsize() {
Index: src/uk/me/parabola/mkgmap/combiners/OverviewBuilder.java
===================================================================
--- src/uk/me/parabola/mkgmap/combiners/OverviewBuilder.java	(revision 2640)
+++ src/uk/me/parabola/mkgmap/combiners/OverviewBuilder.java	(working copy)
@@ -14,6 +14,8 @@
 
 import java.io.File;
 import java.io.FileNotFoundException;
+import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 import uk.me.parabola.imgfmt.ExitException;
 import uk.me.parabola.imgfmt.FileExistsException;
@@ -38,7 +40,6 @@
 import uk.me.parabola.mkgmap.general.MapPoint;
 import uk.me.parabola.mkgmap.general.MapShape;
 import uk.me.parabola.mkgmap.srt.SrtTextReader;
-import uk.me.parabola.util.EnhancedProperties;
 
 /**
  * Build the overview map.  This is a low resolution map that covers the whole
@@ -58,8 +59,8 @@
 	private String outputDir;		
 	private Integer codepage;
 	private Integer encodingType;
-	private String copyrightMsg;
-	private String licenseFileName;
+	private List<String[]> copyrightMsgs = new ArrayList<String[]>();
+	private List<String[]> licenseInfos = new ArrayList<String[]>();
 
 
 	public OverviewBuilder(OverviewMap overviewSource) {
@@ -71,9 +72,6 @@
 		overviewMapname = args.get("overview-mapname", "osmmap");
 		overviewMapnumber = args.get("overview-mapnumber", "63240000");
 		outputDir = args.getOutputDir();
-		copyrightMsg = args.getProperties().getProperty("copyright-message",
-				"OpenStreetMap.org contributors. See: http://wiki.openstreetmap.org/index.php/Attribution");
-		licenseFileName = args.get("license-file", null);
 	}
 
 	public void onMapEnd(FileInfo finfo) {
@@ -111,18 +109,15 @@
 		if (overviewSource.mapLevels() == null)
 			return;
 		MapBuilder mb = new MapBuilder();
-		if (licenseFileName != null){
-			EnhancedProperties props = new EnhancedProperties();
-			props.put("license-file", licenseFileName);
-			mb.config(props);
-		}
 		mb.setEnableLineCleanFilters(false);
 
 		FileSystemParam params = new FileSystemParam();
 		params.setBlockSize(512);
 		params.setMapDescription(areaName);
-		overviewSource.addCopyright(copyrightMsg);
-
+		mb.setCopyrights(creMsgList(copyrightMsgs));
+		mb.setMapInfo(creMsgList(licenseInfos));
+		
+		
 		try {
 			if (codepage == null){
 				codepage = 0; // should not happen
@@ -168,8 +163,30 @@
 			if (encodingType != mapReader.getEncodingType()){
 				System.err.println("WARNING: input file " + filename + " has different charset type " + encodingType);
 			}
+
+			String[] msgs = mapReader.getCopyrights();
+			boolean found = false;
+			for (String[] block : copyrightMsgs) {
+				if (Arrays.deepEquals(block, msgs)){
+					found = true;
+					break;
+				}
+			}
+			if (!found )
+				copyrightMsgs.add(msgs);
 			
+			msgs = finfo.getLicenseInfo();
+			found = false;
+			for (String[] block : licenseInfos) {
+				if (Arrays.deepEquals(block, msgs)){
+					found = true;
+					break;
+				}
+			}
+			if (!found )
+				licenseInfos.add(msgs);
 			
+			
 			levels = mapReader.getLevels();
 			if (overviewSource.mapLevels() == null){
 				LevelInfo[] mapLevels;
@@ -348,4 +365,18 @@
 		else return name;
 	}
 	
+	private List<String> creMsgList(List<String[]> msgs){
+		ArrayList< String> list = new ArrayList<String>();
+		for (int i = 0; i < msgs.size(); i++){
+			String[] block = msgs.get(i);
+			for (String s : block){
+				list.add(s);
+			} 
+			if (i < msgs.size()-1){
+				// separate blocks 
+				list.add("");
+			}
+		}
+		return list;
+	}
 }
Index: src/uk/me/parabola/mkgmap/combiners/TdbBuilder.java
===================================================================
--- src/uk/me/parabola/mkgmap/combiners/TdbBuilder.java	(revision 2640)
+++ src/uk/me/parabola/mkgmap/combiners/TdbBuilder.java	(working copy)
@@ -16,11 +16,18 @@
  */
 package uk.me.parabola.mkgmap.combiners;
 
+import java.io.FileNotFoundException;
 import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
 import uk.me.parabola.imgfmt.ExitException;
 import uk.me.parabola.imgfmt.Utils;
+import uk.me.parabola.imgfmt.app.map.MapReader;
 import uk.me.parabola.log.Logger;
 import uk.me.parabola.mkgmap.CommandArgs;
+import uk.me.parabola.mkgmap.general.LevelInfo;
 import uk.me.parabola.tdbfmt.DetailMapBlock;
 import uk.me.parabola.tdbfmt.TdbFile;
 
@@ -41,6 +48,7 @@
 	private String overviewMapnumber;
 	private String outputDir;
 	private int tdbVersion;
+	private List<String[]> copyrightMsgs = new ArrayList<String[]>();
 
 	public TdbBuilder(OverviewBuilder ovb) {
 		overviewBuilder = ovb;
@@ -127,9 +135,37 @@
 
 		tdb.addDetail(detail);
 
-		String[] msgs = finfo.getCopyrights();
+		String[] msgs = finfo.getLicenseInfo();
 		for (String m : msgs)
 			tdb.addCopyright(m);
+
+		MapReader mapReader = null;
+		String filename = finfo.getFilename();
+		try{
+			mapReader = new MapReader(filename);
+
+			msgs = mapReader.getCopyrights();
+			boolean found = false;
+			for (String[] block : copyrightMsgs) {
+				if (Arrays.deepEquals(block, msgs)){
+					found = true;
+					break;
+				}
+			}
+			if (!found ){
+				copyrightMsgs.add(msgs);
+
+				for (String m : msgs)
+					tdb.addCopyright(m);
+			}
+
+		} catch (FileNotFoundException e) {
+			throw new ExitException("Could not open " + filename + " when creating tdb file");
+		} finally {
+			Utils.closeFile(mapReader);
+		}
+
+
 	}
 
 	/**
Index: src/uk/me/parabola/mkgmap/reader/overview/OverviewMapDataSource.java
===================================================================
--- src/uk/me/parabola/mkgmap/reader/overview/OverviewMapDataSource.java	(revision 2640)
+++ src/uk/me/parabola/mkgmap/reader/overview/OverviewMapDataSource.java	(working copy)
@@ -17,9 +17,8 @@
 package uk.me.parabola.mkgmap.reader.overview;
 
 import java.io.FileNotFoundException;
-import java.util.HashSet;
-import java.util.Set;
-
+import java.util.ArrayList;
+import java.util.List;
 import uk.me.parabola.imgfmt.FormatException;
 import uk.me.parabola.imgfmt.app.Coord;
 import uk.me.parabola.imgfmt.app.CoordNode;
@@ -44,8 +43,7 @@
 {
 	private static final Logger log = Logger.getLogger(OverviewMapDataSource.class);
 	
-	// We keep all non-duplicated copyright messages from the component maps.
-	private final Set<String> copyrights = new HashSet<String>();
+	private final List<String> copyrights = new ArrayList<String>();
 	LevelInfo[] levels = null;	
 	
 	/**
