Index: applications/editors/josm/plugins/seachart/jchart/src/jchart/Jchart.java
===================================================================
--- applications/editors/josm/plugins/seachart/jchart/src/jchart/Jchart.java	(revision 35684)
+++ applications/editors/josm/plugins/seachart/jchart/src/jchart/Jchart.java	(revision 35685)
@@ -4,4 +4,5 @@
 import java.awt.Color;
 import java.awt.Dimension;
+import java.awt.Font;
 import java.awt.Graphics2D;
 import java.awt.Rectangle;
@@ -127,5 +128,5 @@
     public static void main(String[] args) throws Exception {
         if (args.length < 4) {
-            System.err.println("Usage: java -jar jrender.jar <osm data file> <zoom> <scale> <output image file> [<bounds (S W N E)>]");
+            System.err.println("Usage: java -jar jchart.jar <osm data file> <zoom> <scale> <output image file> [<bounds (S W N E)>]");
             System.exit(-1);
         }
@@ -152,4 +153,6 @@
             Graphics2D g2 = img.createGraphics();
             Renderer.reRender(g2, new Rectangle((int) size.getX(), (int) size.getY()), zoom, Double.parseDouble(args[2]), map, context);
+            
+            //Renderer.labelText("000", new Font("Arial", Font.PLAIN, 20), Color.red);
             try {
                 ImageIO.write(img, "png", new File(args[3]));
Index: applications/editors/josm/plugins/seachart/src/render/Renderer.java
===================================================================
--- applications/editors/josm/plugins/seachart/src/render/Renderer.java	(revision 35684)
+++ applications/editors/josm/plugins/seachart/src/render/Renderer.java	(revision 35685)
@@ -97,7 +97,17 @@
     }
 
+    public static void symbol(Symbol symbol, double scale, Delta delta) {
+        Point2D point = context.getPoint(Rules.feature.geom.centre);
+        Symbols.drawSymbol(g2, symbol, (sScale * scale), point.getX(), point.getY(), null, delta);
+    }
+
     public static void symbol(Symbol symbol, Scheme scheme, Delta delta) {
         Point2D point = context.getPoint(Rules.feature.geom.centre);
         Symbols.drawSymbol(g2, symbol, sScale, point.getX(), point.getY(), scheme, delta);
+    }
+
+    public static void symbol(Symbol symbol, double scale, Scheme scheme) {
+        Point2D point = context.getPoint(Rules.feature.geom.centre);
+        Symbols.drawSymbol(g2, symbol, (sScale * scale), point.getX(), point.getY(), scheme, null);
     }
 
@@ -426,19 +436,18 @@
             g2.draw(p);
             Symbol legend = new Symbol();
-            legend.add(new Instr(Form.BBOX, new Rectangle2D.Double(0, 0, 500, 100)));
-            Path2D.Double path = new Path2D.Double(); path.moveTo(0, 0); path.lineTo(500, 0); path.lineTo(500, 100); path.lineTo(0, 100); path.closePath();
+            legend.add(new Instr(Form.BBOX, new Rectangle2D.Double(0, 0, 600, 250)));
+            Path2D.Double path = new Path2D.Double(); path.moveTo(0, 0); path.lineTo(600, 0); path.lineTo(600, 250); path.lineTo(0, 250); path.closePath();
             legend.add(new Instr(Form.FILL, Color.white));
             legend.add(new Instr(Form.PGON, path));
-            legend.add(new Instr(Form.TEXT, new Caption("Mercator Projection", new Font("Arial", Font.PLAIN, 50), Color.black, new Delta(Handle.BC, AffineTransform.getTranslateInstance(250, 60)))));
+            legend.add(new Instr(Form.TEXT, new Caption("Mercator Projection", new Font("Arial", Font.PLAIN, 50), Color.black, new Delta(Handle.BC, AffineTransform.getTranslateInstance(300, 60)))));
+            legend.add(new Instr(Form.TEXT, new Caption("© OpenStreetMap contributors", new Font("Arial", Font.PLAIN, 30), Color.black, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, 40)))));
+            legend.add(new Instr(Form.TEXT, new Caption("EMODnet Bathymetry Consortium (2018)", new Font("Arial", Font.PLAIN, 30), Color.black, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, 40)))));
+            legend.add(new Instr(Form.TEXT, new Caption("EMODnet Digital Bathymetry (DTM)", new Font("Arial", Font.PLAIN, 30), Color.black, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, 40)))));
+            legend.add(new Instr(Form.TEXT, new Caption("http://doi.org/10.12770/18ff0d48-b203-4a65-94a9-5fd8b0ec35f6", new Font("Arial", Font.PLAIN, 20), Color.black, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, 35)))));
             point = context.getPoint(new Snode(map.bounds.minlat, map.bounds.minlon));
             Symbols.drawSymbol(g2, legend, sScale, point.getX(), point.getY(), null, new Delta(Handle.BL, AffineTransform.getTranslateInstance(0, 0)));
