Index: applications/editors/josm/plugins/seachart/jicons/src/jicons/Jicons.java
===================================================================
--- applications/editors/josm/plugins/seachart/jicons/src/jicons/Jicons.java	(revision 32371)
+++ applications/editors/josm/plugins/seachart/jicons/src/jicons/Jicons.java	(revision 32380)
@@ -208,5 +208,5 @@
 
 		public RuleSet ruleset() {
-			return RuleSet.SEAMARK;
+			return RuleSet.ALL;
 		}
 	}
Index: applications/editors/josm/plugins/seachart/josmtos57/src/josmtos57/Josmtos57.java
===================================================================
--- applications/editors/josm/plugins/seachart/josmtos57/src/josmtos57/Josmtos57.java	(revision 32371)
+++ applications/editors/josm/plugins/seachart/josmtos57/src/josmtos57/Josmtos57.java	(revision 32380)
@@ -86,5 +86,5 @@
 			in = new BufferedReader(new FileReader(new File(args[0])));
 			try {
-				S57osm.OSMmap(in, map, true);
+				S57osm.OSMmap(in, map, false);
 			} catch (Exception e) {
 				System.err.println("Input data error");
Index: applications/editors/josm/plugins/seachart/src/render/Renderer.java
===================================================================
--- applications/editors/josm/plugins/seachart/src/render/Renderer.java	(revision 32371)
+++ applications/editors/josm/plugins/seachart/src/render/Renderer.java	(revision 32380)
@@ -391,5 +391,5 @@
 		if ((str == null) || (str.isEmpty())) str = " ";
     FontRenderContext frc = g2.getFontRenderContext();
-    GlyphVector gv = font.deriveFont((float)(font.getSize())).createGlyphVector(frc, str.equals(" ") ? "!" : str);
+    GlyphVector gv = font.deriveFont((float)(font.getSize())).createGlyphVector(frc, str.equals(" ") ? "M" : str);
     Rectangle2D bounds = gv.getVisualBounds();
     double width = bounds.getWidth();
@@ -485,68 +485,64 @@
 	}
 
