Index: src/uk/me/parabola/imgfmt/sys/ImgFS.java
===================================================================
--- src/uk/me/parabola/imgfmt/sys/ImgFS.java	(revision 4653)
+++ src/uk/me/parabola/imgfmt/sys/ImgFS.java	(working copy)
@@ -101,7 +101,7 @@
 			FileChannel chan = FileChannel.open(Paths.get(filename), OPEN_CREATE_RW);
 			return createFs(chan, params);
 		} catch (IOException e) {
-			throw new FileNotWritableException("Could not create file: " + params.getFilename(), e);
+			throw new FileNotWritableException("Could not create file", e);
 		}
 	}
 
Index: src/uk/me/parabola/mkgmap/combiners/TdbBuilder.java
===================================================================
--- src/uk/me/parabola/mkgmap/combiners/TdbBuilder.java	(revision 4653)
+++ src/uk/me/parabola/mkgmap/combiners/TdbBuilder.java	(working copy)
@@ -190,7 +190,6 @@
 		try {
 			tdb.write(Utils.joinPath(outputDir, overviewMapname, "tdb"));
 		} catch (IOException e) {
-			log.error("tdb write", e);
 			throw new ExitException("Could not write the TDB file", e);
 		}
 	}
Index: src/uk/me/parabola/mkgmap/osmstyle/StyledConverter.java
===================================================================
--- src/uk/me/parabola/mkgmap/osmstyle/StyledConverter.java	(revision 4653)
+++ src/uk/me/parabola/mkgmap/osmstyle/StyledConverter.java	(working copy)
@@ -165,6 +165,10 @@
 	
 	private LineAdder lineAdder;
 	private NearbyPoiHandler nearbyPoiHandler;
+
+	static List<String> unusedStyleOptions = new ArrayList<>();
+	static List<String> duplicateKeys = new ArrayList<>();
+	static List<String> unspecifiedStyleOptions = new ArrayList<>();
 	
 	public StyledConverter(Style style, MapCollector collector, EnhancedProperties props) {
 		this.collector = collector;
@@ -250,14 +254,24 @@
 				String optionKey = pair[0];
 				String tagKey = STYLE_OPTION_PREF + optionKey;
 				if (!style.getUsedTags().contains(tagKey)) {
-					System.err.println("Warning: Option style-options sets tag not used in style: '" 
-							+ optionKey + "' (gives " + tagKey + ")");
-				} else {
-					String val = (pair.length == 1) ? "true" : pair[1];
-					String old = styleTags.put(tagKey, val);
-					if (old != null)
-						log.error("duplicate tag key", optionKey, "in style option", styleOption);
+					synchronized(unusedStyleOptions) {
+						if (!unusedStyleOptions.contains(optionKey)) {
+							unusedStyleOptions.add(optionKey);
+							Logger.defaultLogger.warn("Option style-options sets tag not used in style: '" 
+									+ optionKey + "' (gives " + tagKey + ")");
+						}
+					}
 				}
+				String val = (pair.length == 1) ? "true" : pair[1];
+				String old = styleTags.put(tagKey, val);
+				if (old != null) {
+					synchronized(duplicateKeys) {
+						if (!duplicateKeys.contains(optionKey)) {
+							duplicateKeys.add(optionKey);
+							Logger.defaultLogger.error("duplicate tag key", optionKey, "in style option", styleOption);
+						}
+					}
+				}
 			}
 		}
 		// flag options used in style but not specified in --style-option
@@ -264,8 +278,13 @@
 		if (style.getUsedTags() != null) {
 			for (String s : style.getUsedTags()) {
 				if (s != null && s.startsWith(STYLE_OPTION_PREF) && styleTags.get(s) == null) {
-					System.err.println("Warning: Option style-options doesn't specify '"
-							+ s.replaceFirst(STYLE_OPTION_PREF, "") + "' (for " + s + ")");
+					synchronized(unspecifiedStyleOptions) {
+						if (!unspecifiedStyleOptions.contains(s)) {
+							unspecifiedStyleOptions.add(s);
+							Logger.defaultLogger.warn("Option style-options doesn't specify '"
+									+ s.replaceFirst(STYLE_OPTION_PREF, "") + "' (for " + s + ")");
+						}
+					}
 				}
 			}
 		}
Index: src/uk/me/parabola/mkgmap/reader/osm/o5m/O5mBinHandler.java
===================================================================
--- src/uk/me/parabola/mkgmap/reader/osm/o5m/O5mBinHandler.java	(revision 4653)
+++ src/uk/me/parabola/mkgmap/reader/osm/o5m/O5mBinHandler.java	(working copy)
@@ -18,7 +18,9 @@
 import java.io.InputStream;
 import java.nio.charset.StandardCharsets;
 
+import uk.me.parabola.imgfmt.FormatException;
 import uk.me.parabola.imgfmt.app.Coord;
+import uk.me.parabola.log.Logger;
 import uk.me.parabola.mkgmap.reader.osm.Element;
 import uk.me.parabola.mkgmap.reader.osm.GeneralRelation;
 import uk.me.parabola.mkgmap.reader.osm.Node;
@@ -107,12 +109,13 @@
 		try {
 			int start = is.read();
 			++countBytes;
-			if (start != RESET_FLAG)
-				throw new IOException("wrong header byte " + start);
+			if (start != RESET_FLAG) {
+				Logger.defaultLogger.error("wrong header byte " + start);
+				throw new FormatException("wrong header byte " + start);
+			}
 			readFile();
 		} catch (IOException e) {
-			System.err.println("exception after " + countBytes + " bytes");
-			e.printStackTrace();
+			Logger.defaultLogger.error("exception after " + countBytes + " bytes", e);
 		}
 	}
 	
Index: src/uk/me/parabola/mkgmap/reader/osm/SeaGenerator.java
===================================================================
--- src/uk/me/parabola/mkgmap/reader/osm/SeaGenerator.java	(revision 4653)
+++ src/uk/me/parabola/mkgmap/reader/osm/SeaGenerator.java	(working copy)
@@ -690,8 +690,7 @@
 		} catch (FileNotFoundException exp) {
 			log.error("Preompiled sea tile " + tileName + " not found.");
 		} catch (Exception exp) {
-			log.error(exp);
-			exp.printStackTrace();
+			log.error("Unexpected error reading "+ tileName, exp);
 		}
 	}
 