-            legend = new Symbol();
-            legend.add(new Instr(Form.BBOX, new Rectangle2D.Double(0, 0, 500, 100)));
-            legend.add(new Instr(Form.TEXT, new Caption("© OpenStreetMap contributors", new Font("Arial", Font.PLAIN, 30), Color.black, new Delta(Handle.BC, AffineTransform.getTranslateInstance(250, 100)))));
-            point = context.getPoint(new Snode(map.bounds.minlat, map.bounds.minlon));
-            Symbols.drawSymbol(g2, legend, sScale, point.getX(), point.getY(), null, new Delta(Handle.BL, AffineTransform.getTranslateInstance(0, 0)));
-        }
-    }
-
+        }
+    }
+    
     public static void lineCircle(LineStyle style, double radius, UniHLU units) {
         switch (units) {
Index: applications/editors/josm/plugins/seachart/src/render/Rules.java
===================================================================
--- applications/editors/josm/plugins/seachart/src/render/Rules.java	(revision 35684)
+++ applications/editors/josm/plugins/seachart/src/render/Rules.java	(revision 35685)
@@ -317,4 +317,6 @@
 				if (testObject(Obj.SPLARE)) for (Feature f : objects) if (testFeature(f)) areas();
 				if (testObject(Obj.SEAARE)) for (Feature f : objects) if (testFeature(f)) areas();
+				if (testObject(Obj.CBLARE)) for (Feature f : objects) if (testFeature(f)) areas();
+				if (testObject(Obj.PIPARE)) for (Feature f : objects) if (testFeature(f)) areas();
 				if (testObject(Obj.DMPGRD)) for (Feature f : objects) if (testFeature(f)) areas();
 				if (testObject(Obj.OBSTRN)) for (Feature f : objects) if (testFeature(f)) obstructions();
@@ -395,7 +397,23 @@
 			break;
 		case DEPARE:
-			Double depmax = 0.0;
-			if (((depmax = (Double) getAttVal(Obj.DEPARE, Att.DRVAL2)) != null) && (depmax <= 0.0)) {
-				Renderer.lineVector(new LineStyle(Symbols.Gdries));
+			Double depmax = (Double) getAttVal(Obj.DEPARE, Att.DRVAL2);
+			if (depmax != null) {
+				if (depmax <= 0.0) {
+					Renderer.lineVector(new LineStyle(Symbols.Gdries));
+				} else if (depmax <= 2.0) {
+					Renderer.lineVector(new LineStyle(Color.blue, 2, new Color(0x2090ff)));
+				} else if (depmax <= 5.0) {
+					Renderer.lineVector(new LineStyle(Color.blue, 2, new Color(0x40a0ff)));
+				} else if (depmax <= 10.0) {
+					Renderer.lineVector(new LineStyle(Color.blue, 2, new Color(0x60b0ff)));
+				} else if (depmax <= 15.0) {
+					Renderer.lineVector(new LineStyle(Color.blue, 2, new Color(0x80c0ff)));
+				} else if (depmax <= 20.0) {
+					Renderer.lineVector(new LineStyle(Color.blue, 2, new Color(0xa0d0ff)));
+				} else if (depmax <= 50.0) {
+					Renderer.lineVector(new LineStyle(Color.blue, 2, new Color(0xc0e0ff)));
+				} else {
+					Renderer.lineVector(new LineStyle(Color.blue, 2, new Color(0xe0f0ff)));
+				}
 			}
 			break;
@@ -547,7 +565,17 @@
 				Renderer.symbol(Areas.Plane, new Scheme(Symbols.Msymb));
 				Renderer.lineSymbols(Areas.Restricted, 0.5, Areas.LinePlane, null, 10, Symbols.Mline);
-			}
-			addName(15, new Font("Arial", Font.BOLD, 80), new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, -90)));
-			break;
+				addName(15, new Font("Arial", Font.BOLD, 80), new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, -90)));
+			}
+			break;
+		case CBLARE:
+			if (Renderer.zoom >= 12) {
+			Renderer.lineSymbols(Areas.Restricted, 1.0, Areas.Cable, null, 4, Symbols.Mline);
+			}
+			break;
+		case PIPARE:
+			if (Renderer.zoom >= 12) {
+			Renderer.lineSymbols(Areas.Restricted, 1.0, Areas.Pipeline, null, 4, Symbols.Mline);
+			break;
+			}
 		default:
 			break;