-	public static void lineText(String str, Font font, Color colour, double offset, double dy) {
+	public static void lineText(String str, Font font, Color colour, double dy) {
 		if (!str.isEmpty()) {
 			g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
-	    g2.setPaint(colour);
-	    FontRenderContext frc = g2.getFontRenderContext();
-	    GlyphVector gv = font.deriveFont(font.getSize2D() * (float)sScale).createGlyphVector(frc, (" " + str));
-	    GeneralPath path = new GeneralPath();
-			Point2D prev = new Point2D.Double();
-			Point2D next = new Point2D.Double();
-			Point2D curr = new Point2D.Double();
-			Point2D succ = new Point2D.Double();
-			boolean piv = false;
-			double angle = 0;
-			int index = 0;
-			double gwidth = offset * (Rules.feature.geom.length * context.mile(Rules.feature) - gv.getLogicalBounds().getWidth()) + gv.getGlyphMetrics(0).getAdvance();
-			GeomIterator git = map.new GeomIterator(Rules.feature.geom);
-			while (git.hasComp()) {
-				git.nextComp();
-				boolean first = true;
-				while (git.hasEdge()) {
-					git.nextEdge();
-					while (git.hasNode()) {
-						Snode node = git.next();
-						if (node == null) continue;
-						prev = next;
-						next = context.getPoint(node);
-						angle = Math.atan2(next.getY() - prev.getY(), next.getX() - prev.getX());
-						piv = true;
-						if (first) {
-							curr = succ = next;
-							first = false;
-						} else {
-							while (curr.distance(next) >= gwidth) {
-								if (piv) {
-									double rem = gwidth;
-									double s = prev.distance(next);
-									double p = curr.distance(prev);
-									if ((s > 0) && (p > 0)) {
-										double n = curr.distance(next);
-										double theta = Math.acos((s * s + p * p - n * n) / 2 / s / p);
-										double phi = Math.asin(p / gwidth * Math.sin(theta));
-										rem = gwidth * Math.sin(Math.PI - theta - phi) / Math.sin(theta);
-									}
-									succ = new Point2D.Double(prev.getX() + (rem * Math.cos(angle)), prev.getY() + (rem * Math.sin(angle)));
-									piv = false;
+			g2.setPaint(colour);
+			FontRenderContext frc = g2.getFontRenderContext();
+			GlyphVector gv = font.deriveFont(font.getSize2D() * (float) sScale).createGlyphVector(frc, str);
+			double width = gv.getVisualBounds().getWidth();
+			double height = gv.getVisualBounds().getHeight();
+			double offset = (Rules.feature.geom.length * context.mile(Rules.feature) - width) / 2;
+			if (offset > 0) {
+				Point2D before = null;
+				Point2D after = null;
+				ArrayList<Point2D> between = new ArrayList<>();
+				Point2D prev = null;
+				Point2D next = null;
+				double length = 0;
+				double lb = 0;
+				double la = 0;
+				GeomIterator git = map.new GeomIterator(Rules.feature.geom);
+				if (git.hasComp()) {
+					git.nextComp();
+					while (git.hasEdge()) {
+						git.nextEdge();
+						while (git.hasNode()) {
+							Snode node = git.next();
+							if (node == null)
+								continue;
+							prev = next;
+							next = context.getPoint(node);
+							if (prev != null)
+								length += Math.sqrt(Math.pow((next.getX() - prev.getX()), 2) + Math.pow((next.getY() - prev.getY()), 2));
+							if (length < offset) {
+								before = next;
+								lb = la = length;
+							} else if (after == null) {
+								if (length > (offset + width)) {
+									after = next;
+									la = length;
+									break;
 								} else {
-									succ = new Point2D.Double(curr.getX() + (gwidth * Math.cos(angle)), curr.getY() + (gwidth * Math.sin(angle)));
-								}
-								Shape shape = gv.getGlyphOutline(index);
-								Point2D point = gv.getGlyphPosition(index);
-								AffineTransform at = AffineTransform.getTranslateInstance(curr.getX(), curr.getY());
-								at.rotate(Math.atan2((succ.getY() - curr.getY()), (succ.getX() - curr.getX())));
-								at.translate(-point.getX(), -point.getY() + (dy * sScale));
-								path.append(at.createTransformedShape(shape), false);
-								curr = succ;
-								if (++index < gv.getNumGlyphs()) {
-									gwidth = gv.getGlyphMetrics(index).getAdvance();
-								} else {
-									g2.fill(path);
-									return;
+									between.add(next);
 								}
 							}
 						}
+						if (after != null)
+							break;
 					}
+				}
+				if (after != null) {
+					double angle = Math.atan2((after.getY() - before.getY()), (after.getX() - before.getX()));
+					double rotate = Math.abs(angle) < (Math.PI / 2) ? angle : angle + Math.PI;
+					Point2D mid = new Point2D.Double((before.getX() + after.getX()) / 2, (before.getY() + after.getY()) / 2);
+					Point2D centre = context.getPoint(Rules.feature.geom.centre);
+					AffineTransform pos = AffineTransform.getTranslateInstance(-dy * Math.sin(rotate), dy * Math.cos(rotate));
+					pos.rotate(rotate);
+					pos.translate((mid.getX() - centre.getX()), (mid.getY() - centre.getY()));
+					Symbol label = new Symbol();
+					label.add(new Instr(Form.BBOX, new Rectangle2D.Double((-width / 2), (-height), width, height)));
+					label.add(new Instr(Form.TEXT, new Caption(str, font, colour, new Delta(Handle.BC))));
+					Symbols.drawSymbol(g2, label, sScale, centre.getX(), centre.getY(), null, new Delta(Handle.BC, pos));
 				}
 			}
@@ -580,7 +576,5 @@
 		}
 		if ((str != null) && (!str.isEmpty())) {
-			FontRenderContext frc = g2.getFontRenderContext();
 			Font font = new Font("Arial", Font.PLAIN, 40);
-			GlyphVector gv = font.deriveFont(font.getSize2D() * (float)sScale).createGlyphVector(frc, str);
 			double arc = (s2 > s1) ? (s2 - s1) : (s2 - s1 + 360);
 			double awidth = (Math.toRadians(arc) * radial);
@@ -589,11 +583,11 @@
 			radial += 30 * sScale;
 			AffineTransform at = AffineTransform.getTranslateInstance(-radial * Math.sin(phi) / sScale, radial * Math.cos(phi) / sScale);
-			if (gv.getLogicalBounds().getWidth() < awidth) {
+			if ((font.getSize() * sScale * str.length()) < awidth) {
 				at.rotate(Math.toRadians(mid + (hand ? 0 : 180)));
-				Renderer.labelText(str, font, Color.black, new Delta(Handle.CC, at));
-			} else if (gv.getLogicalBounds().getHeight() < awidth) {
+				labelText(str, font, Color.black, new Delta(Handle.CC, at));
+			} else if ((font.getSize() * sScale) < awidth) {
 				hand = (mid < 180);
 				at.rotate(Math.toRadians(mid + (hand ? -90 : 90)));
-				Renderer.labelText(str, font, Color.black, hand ? new Delta(Handle.RC, at) : new Delta(Handle.LC, at));
+				labelText(str, font, Color.black, hand ? new Delta(Handle.RC, at) : new Delta(Handle.LC, at));
 			}
 			if (dir != null) {
@@ -605,5 +599,5 @@
 				at = AffineTransform.getTranslateInstance(-radial * Math.sin(phi) / sScale, radial * Math.cos(phi) / sScale);
 				at.rotate(Math.toRadians(dir + (hand ? 90 : -90)));
-				Renderer.labelText(str, font, Color.black, hand ? new Delta(Handle.BR, at) : new Delta(Handle.BL, at));
+				labelText(str, font, Color.black, hand ? new Delta(Handle.BR, at) : new Delta(Handle.BL, at));
 			}
 		}
Index: applications/editors/josm/plugins/seachart/src/render/Rules.java
===================================================================
--- applications/editors/josm/plugins/seachart/src/render/Rules.java	(revision 32371)
+++ applications/editors/josm/plugins/seachart/src/render/Rules.java	(revision 32380)
@@ -215,4 +215,8 @@
 			if (testObject(Obj.ROADWY)) for (Feature f : objects) if (testFeature(f)) highways();
 			if (testObject(Obj.RAILWY)) for (Feature f : objects) if (testFeature(f)) highways();
+		}
+		if (Renderer.context.ruleset() == RuleSet.ALL) {
+			if (testObject(Obj.SOUNDG)) for (Feature f : objects) if (testFeature(f)) depths();
+			if (testObject(Obj.DEPCNT)) for (Feature f : objects) if (testFeature(f)) depths();
 		}
 		if (testObject(Obj.SLCONS)) for (Feature f : objects) if (testFeature(f)) shoreline();
@@ -388,5 +392,5 @@
 				if ((Renderer.zoom >= 10) && (name != null))
 					if (feature.geom.prim == Pflag.LINE) {
-						Renderer.lineText(name, new Font("Arial", Font.PLAIN, 150), Color.black, 0.5, -40);
+						Renderer.lineText(name, new Font("Arial", Font.PLAIN, 150), Color.black, -40);
 					} else {
 						Renderer.labelText(name, new Font("Arial", Font.PLAIN, 150), Color.black, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, -40)));
@@ -396,5 +400,5 @@
 				if ((Renderer.zoom >= 12) && (name != null))
 					if (feature.geom.prim == Pflag.LINE) {
-						Renderer.lineText(name, new Font("Arial", Font.PLAIN, 150), Color.black, 0.5, -40);
+						Renderer.lineText(name, new Font("Arial", Font.PLAIN, 150), Color.black, -40);
 					} else {
 						Renderer.labelText(name, new Font("Arial", Font.PLAIN, 150), Color.black, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, -40)));
@@ -411,6 +415,6 @@
 					} else if (feature.geom.prim == Pflag.LINE) {
 						if (name != null) {
-							Renderer.lineText(name, new Font("Arial", Font.ITALIC, 75), Color.black, 0.5, -40);
-							Renderer.lineText("(Shoal)", new Font("Arial", Font.PLAIN, 60), Color.black, 0.5, 0);
+							Renderer.lineText(name, new Font("Arial", Font.ITALIC, 75), Color.black, -40);
+							Renderer.lineText("(Shoal)", new Font("Arial", Font.PLAIN, 60), Color.black, 0);
 						}
 					} else {
@@ -503,4 +507,6 @@
 				}
 			}
+			if (hasObject(Obj.NOTMRK))
+				notices();
 			addName(15, new Font("Arial", Font.BOLD, 40), new Delta(Handle.BL, AffineTransform.getTranslateInstance(60, -50)));
 			Signals.addSignals();
@@ -608,4 +614,34 @@
 				Renderer.labelText(("Ch." + chn), new Font("Arial", Font.PLAIN, 50), Color.black, new Delta(Handle.TC, AffineTransform.getTranslateInstance(0,50)));
 			}
+		}
+	}
+	
+	private static void depths() {
+		switch (feature.type) {
+		case SOUNDG:
+			if ((Renderer.zoom >= 14) && hasAttribute(Obj.SOUNDG, Att.VALSOU)) {
+				double depth = (double)getAttVal(Obj.SOUNDG, Att.VALSOU);
+				String dstr = df.format(depth);
+				String tok[] = dstr.split("[-.]");
+				String ul = "";
+				String id = tok[0];
+				String dd = "";
+				if (tok[0].equals("")) {
+					for (int i = 0; i <  tok[1].length(); i++)
+						ul += "_";
+					id = tok[1];
+					dd = (tok.length == 3) ? tok[2] : "";
+				} else {
+					dd = (tok.length == 2) ? tok[1] : "";
+				}
+				Renderer.labelText(ul, new Font("Arial", Font.PLAIN, 30), Color.black, new Delta(Handle.RC, AffineTransform.getTranslateInstance(10,15)));
+				Renderer.labelText(id, new Font("Arial", Font.PLAIN, 30), Color.black, new Delta(Handle.RC, AffineTransform.getTranslateInstance(10,0)));
+				Renderer.labelText(dd, new Font("Arial", Font.PLAIN, 20), Color.black, new Delta(Handle.LC, AffineTransform.getTranslateInstance(15,10)));
+			}
+			break;
+		case DEPCNT:
+			break;
+		default:
+			break;
 		}
 	}
@@ -700,7 +736,7 @@
 		case ACHBRT:
 			if (Renderer.zoom >= 14) {
-				Renderer.symbol(Harbours.Anchorage, new Scheme(Symbols.Mline));
+				Renderer.symbol(Harbours.Anchor, new Scheme(Symbols.Msymb));
 				if (Renderer.zoom >= 15) {
-					Renderer.labelText(name == null ? "" : name, new Font("Arial", Font.PLAIN, 30), Symbols.Msymb, LabelStyle.RRCT, Symbols.Mline, Color.white, new Delta(Handle.BC));
+					Renderer.labelText(name == null ? "" : name, new Font("Arial", Font.PLAIN, 30), Symbols.Msymb, LabelStyle.RRCT, Symbols.Msymb, Color.white, new Delta(Handle.BC));
 				}
 			}
@@ -993,4 +1029,5 @@
 	}
 