@@ -721,8 +749,11 @@
 				double depth = (double) getAttVal(Obj.SOUNDG, Att.VALSOU);
 				Color col = new Color(0x00ffffff, true);
-				if (depth > 0.0) col = Symbols.Bwater;
-				if (depth > 5.0) col = new Color(0xcde2f1);
-				if (depth > 20.0) col = new Color(0xe6eff8);
-				if (depth > 50.0) col = new Color(0xf3f8fc);
+				if (depth > 0.0) col =  new Color(0x2090ff);
+				if (depth > 2.0) col =  new Color(0x40a0ff);
+				if (depth > 5.0) col =  new Color(0x60b0ff);
+				if (depth > 10.0) col = new Color(0x80c0ff);
+				if (depth > 15.0) col = new Color(0xa0d0ff);
+				if (depth > 20.0) col = new Color(0xc0e0ff);
+				if (depth > 50.0) col = new Color(0xe0f0ff);
 				Renderer.rasterPixel(Math.toRadians(1.0/60.0/16.0), col);
 			} else if ((Renderer.zoom >= 14) && hasAttribute(Obj.SOUNDG, Att.VALSOU)) {
@@ -862,8 +893,14 @@
 		case ACHARE:
 			if (Renderer.zoom >= 12) {
+				ArrayList<CatACH> cats = (ArrayList<CatACH>) getAttList(Obj.ACHARE, Att.CATACH);
 				if (feature.geom.prim != Pflag.AREA) {
 					Renderer.symbol(Harbours.Anchorage, new Scheme(Color.black));
 				} else {
-					Renderer.symbol(Harbours.Anchorage, new Scheme(Symbols.Mline));
+					if (cats.contains(CatACH.ACH_SMCM)) {
+						Renderer.symbol(Buoys.Shapes.get(BoySHP.BOY_SPHR), new Scheme(Symbols.Msymb));
+			        	Renderer.symbol(Topmarks.TopMooring, Topmarks.BuoyDeltas.get(BoySHP.BOY_SPHR));
+					} else {
+						Renderer.symbol(Harbours.Anchorage, new Scheme(Symbols.Mline));
+					}
 					Renderer.lineSymbols(Areas.Restricted, 1.0, Areas.LineAnchor, null, 10, Symbols.Mline);
 				}
@@ -873,5 +910,4 @@
 					Renderer.labelText("Reserved", new Font("Arial", Font.PLAIN, 50), Symbols.Mline, new Delta(Handle.TC, AffineTransform.getTranslateInstance(0, 60)));
 				}
-				ArrayList<CatACH> cats = (ArrayList<CatACH>) getAttList(Obj.ACHARE, Att.CATACH);
 				int dy = (cats.size() - 1) * -30;
 				for (CatACH cat : cats) {
@@ -899,4 +935,10 @@
 					case ACH_SEAP:
 						Renderer.symbol(Areas.Seaplane, new Scheme(Symbols.Msymb), new Delta(Handle.RC, AffineTransform.getTranslateInstance(-60, dy)));
+						dy += 60;
+						break;
+					case ACH_SMCF:
+					case ACH_SMCM:
+						Renderer.labelText("Small", new Font("Arial", Font.PLAIN, 40), Symbols.Msymb, new Delta(Handle.RC, AffineTransform.getTranslateInstance(-60, dy)));
+						Renderer.labelText("Craft", new Font("Arial", Font.PLAIN, 40), Symbols.Msymb, new Delta(Handle.LC, AffineTransform.getTranslateInstance(60, dy)));
 						dy += 60;
 						break;
@@ -1117,11 +1159,11 @@
 				break;
 			case MOR_BUOY:
-			    if (Renderer.zoom >= 17) {
+			    if (Renderer.zoom >= 16) {
 			        BoySHP shape = (BoySHP) getAttEnum(feature.type, Att.BOYSHP);
 			        if (shape == BoySHP.BOY_UNKN) {
 			            shape = BoySHP.BOY_SPHR;
 			        }
-			        Renderer.symbol(Buoys.Shapes.get(shape), getScheme(feature.type));
-			        Renderer.symbol(Topmarks.TopMooring, Topmarks.BuoyDeltas.get(shape));
+			        Renderer.symbol(Buoys.Shapes.get(shape), (1.0 / (1.0 + (0.25 * (18 - Renderer.zoom)))), getScheme(feature.type));
+			        Renderer.symbol(Topmarks.TopMooring, (1.0 / (1.0 + (0.25 * (18 - Renderer.zoom)))), Topmarks.BuoyDeltas.get(shape));
 		            Signals.addSignals();
 		            addName(15, new Font("Arial", Font.BOLD, 40), new Delta(Handle.BL, AffineTransform.getTranslateInstance(60, -50)));
@@ -1235,4 +1277,10 @@
 				}
 			}
+			if (getAttEnum(feature.type, Att.CATOBS) == CatOBS.OBS_FLGD) {
+					Renderer.symbol(Areas.Foul, new Scheme(Color.black));
+					if (feature.geom.prim == Pflag.AREA) {
+					Renderer.lineSymbols(Areas.Dash, 1.0, Areas.LineFoul, null, 10, Color.black);
+				}
+			}
 		}
 		if ((Renderer.zoom >= 14) && (feature.type == Obj.UWTROC)) {
@@ -1246,4 +1294,5 @@
 			default:
 				Renderer.symbol(Areas.Rock);
+				break;
 			}
 		}
Index: applications/editors/josm/plugins/seachart/src/render/Signals.java
===================================================================
--- applications/editors/josm/plugins/seachart/src/render/Signals.java	(revision 35684)
+++ applications/editors/josm/plugins/seachart/src/render/Signals.java	(revision 35685)
@@ -603,5 +603,5 @@
             }
         } else {
-            if (Renderer.zoom >= 15) {
+            if ((Renderer.zoom >= 15) && (lights.get(0) != null)) {
                 AttMap atts = lights.get(0);
                 ArrayList<CatLIT> cats = new ArrayList<>();
Index: applications/editors/josm/plugins/seachart/src/symbols/Areas.java
===================================================================
--- applications/editors/josm/plugins/seachart/src/symbols/Areas.java	(revision 35684)
+++ applications/editors/josm/plugins/seachart/src/symbols/Areas.java	(revision 35685)
@@ -81,4 +81,24 @@
     }
 
+    public static final Symbol Dash = new Symbol();
+    static {
+        Dash.add(new Instr(Form.BBOX, new Rectangle2D.Double(-15, -30, 30, 30)));
+        Dash.add(new Instr(Form.STRK, new BasicStroke(4, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND)));
+        Dash.add(new Instr(Form.LINE, new Line2D.Double(0, 0, 0, -30)));
+    }
+
+    public static final Symbol Foul = new Symbol();
+    static {
+        Foul.add(new Instr(Form.BBOX, new Rectangle2D.Double(-30, -60, 60, 60)));
+        Foul.add(new Instr(Form.STRK, new BasicStroke(8, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND)));
+        Foul.add(new Instr(Form.FILL, Color.black));
+        Path2D.Double p = new Path2D.Double();
+        p.moveTo(0, -30); p.lineTo(-20, 30);
+        p.moveTo(20, -30); p.lineTo(0, 30);
+        p.moveTo(-20, -15); p.lineTo(30, -15);
+        p.moveTo(-30, 15); p.lineTo(20, 15);
+        Foul.add(new Instr(Form.PLIN, p));
+    }
+
     public static final Symbol LaneArrow = new Symbol();
     static {
@@ -95,4 +115,10 @@
         LineAnchor.add(new Instr(Form.BBOX, new Rectangle2D.Double(-30, -60, 60, 90)));
         LineAnchor.add(new Instr(Form.SYMB, new Symbols.SubSymbol(Harbours.Anchor, 0.5, 0, 0, null, new Delta(Handle.CC, AffineTransform.getRotateInstance(Math.toRadians(-90.0))))));
+    }
+
+    public static final Symbol LineFoul = new Symbol();
+    static {
+        LineFoul.add(new Instr(Form.BBOX, new Rectangle2D.Double(-30, -60, 60, 90)));
+        LineFoul.add(new Instr(Form.SYMB, new Symbols.SubSymbol(Foul, 0.5, 0, 0, null, new Delta(Handle.CC, AffineTransform.getRotateInstance(Math.toRadians(-90.0))))));
     }
 