+	@SuppressWarnings("unchecked")
 	private static void notices() {
 		if (Renderer.zoom >= 14) {
@@ -1002,5 +1039,9 @@
 			case BCNSAW:
 			case BCNSPP:
-				dy = 45.0;
+				if (testAttribute(Obj.TOPMAR, Att.TOPSHP, TopSHP.TOP_BORD) || testAttribute(Obj.DAYMAR, Att.TOPSHP, TopSHP.TOP_BORD)) {
+					dy = -100.0;
+				} else {
+					dy = -45.0;
+				}
 				break;
 			case NOTMRK:
@@ -1023,11 +1064,15 @@
 				int i = 0;
 				for (AttMap atts : objs.values()) {
-					if (atts.get(Att.MARSYS) != null) sys = (MarSYS)(getAttEnum(Obj.NOTMRK, Att.MARSYS));
-					if (atts.get(Att.BNKWTW) != null) bnk = (BnkWTW)(getAttEnum(Obj.NOTMRK, Att.BNKWTW));
+					if (atts.get(Att.MARSYS) != null) sys = ((ArrayList<MarSYS>)(atts.get(Att.MARSYS).val)).get(0);
+					if (atts.get(Att.BNKWTW) != null) bnk = ((ArrayList<BnkWTW>)(atts.get(Att.BNKWTW).val)).get(0);
 					CatNMK cat = CatNMK.NMK_UNKN;
-					if (atts.get(Att.CATNMK) != null) cat = (CatNMK)(getAttEnum(Obj.NOTMRK, Att.CATNMK));
+					if (atts.get(Att.CATNMK) != null) cat = ((ArrayList<CatNMK>)(atts.get(Att.CATNMK).val)).get(0);
 					Symbol sym = Notices.getNotice(cat, sys, bnk);
 					Scheme sch = Notices.getScheme(sys, bnk);
+					ArrayList<AddMRK> add = new ArrayList<>();
+					if (atts.get(Att.ADDMRK) != null) add = (ArrayList<AddMRK>)(atts.get(Att.ADDMRK).val);
 					Handle h = Handle.CC;
+					double ax = 0.0;
+					double ay = 0.0;
 					switch (i) {
 					case 0:
@@ -1035,8 +1080,12 @@
 						break;
 					case 1:
-						if (n <= 3)
+						if (n <= 3) {
 							h = Handle.RC;
-						else
+							ax = -30;
+							ay = dy;
+						}
+						else {
 							h = Handle.BR;
+						}
 						break;
 					case 2:
@@ -1056,5 +1105,8 @@
 						break;
 					}
-					if (h != null) Renderer.symbol(sym, sch, new Delta(h, AffineTransform.getTranslateInstance(dx, dy)));
+					if (h != null) {
+						Renderer.symbol(sym, sch, new Delta(h, AffineTransform.getTranslateInstance(dx, dy)));
+						if (!add.isEmpty()) Renderer.symbol(Notices.NoticeBoard, new Delta(Handle.BC, AffineTransform.getTranslateInstance(ax, ay - 30)));
+					}
 					i++;
 				}
@@ -1069,5 +1121,5 @@
 				Renderer.lineVector(new LineStyle(Color.black, 5, new float[] { 20, 20 }, null));
 				if (Renderer.zoom >= 15) {
-					Renderer.lineText("Boom", new Font("Arial", Font.PLAIN, 80), Color.black, 0.5, -20);
+					Renderer.lineText("Boom", new Font("Arial", Font.PLAIN, 80), Color.black, -20);
 				}
 			default:
@@ -1186,10 +1238,10 @@
 						Renderer.lineVector(new LineStyle(Color.black, 10, new float[] { 40, 40 }, null));
 						if (Renderer.zoom >= 15)
-							Renderer.lineText("(covers)", new Font("Arial", Font.PLAIN, 60), Color.black, 0.5, 80);
+							Renderer.lineText("(covers)", new Font("Arial", Font.PLAIN, 60), Color.black, 80);
 					} else {
 						Renderer.lineVector(new LineStyle(Color.black, 10, null, null));
 					}
 					if (Renderer.zoom >= 15)
-						Renderer.lineText("Training Wall", new Font("Arial", Font.PLAIN, 60), Color.black, 0.5, -30);
+						Renderer.lineText("Training Wall", new Font("Arial", Font.PLAIN, 60), Color.black, -30);
 					break;
 				case SLC_SWAY:
@@ -1333,5 +1385,5 @@
 				str += df.format(ort) + "º";
 				if (!str.isEmpty())
-					Renderer.lineText(str, new Font("Arial", Font.PLAIN, 80), Color.black, 0.5, -20);
+					Renderer.lineText(str, new Font("Arial", Font.PLAIN, 80), Color.black, -20);
 			}
 		}
Index: applications/editors/josm/plugins/seachart/src/s57/S57dat.java
===================================================================
--- applications/editors/josm/plugins/seachart/src/s57/S57dat.java	(revision 32371)
+++ applications/editors/josm/plugins/seachart/src/s57/S57dat.java	(revision 32380)
@@ -224,5 +224,5 @@
 		} else {
 			int f = Math.abs(conv.bin);
-			if (f < 8) {
+			if (f < 5) {
 				long val = buffer[offset + --f];
 				if (conv.bin > 0)
@@ -253,10 +253,27 @@
 				return val;
 			} else {
-				f /= 8;
-				long val = 0;
-				for (int i = 0; i < f; i++) {
+				if (f == 5) {
+					long val = buffer[offset++] & 0xff;
+					f--;
+					while (f > 0) {
+						val = (val << 8) + (buffer[offset + --f] & 0xff);
+					}
+					offset += 4;
+					return val;
+				} else {
+					long val = buffer[offset++] & 0xff;
 					val = (val << 8) + (buffer[offset++] & 0xff);
-				}
-				return val;
+					f = 4;
+					while (f > 0) {
+						val = (val << 8) + (buffer[offset + --f] & 0xff);
+					}
+					offset += 4;
+					f = 2;
+					while (f > 0) {
+						val = (val << 8) + (buffer[offset + --f] & 0xff);
+					}
+					offset += 2;
+					return val;
+				}
 			}
 		}
Index: applications/editors/josm/plugins/seachart/src/s57/S57dec.java
===================================================================
--- applications/editors/josm/plugins/seachart/src/s57/S57dec.java	(revision 32371)
+++ applications/editors/josm/plugins/seachart/src/s57/S57dec.java	(revision 32380)
@@ -21,4 +21,5 @@
 		S57dat.rnum = 0;
 		byte[] leader = new byte[24];
+		byte[] record = new byte[0];
 		boolean ddr = false;
 		int length = 0;
@@ -40,4 +41,5 @@
 			try {
 			length = Integer.parseInt(new String(leader, 0, 5)) - 24;
+			record = new byte[length];
 			ddr = (leader[6] == 'L');
 			fields = Integer.parseInt(new String(leader, 12, 5)) - 24;
@@ -50,5 +52,4 @@
 			mapts = leader[23] - '0';
 			entry = mapfl + mapfp + mapts;
-			byte[] record = new byte[length];
 			if (in.read(record) != length)
 				break;
@@ -61,9 +62,9 @@
 					case "0001":
 						int i8rn = ((Long) S57dat.decSubf(record, fields + pos, S57field.I8RI, S57subf.I8RN)).intValue();
-						if (i8rn != ++S57dat.rnum) {
-							System.err.println("Out of order record ID");
-							in.close();
-							System.exit(-1);
-						}
+//						if (i8rn != ++S57dat.rnum) {
+//							System.err.println("Out of order record ID");
+//							in.close();
+//							System.exit(-1);
+//						}
 						break;
 					case "DSSI":
@@ -93,5 +94,5 @@
 						break;
 					case "FOID":
-						name = (Long) S57dat.decSubf(record, fields + pos, S57field.LNAM, S57subf.LNAM);
+						name = (long) S57dat.decSubf(record, fields + pos, S57field.LNAM, S57subf.LNAM);
 						map.newFeature(name, pflag, objl);
 						break;
@@ -109,8 +110,8 @@
 						S57dat.setField(record, fields + pos, S57field.FFPT, len);
 						do {
-							name = (Long) S57dat.decSubf(S57subf.LNAM);
+							name = (long) S57dat.decSubf(S57subf.LNAM);
 							int rind = ((Long) S57dat.decSubf(S57subf.RIND)).intValue();
 							S57dat.decSubf(S57subf.COMT);
-							map.newObj(name, rind);
+							map.refObj(name, rind);
 						} while (S57dat.more());
 						break;
@@ -118,5 +119,5 @@
 						S57dat.setField(record, fields + pos, S57field.FSPT, len);
 						do {
-							name = (Long) S57dat.decSubf(S57subf.NAME) << 16;
+							name = (long) S57dat.decSubf(S57subf.NAME) << 16;
 							map.newPrim(name, (Long) S57dat.decSubf(S57subf.ORNT), (Long) S57dat.decSubf(S57subf.USAG));
 							S57dat.decSubf(S57subf.MASK);
@@ -138,5 +139,5 @@
 						}
 						name <<= 32;
-						name += (Long) S57dat.decSubf(S57subf.RCID);
+						name += (long) S57dat.decSubf(S57subf.RCID);
 						name <<= 16;
 						if (nflag == Nflag.ANON) {
Index: applications/editors/josm/plugins/seachart/src/s57/S57map.java
===================================================================
--- applications/editors/josm/plugins/seachart/src/s57/S57map.java	(revision 32371)
+++ applications/editors/josm/plugins/seachart/src/s57/S57map.java	(revision 32380)
@@ -273,5 +273,5 @@
 	}
 	
-	public void newObj(long id, int rind) {
+	public void refObj(long id, int rind) {
 		Rflag r = Rflag.UNKN;
 		switch (rind) {
Index: applications/editors/josm/plugins/seachart/src/s57/S57val.java
===================================================================
--- applications/editors/josm/plugins/seachart/src/s57/S57val.java	(revision 32371)
+++ applications/editors/josm/plugins/seachart/src/s57/S57val.java	(revision 32380)
@@ -812,5 +812,5 @@
   Catnmk.put(CatNMK.NMK_WEIR, new S57enum(52, "weir")); Catnmk.put(CatNMK.NMK_FERN, new S57enum(53, "ferry_non_independent"));  Catnmk.put(CatNMK.NMK_FERI, new S57enum(54, "ferry_independent"));
   Catnmk.put(CatNMK.NMK_BRTP, new S57enum(55, "berthing_permitted")); Catnmk.put(CatNMK.NMK_BTLL, new S57enum(56, "berthing_lateral_limit")); Catnmk.put(CatNMK.NMK_BTLS, new S57enum(57, "berthing_lateral_limits"));
-   Catnmk.put(CatNMK.NMK_BTRL, new S57enum(58, "berthing_rafting_limit"));  Catnmk.put(CatNMK.NMK_BTUP, new S57enum(59, "berthing_unmarked_pushing"));
+   Catnmk.put(CatNMK.NMK_BTRL, new S57enum(58, "berth_rafting_limit"));  Catnmk.put(CatNMK.NMK_BTUP, new S57enum(59, "berthing_unmarked_pushing"));
    Catnmk.put(CatNMK.NMK_BTP1, new S57enum(60, "berthing_marked_pushing_1")); Catnmk.put(CatNMK.NMK_BTP2, new S57enum(61, "berthing_marked_pushing_2"));
    Catnmk.put(CatNMK.NMK_BTP3, new S57enum(62, "berthing_marked_pushing_3")); Catnmk.put(CatNMK.NMK_BTUN, new S57enum(63, "berthing_unmarked_non-pushing"));
Index: applications/editors/josm/plugins/seachart/src/symbols/Notices.java
===================================================================
--- applications/editors/josm/plugins/seachart/src/symbols/Notices.java	(revision 32371)
+++ applications/editors/josm/plugins/seachart/src/symbols/Notices.java	(revision 32380)
@@ -1037,4 +1037,25 @@
 		NoticeE24.add(new Instr(Form.SYMB, new Symbols.SubSymbol(Notices.NoticeE, 1.0, 0, 0, null, null)));
 		NoticeE24.add(new Instr(Form.SYMB, new Symbols.SubSymbol(Notices.Waterbike, 1.0, 0, 0, new Scheme(Color.white), null)));
+	}
+
+	public static final Symbol NoticeBoard = new Symbol();
+	static {
+		NoticeBoard.add(new Instr(Form.BBOX, new Rectangle2D.Double(-30,-30,60,30)));
+		NoticeBoard.add(new Instr(Form.STRK, new BasicStroke(2, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)));
+		Path2D.Double p = new Path2D.Double(); p.moveTo(-20,0); p.lineTo(20,0); p.lineTo(20,-15); p.lineTo(-20,-15); p.closePath();
+		NoticeBoard.add(new Instr(Form.FILL, Color.white));
+		NoticeBoard.add(new Instr(Form.PGON, p));
+		NoticeBoard.add(new Instr(Form.FILL, Color.black));
+		NoticeBoard.add(new Instr(Form.PLIN, p));
+	}
+	public static final Symbol NoticeTriangle = new Symbol();
+	static {
+		NoticeTriangle.add(new Instr(Form.BBOX, new Rectangle2D.Double(-30,-30,60,30)));
+		NoticeTriangle.add(new Instr(Form.STRK, new BasicStroke(2, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)));
+		Path2D.Double p = new Path2D.Double(); p.moveTo(-20,0); p.lineTo(20,0); p.lineTo(0,-15); p.closePath();
+		NoticeTriangle.add(new Instr(Form.FILL, Color.white));
+		NoticeTriangle.add(new Instr(Form.PGON, p));
+		NoticeTriangle.add(new Instr(Form.FILL, Color.black));
+		NoticeTriangle.add(new Instr(Form.PLIN, p));
 	}
 
Index: applications/editors/josm/plugins/seachart/src/symbols/Symbols.java
===================================================================
--- applications/editors/josm/plugins/seachart/src/symbols/Symbols.java	(revision 32371)
+++ applications/editors/josm/plugins/seachart/src/symbols/Symbols.java	(revision 32380)
@@ -21,5 +21,6 @@
 
 	public static final Color Yland = new Color(0xedbc0c);
-	public static final Color Bwater = new Color(0x78acd2);
+//	public static final Color Bwater = new Color(0x78acd2);
+	public static final Color Bwater = new Color(0x9bc5e3);
 	public static final Color Gdries = new Color(0x689868);
 	public static final Color Mline = new Color(0x9a6078);
Index: applications/editors/josm/plugins/seachart/src/symbols/Topmarks.java
===================================================================
--- applications/editors/josm/plugins/seachart/src/symbols/Topmarks.java	(revision 32371)
+++ applications/editors/josm/plugins/seachart/src/symbols/Topmarks.java	(revision 32380)
@@ -47,12 +47,23 @@
 	public static final Symbol TopBoard = new Symbol();
 	static {
-		TopBoard.add(new Instr(Form.BBOX, new Rectangle2D.Double(-20,-80,40,80)));
-		Symbol colours = new Symbol();
-		Path2D.Double p = new Path2D.Double(); p.moveTo(-19.0,-2.0); p.lineTo(-19.0,-39.0); p.lineTo(19.0,-39.0); p.lineTo(19.0,-2.0); p.closePath();
-		colours.add(new Instr(Form.P1, p));
+		TopBoard.add(new Instr(Form.BBOX, new Rectangle2D.Double(-30,-60,60,60)));
+		Symbol colours = new Symbol();
+		Path2D.Double p = new Path2D.Double(); p.moveTo(-29,-1); p.lineTo(-29,-59); p.lineTo(29,-59); p.lineTo(29,-1); p.closePath();
+		colours.add(new Instr(Form.P1, p));
+		p = new Path2D.Double(); p.setWindingRule(GeneralPath.WIND_EVEN_ODD);
+		p.moveTo(-29,-1); p.lineTo(-29,-59); p.lineTo(29,-59); p.lineTo(29,-1); p.closePath();
+		p.moveTo(-19,-10); p.lineTo(-19,-49); p.lineTo(19,-49); p.lineTo(19,-10); p.closePath();
+		colours.add(new Instr(Form.B1, p));
+		p = new Path2D.Double(); p.setWindingRule(GeneralPath.WIND_EVEN_ODD);
+		p.moveTo(-29,-1); p.lineTo(-29,-30); p.lineTo(29,-30); p.lineTo(29,-59); p.lineTo(0,-59); p.lineTo(0,-1); p.closePath();
+		colours.add(new Instr(Form.S2, p));
+		p = new Path2D.Double(); p.moveTo(-29,-1); p.lineTo(-29,-30); p.lineTo(0,-30); p.lineTo(0,-1); p.closePath();
+		colours.add(new Instr(Form.S3, p));
+		p = new Path2D.Double(); p.moveTo(0,-1); p.lineTo(0,-30); p.lineTo(29,-30); p.lineTo(29,-1); p.closePath();
+		colours.add(new Instr(Form.S4, p));
 		TopBoard.add(new Instr(Form.COLR, colours));
 		TopBoard.add(new Instr(Form.STRK, new BasicStroke(2, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)));
 		TopBoard.add(new Instr(Form.FILL, Color.black));
-		p = new Path2D.Double(); p.moveTo(-19.0,-2.0); p.lineTo(-19.0,-39.0); p.lineTo(19.0,-39.0); p.lineTo(19.0,-2.0); p.closePath();
+		p = new Path2D.Double(); p.moveTo(-29,-1); p.lineTo(-29,-59); p.lineTo(29,-59); p.lineTo(29.0,-1); p.closePath();
 		TopBoard.add(new Instr(Form.PLIN, p));
 	}
@@ -70,4 +81,7 @@
 		TopCan.add(new Instr(Form.PLIN, p));
 	}
+	public static final Symbol TopCanSphere = new Symbol();
+	public static final Symbol TopCircle = new Symbol();
+	public static final Symbol TopCircleTriangle = new Symbol();
 	public static final Symbol TopCone = new Symbol();
 	static {
@@ -82,4 +96,20 @@
 		p = new Path2D.Double(); p.moveTo(-15.0,-15.0); p.lineTo(0.0,-45.0); p.lineTo(15.0,-15.0); p.closePath();
 		TopCone.add(new Instr(Form.PLIN, p));
+	}
+	public static final Symbol TopConeSphere = new Symbol();
+	static {
+		TopConeSphere.add(new Instr(Form.BBOX, new Rectangle2D.Double(-20,-80,40,80)));
+		Symbol colours = new Symbol();
+		Path2D.Double p = new Path2D.Double(); p.moveTo(-15.0,-47.0); p.lineTo(0.0,-77.0); p.lineTo(15.0,-47.0); p.closePath();
+		p.moveTo(-14.0,-28.0); p.curveTo(-14.0,-46.7,14.0,-46.7,14.0,-28.0); p.curveTo(14.0,-9.3,-14.0,-9.3,-14.0,-28.0); p.closePath();
+		colours.add(new Instr(Form.P1, p));
+		TopConeSphere.add(new Instr(Form.COLR, colours));
+		TopConeSphere.add(new Instr(Form.STRK, new BasicStroke(4, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)));
+		TopConeSphere.add(new Instr(Form.FILL, Color.black));
+		TopConeSphere.add(new Instr(Form.LINE, new Line2D.Double(0,0,0,-15)));
+		TopConeSphere.add(new Instr(Form.LINE, new Line2D.Double(0,-42,0,-47)));
+		p = new Path2D.Double(); p.moveTo(-15.0,-47.0); p.lineTo(0.0,-77.0); p.lineTo(15.0,-47.0); p.closePath();
+		TopConeSphere.add(new Instr(Form.ELPS, new Ellipse2D.Double(-14,-42,28,28)));
+		TopConeSphere.add(new Instr(Form.PLIN, p));
 	}
 	public static final Symbol TopCross = new Symbol();
@@ -98,4 +128,26 @@
 		p.lineTo(5.0,-60.0); p.lineTo(5.0,-42.5); p.lineTo(22.5,-42.5); p.lineTo(22.5,-32.5); p.lineTo(5.0,-32.5); p.lineTo(5.0,-15.0); p.closePath();
 		TopCross.add(new Instr(Form.PLIN, p));
+	}
+	public static final Symbol TopCrosses = new Symbol();
+	static {
+		
+	}
+	public static final Symbol TopCrossCircle = new Symbol();
+	static {
+		
+	}
+	public static final Symbol TopCube = new Symbol();
+	static {
+		TopCube.add(new Instr(Form.BBOX, new Rectangle2D.Double(-20,-80,40,80)));
+		Symbol colours = new Symbol();
+		Path2D.Double p = new Path2D.Double(); p.moveTo(0,-48); p.lineTo(-15,-37); p.lineTo(-15,-20); p.lineTo(0,-9); p.lineTo(15,-20); p.lineTo(15,-37); p.closePath();
+		colours.add(new Instr(Form.P1, p));
+		TopCube.add(new Instr(Form.COLR, colours));
+		TopCube.add(new Instr(Form.STRK, new BasicStroke(4, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)));
+		TopCube.add(new Instr(Form.FILL, Color.black));
+		TopCube.add(new Instr(Form.LINE, new Line2D.Double(0,0,0,-15)));
+		p = new Path2D.Double(); p.moveTo(0,-48); p.lineTo(-14,-37); p.lineTo(0,-26); p.lineTo(14,-37); p.closePath(); p.moveTo(0,-26); p.lineTo(0,0);
+		p.moveTo(-15,-37); p.lineTo(-15,-20); p.lineTo(0,-9); p.lineTo(15,-20); p.lineTo(15,-37);
+		TopCube.add(new Instr(Form.PLIN, p));
 	}
 	public static final Symbol TopEast = new Symbol();
@@ -256,4 +308,28 @@
 		TopSquare.add(new Instr(Form.PLIN, p));
 	}
+	public static final Symbol TopRectangleH = new Symbol();
+	static {
+		TopRectangleH.add(new Instr(Form.BBOX, new Rectangle2D.Double(-20,-80,40,80)));
+		Symbol colours = new Symbol();
+		Path2D.Double p = new Path2D.Double(); p.moveTo(-20.0,-1.0); p.lineTo(-20.0,-27.0); p.lineTo(20.0,-27.0); p.lineTo(20.0,-1.0); p.closePath();
+		colours.add(new Instr(Form.P1, p));
+		TopRectangleH.add(new Instr(Form.COLR, colours));
+		TopRectangleH.add(new Instr(Form.STRK, new BasicStroke(2, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)));
+		TopRectangleH.add(new Instr(Form.FILL, Color.black));
+		p = new Path2D.Double(); p.moveTo(-20.0,-1.0); p.lineTo(-20.0,-27.0); p.lineTo(20.0,-27.0); p.lineTo(20.0,-1.0); p.closePath();
+		TopRectangleH.add(new Instr(Form.PLIN, p));
+	}
+	public static final Symbol TopRectangleV = new Symbol();
+	static {
+		TopRectangleV.add(new Instr(Form.BBOX, new Rectangle2D.Double(-20,-80,40,80)));
+		Symbol colours = new Symbol();
+		Path2D.Double p = new Path2D.Double(); p.moveTo(-13.0,-1.0); p.lineTo(-13.0,-41.0); p.lineTo(13.0,-41.0); p.lineTo(13.0,-1.0); p.closePath();
+		colours.add(new Instr(Form.P1, p));
+		TopRectangleV.add(new Instr(Form.COLR, colours));
+		TopRectangleV.add(new Instr(Form.STRK, new BasicStroke(2, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)));
+		TopRectangleV.add(new Instr(Form.FILL, Color.black));
+		p = new Path2D.Double(); p.moveTo(-13.0,-1.0); p.lineTo(-13.0,-41.0); p.lineTo(13.0,-41.0); p.lineTo(13.0,-1.0); p.closePath();
+		TopRectangleV.add(new Instr(Form.PLIN, p));
+	}
 	public static final Symbol TopRhombus = new Symbol();
 	static {
@@ -280,4 +356,49 @@
 		TopRhombus.add(new Instr(Form.PLIN, p));
 	}
+	public static final Symbol TopRhombusCircle = new Symbol();
+	static {
+		
+	}
+	public static final Symbol TopSphereRhombus = new Symbol();
+	static {
+		TopSphereRhombus.add(new Instr(Form.BBOX, new Rectangle2D.Double(-30,-80,60,80)));
+		TopSphereRhombus.add(new Instr(Form.SYMB, new Symbols.SubSymbol(TopRhombus, 1.0, 0, 0, null, null)));
+		Symbol colours = new Symbol();
+		Path2D.Double p = new Path2D.Double(); p.moveTo(-14.0,-44.0); p.curveTo(-14.0,-62.7,14.0,-62.7,14.0,-44.0); p.curveTo(14.0,-25.3,-14.0,-25.3,-14.0,-44.0); p.closePath();
+		colours.add(new Instr(Form.P1, p));
+		TopSphereRhombus.add(new Instr(Form.COLR, colours));
+		TopSphereRhombus.add(new Instr(Form.STRK, new BasicStroke(4, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)));
+		TopSphereRhombus.add(new Instr(Form.FILL, Color.black));
+		TopSphereRhombus.add(new Instr(Form.STRK, new BasicStroke(2, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)));
+		TopSphereRhombus.add(new Instr(Form.ELPS, new Ellipse2D.Double(-14,-58,28,28)));
+	}
+	public static final Symbol TopT = new Symbol();
+	static {
+		
+	}
+	public static final Symbol TopTrapeziumU = new Symbol();
+	static {
+		TopTrapeziumU.add(new Instr(Form.BBOX, new Rectangle2D.Double(-20,-80,40,80)));
+		Symbol colours = new Symbol();
+		Path2D.Double p = new Path2D.Double(); p.moveTo(-20.0,-1.0); p.lineTo(-13.0,-27.0); p.lineTo(13.0,-27.0); p.lineTo(20.0,-1.0); p.closePath();
+		colours.add(new Instr(Form.P1, p));
+		TopTrapeziumU.add(new Instr(Form.COLR, colours));
+		TopTrapeziumU.add(new Instr(Form.STRK, new BasicStroke(2, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)));
+		TopTrapeziumU.add(new Instr(Form.FILL, Color.black));
+		p = new Path2D.Double(); p.moveTo(-20.0,-1.0); p.lineTo(-13.0,-27.0); p.lineTo(13.0,-27.0); p.lineTo(20.0,-1.0); p.closePath();
+		TopTrapeziumU.add(new Instr(Form.PLIN, p));
+	}
+	public static final Symbol TopTrapeziumD = new Symbol();
+	static {
+		TopTrapeziumD.add(new Instr(Form.BBOX, new Rectangle2D.Double(-20,-80,40,80)));
+		Symbol colours = new Symbol();
+		Path2D.Double p = new Path2D.Double(); p.moveTo(-13.0,-1.0); p.lineTo(-20.0,-27.0); p.lineTo(20.0,-27.0); p.lineTo(13.0,-1.0); p.closePath();
+		colours.add(new Instr(Form.P1, p));
+		TopTrapeziumD.add(new Instr(Form.COLR, colours));
+		TopTrapeziumD.add(new Instr(Form.STRK, new BasicStroke(2, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)));
+		TopTrapeziumD.add(new Instr(Form.FILL, Color.black));
+		p = new Path2D.Double(); p.moveTo(-13.0,-1.0); p.lineTo(-20.0,-27.0); p.lineTo(20.0,-27.0); p.lineTo(13.0,-1.0); p.closePath();
+		TopTrapeziumD.add(new Instr(Form.PLIN, p));
+	}
 	public static final Symbol TopTriangle = new Symbol();
 	static {
@@ -311,4 +432,8 @@
 		p = new Path2D.Double(); p.moveTo(-15.0,-29.0); p.lineTo(0.0,-1.0); p.lineTo(15.0,-29.0); p.closePath();
 		TopItriangle.add(new Instr(Form.PLIN, p));
+	}
+	public static final Symbol TopTriangleCircle = new Symbol();
+	static {
+		
 	}
 	public static final Symbol TopWest = new Symbol();
@@ -345,4 +470,8 @@
 		TopX.add(new Instr(Form.PLIN, p));
 	}
+	public static final Symbol TopOther = new Symbol();
+	static {
+		
+	}
 	
 	public static final EnumMap<TopSHP, Symbol> Shapes = new EnumMap<TopSHP, Symbol>(TopSHP.class);
@@ -352,9 +481,12 @@
 		Shapes.put(TopSHP.TOP_ISD, TopIsol); Shapes.put(TopSHP.TOP_NORTH, TopNorth); Shapes.put(TopSHP.TOP_SOUTH, TopSouth); Shapes.put(TopSHP.TOP_SPHR, TopSphere);
 		Shapes.put(TopSHP.TOP_SQUR, TopSquare); Shapes.put(TopSHP.TOP_TRI, TopTriangle); Shapes.put(TopSHP.TOP_ITRI, TopItriangle); Shapes.put(TopSHP.TOP_WEST, TopWest);
-		Shapes.put(TopSHP.TOP_SALT, TopX); Shapes.put(TopSHP.TOP_RHOM, TopRhombus); Shapes.put(TopSHP.TOP_FLAG, TopFlag);
-	}
-	/*
-	 TOP_CUBE, TOP_SPRH, TOP_HRECT, TOP_VRECT, TOP_TRAP, TOP_ITRAP, TOP_CIRC, TOP_CRSS, TOP_T, TOP_TRCL, TOP_CRCL, TOP_RHCL, TOP_CLTR, TOP_OTHR, TOP_CYSP, TOP_COSP
-	 */
+		Shapes.put(TopSHP.TOP_SALT, TopX); Shapes.put(TopSHP.TOP_RHOM, TopRhombus); Shapes.put(TopSHP.TOP_FLAG, TopFlag); Shapes.put(TopSHP.TOP_CUBE, TopCube);
+		Shapes.put(TopSHP.TOP_SPRH, TopSphereRhombus); Shapes.put(TopSHP.TOP_HRECT, TopRectangleH); Shapes.put(TopSHP.TOP_VRECT, TopRectangleV);
+		Shapes.put(TopSHP.TOP_TRAP, TopTrapeziumU); Shapes.put(TopSHP.TOP_ITRAP, TopTrapeziumD); Shapes.put(TopSHP.TOP_COSP, TopConeSphere);
+		Shapes.put(TopSHP.TOP_CIRC, TopCircle); Shapes.put(TopSHP.TOP_CRSS, TopCrosses); Shapes.put(TopSHP.TOP_T, TopT); Shapes.put(TopSHP.TOP_TRCL, TopTriangleCircle);
+		Shapes.put(TopSHP.TOP_CRCL, TopCrossCircle); Shapes.put(TopSHP.TOP_RHCL, TopRhombusCircle); Shapes.put(TopSHP.TOP_CLTR, TopCircleTriangle);
+		Shapes.put(TopSHP.TOP_CYSP, TopCanSphere); Shapes.put(TopSHP.TOP_OTHR, TopOther);
+	}
+
 	public static final EnumMap<BoySHP, Delta> BuoyDeltas = new EnumMap<BoySHP, Delta>(BoySHP.class);
 	static {
