Index: applications/editors/josm/plugins/seachart/src/render/Renderer.java
===================================================================
--- applications/editors/josm/plugins/seachart/src/render/Renderer.java	(revision 32100)
+++ applications/editors/josm/plugins/seachart/src/render/Renderer.java	(revision 32101)
@@ -345,8 +345,14 @@
 			while (git.hasComp()) {
 				git.nextComp();
+				boolean newComp = true;
 				while (git.hasEdge()) {
 					git.nextEdge();
 					point = context.getPoint(git.next());
-					p.moveTo(point.getX(), point.getY());
+					if (newComp) {
+						p.moveTo(point.getX(), point.getY());
+						newComp = false;
+					} else {
+						p.lineTo(point.getX(), point.getY());
+					}
 					while (git.hasNode()) {
 						Snode node = git.next();
@@ -357,5 +363,5 @@
 				}
 			}
-	    g2.setPaint(new TexturePaint(image, new Rectangle(0, 0, 1 + (int)(100 * sScale), 1 + (int)(100 * sScale))));
+	    g2.setPaint(new TexturePaint(image, new Rectangle(0, 0, 1 + (int)(300 * sScale), 1 + (int)(300 * sScale))));
 	    g2.fill(p);
 	    break;
Index: applications/editors/josm/plugins/seachart/src/render/Rules.java
===================================================================
--- applications/editors/josm/plugins/seachart/src/render/Rules.java	(revision 32100)
+++ applications/editors/josm/plugins/seachart/src/render/Rules.java	(revision 32101)
@@ -230,4 +230,5 @@
 			if (testObject(Obj.ISTZNE)) for (Feature f : objects) if (testFeature(f)) separation();
 			if (testObject(Obj.SNDWAV)) for (Feature f : objects) if (testFeature(f)) areas();
+			if (testObject(Obj.WEDKLP)) for (Feature f : objects) if (testFeature(f)) areas();
 			if (testObject(Obj.OSPARE)) for (Feature f : objects) if (testFeature(f)) areas();
 			if (testObject(Obj.FAIRWY)) for (Feature f : objects) if (testFeature(f)) areas();
@@ -256,5 +257,8 @@
 			if (testObject(Obj.SMCFAC)) for (Feature f : objects) if (testFeature(f)) marinas();
 			if (testObject(Obj.BRIDGE)) for (Feature f : objects) if (testFeature(f)) bridges();
-			if (testObject(Obj.PILPNT)) for (Feature f : objects) if (testFeature(f)) lights();
+			if (testObject(Obj.PILPNT)) for (Feature f : objects) if (testFeature(f)) points();
+			if (testObject(Obj.TOPMAR)) for (Feature f : objects) if (testFeature(f)) points();
+			if (testObject(Obj.DAYMAR)) for (Feature f : objects) if (testFeature(f)) points();
+			if (testObject(Obj.FOGSIG)) for (Feature f : objects) if (testFeature(f)) points();
 			if (testObject(Obj.RDOCAL)) for (Feature f : objects) if (testFeature(f)) callpoint();
 			if (testObject(Obj.LITMIN)) for (Feature f : objects) if (testFeature(f)) lights();
@@ -429,4 +433,19 @@
 			if (Renderer.zoom >= 12) Renderer.fillPattern(Areas.Sandwaves);
 			break;
+		case WEDKLP:
+			if (Renderer.zoom >= 12) {
+				switch ((CatWED) getAttEnum(feature.type, Att.CATWED)) {
+				case WED_KELP:
+					if (feature.geom.prim == Pflag.AREA) { 
+						Renderer.fillPattern(Areas.KelpA);
+					} else {
+						Renderer.symbol(Areas.KelpS);
+					}
+					break;
+				default:
+					break;
+				}
+			}
+			break;
 		case SPLARE:
 			if (Renderer.zoom >= 12) {
@@ -605,5 +624,5 @@
 					String str = "";
 					if (atts.containsKey(Att.HUNITS)) {
-						switch ((UniHLU) atts.get(Att.HUNITS).val) {
+						switch ((UniHLU) getAttEnum(Obj.DISMAR, Att.HUNITS)) {
 						case HLU_METR:
 							str += "m ";
@@ -858,4 +877,43 @@
 	
 	@SuppressWarnings("unchecked")
+	private static void points() {
+		boolean ok = false;
+		switch (feature.type) {
+		case FOGSIG:
+			if (Renderer.zoom >= 12) {
+				if (feature.objs.containsKey(Obj.LIGHTS))
+					lights();
+				else
+					Renderer.symbol(Harbours.Post);
+				ok = true;
+			}
+			break;
+		default:
+			if (Renderer.zoom >= 14) {
+				if (feature.objs.containsKey(Obj.LIGHTS))
+					lights();
+				else
+					Renderer.symbol(Harbours.Post);
+				ok = true;
+			}
+			break;
+		}
+		if (ok) {
+			if (feature.objs.containsKey(Obj.TOPMAR)) {
+				AttMap topmap = feature.objs.get(Obj.TOPMAR).get(0);
+				if (topmap.containsKey(Att.TOPSHP)) {
+					Renderer.symbol(Topmarks.Shapes.get(((ArrayList<TopSHP>) (topmap.get(Att.TOPSHP).val)).get(0)), getScheme(Obj.TOPMAR), null);
+				}
+			} else if (feature.objs.containsKey(Obj.DAYMAR)) {
+				AttMap topmap = feature.objs.get(Obj.DAYMAR).get(0);
+				if (topmap.containsKey(Att.TOPSHP)) {
+					Renderer.symbol(Topmarks.Shapes.get(((ArrayList<TopSHP>) (topmap.get(Att.TOPSHP).val)).get(0)), getScheme(Obj.DAYMAR), null);
+				}
+			}
+			Signals.addSignals();
+		}
+	}
+	
+	@SuppressWarnings("unchecked")
 	private static void lights() {
 		boolean ok = false;
@@ -863,20 +921,14 @@
 		case LITMAJ:
 		case LNDMRK:
-			Renderer.symbol(Beacons.LightMajor);
-			ok = true;
+			if (Renderer.zoom >= 12) {
+				Renderer.symbol(Beacons.LightMajor);
+				ok = true;
+			}
 			break;
 		case LITMIN:
 		case LIGHTS:
+		case PILPNT:
 			if (Renderer.zoom >= 14) {
 				Renderer.symbol(Beacons.LightMinor);
-				ok = true;
-			}
-			break;
-		case PILPNT:
-			if (Renderer.zoom >= 14) {
-				if (feature.objs.containsKey(Obj.LIGHTS))
-					Renderer.symbol(Beacons.LightMinor);
-				else
-					Renderer.symbol(Harbours.Post);
 				ok = true;
 			}
@@ -959,7 +1011,9 @@
 			}
 			MarSYS sys = MarSYS.SYS_CEVN;
-//			BnkWTW bnk = BnkWTW.BWW_UNKN;
+			BnkWTW bnk = BnkWTW.BWW_UNKN;
 			AttVal<?> att = feature.atts.get(Att.MARSYS);
 			if (att != null) sys = (MarSYS)att.val;
+			att = feature.atts.get(Att.BNKWTW);
+			if (att != null) bnk = (BnkWTW)att.val;
 			ObjTab objs = feature.objs.get(Obj.NOTMRK);
 			int n = objs.size();
@@ -969,8 +1023,10 @@
 				int i = 0;
 				for (AttMap atts : objs.values()) {
-					if (atts.get(Att.MARSYS) != null) sys = (MarSYS)(atts.get(Att.MARSYS).val);
+					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));
 					CatNMK cat = CatNMK.NMK_UNKN;
-					if (atts.get(Att.CATNMK) != null) cat = (CatNMK)(atts.get(Att.CATNMK).val);
-					Symbol sym = Notices.getNotice(cat, sys);
+					if (atts.get(Att.CATNMK) != null) cat = (CatNMK)(getAttEnum(Obj.NOTMRK, Att.CATNMK));
+					Symbol sym = Notices.getNotice(cat, sys, bnk);
+					Scheme sch = Notices.getScheme(sys, bnk);
 					Handle h = Handle.CC;
 					switch (i) {
@@ -1000,5 +1056,5 @@
 						break;
 					}
-					if (h != null) Renderer.symbol(sym, new Delta(h, AffineTransform.getTranslateInstance(dx, dy)));
+					if (h != null) Renderer.symbol(sym, sch, new Delta(h, AffineTransform.getTranslateInstance(dx, dy)));
 					i++;
 				}
Index: applications/editors/josm/plugins/seachart/src/s57/S57val.java
===================================================================
--- applications/editors/josm/plugins/seachart/src/s57/S57val.java	(revision 32100)
+++ applications/editors/josm/plugins/seachart/src/s57/S57val.java	(revision 32101)
@@ -66,5 +66,5 @@
   Catair.put(CatAIR.AIR_EMRG, new S57enum(8, "emergency"));
  }
- public enum CatACH { ACH_UNKN, ACH_UNRD, ACH_DEEP, ACH_TANK, ACH_EXPL, ACH_QUAR, ACH_SEAP, ACH_SMCF, ACH_SMCM, ACH_H24P, ACH_LTPD, ACH_NPSH, ACH_DRYC, ACH_RAFT }
+ public enum CatACH { ACH_UNKN, ACH_UNRD, ACH_DEEP, ACH_TANK, ACH_EXPL, ACH_QUAR, ACH_SEAP, ACH_SMCF, ACH_SMCM, ACH_H24P, ACH_LTPD, ACH_NPSH, ACH_DRYC, ACH_RAFT, ACH_WAIT, ACH_REPT }
  private static final EnumMap<CatACH, S57enum> Catach = new EnumMap<>(CatACH.class); static {Catach.put(CatACH.ACH_UNKN, new S57enum(0, ""));
   Catach.put(CatACH.ACH_UNRD, new S57enum(1, "unrestricted")); Catach.put(CatACH.ACH_DEEP, new S57enum(2, "deep_water")); Catach.put(CatACH.ACH_TANK, new S57enum(3, "tanker"));
@@ -72,5 +72,5 @@
   Catach.put(CatACH.ACH_SMCF, new S57enum(7, "small_craft")); Catach.put(CatACH.ACH_SMCM, new S57enum(8, "small_craft_mooring")); Catach.put(CatACH.ACH_H24P, new S57enum(9, "24_hour"));
   Catach.put(CatACH.ACH_LTPD, new S57enum(10, "limited_period")); Catach.put(CatACH.ACH_NPSH, new S57enum(11, "non_pushing")); Catach.put(CatACH.ACH_DRYC, new S57enum(12, "dry_cargo"));
-  Catach.put(CatACH.ACH_RAFT, new S57enum(13, "raft"));
+  Catach.put(CatACH.ACH_RAFT, new S57enum(13, "raft")); Catach.put(CatACH.ACH_WAIT, new S57enum(14, "waiting")); Catach.put(CatACH.ACH_REPT, new S57enum(15, "reported"));
  }
  public enum CatBRG { BRG_UNKN, BRG_FIXD, BRG_OPEN, BRG_SWNG, BRG_LIFT, BRG_BASC, BRG_PONT, BRG_DRAW, BRG_TRNS, BRG_FOOT, BRG_VIAD, BRG_AQUA, BRG_SUSP }
@@ -122,8 +122,8 @@
   Catcon.put(CatCON.CAT_AERL, new S57enum(1, "aerial")); Catcon.put(CatCON.CAT_BELT, new S57enum(2, "belt"));
  }
- public enum CatCRN { CRN_UNKN, CRN_NONS, CRN_CONT, CRN_SHRL, CRN_TRAV, CRN_AFRM } 
+ public enum CatCRN { CRN_UNKN, CRN_NONS, CRN_CONT, CRN_SHRL, CRN_TRAV, CRN_AFRM, CRN_GLTH } 
  private static final EnumMap<CatCRN, S57enum> Catcrn = new EnumMap<>(CatCRN.class); static { Catcrn.put(CatCRN.CRN_UNKN, new S57enum(0, ""));
   Catcrn.put(CatCRN.CRN_NONS, new S57enum(1, "non-specific")); Catcrn.put(CatCRN.CRN_CONT, new S57enum(2, "container")); Catcrn.put(CatCRN.CRN_SHRL, new S57enum(3, "sheerlegs"));
-  Catcrn.put(CatCRN.CRN_TRAV, new S57enum(4, "travelling")); Catcrn.put(CatCRN.CRN_AFRM , new S57enum(5, "a-frame"));
+  Catcrn.put(CatCRN.CRN_TRAV, new S57enum(4, "travelling")); Catcrn.put(CatCRN.CRN_AFRM , new S57enum(5, "a-frame")); Catcrn.put(CatCRN.CRN_GLTH , new S57enum(6, "goliath"));
  }
  public enum CatDAM { DAM_UNKN, DAM_WEIR, DAM_DAM, DAM_FLDB }
@@ -216,5 +216,5 @@
  }
  public enum CatLMK { LMK_UNKN, LMK_CARN, LMK_CMTY, LMK_CHMY, LMK_DISH, LMK_FLAG, LMK_FLAR, LMK_MAST, LMK_WNDS, LMK_MNMT, LMK_CLMN, LMK_MEML, LMK_OBLK, LMK_STAT, LMK_CROS,
-  LMK_DOME, LMK_RADR, LMK_TOWR, LMK_WNDM, LMK_WNDG, LMK_SPIR, LMK_BLDR }
+  LMK_DOME, LMK_RADR, LMK_TOWR, LMK_WNDM, LMK_WNDG, LMK_SPIR, LMK_BLDR, LMK_TRIM, LMK_BNDM, LMK_OBSW, LMK_TORL }
  private static final EnumMap<CatLMK, S57enum> Catlmk = new EnumMap<>(CatLMK.class); static {Catlmk.put(CatLMK.LMK_UNKN, new S57enum(0, ""));
   Catlmk.put(CatLMK.LMK_CARN, new S57enum(1, "cairn")); Catlmk.put(CatLMK.LMK_CMTY, new S57enum(2, "cemetery")); Catlmk.put(CatLMK.LMK_CHMY, new S57enum(3, "chimney"));
@@ -225,4 +225,6 @@
    Catlmk.put(CatLMK.LMK_RADR, new S57enum(16, "radar_scanner")); Catlmk.put(CatLMK.LMK_TOWR, new S57enum(17, "tower")); Catlmk.put(CatLMK.LMK_WNDM, new S57enum(18, "windmill"));
    Catlmk.put(CatLMK.LMK_WNDG, new S57enum(19, "windmotor")); Catlmk.put(CatLMK.LMK_SPIR, new S57enum(20, "spire")); Catlmk.put(CatLMK.LMK_BLDR, new S57enum(21, "boulder"));
+   Catlmk.put(CatLMK.LMK_TRIM, new S57enum(22, "triangulation_mark")); Catlmk.put(CatLMK.LMK_BNDM, new S57enum(23, "boundary_mark"));
+   Catlmk.put(CatLMK.LMK_OBSW, new S57enum(24, "observation_wheel")); Catlmk.put(CatLMK.LMK_TORL, new S57enum(25, "toril"));
  }
  public enum CatLAM { LAM_UNKN, LAM_PORT, LAM_STBD, LAM_PCST, LAM_PCPT, LAM_WWLT, LAM_WWRT, LAM_CHLT, LAM_CHRT, LAM_WWSN, LAM_CHSN, LAM_CHRB, LAM_CHLB, LAM_CRRT, LAM_CRLT,
@@ -268,17 +270,22 @@
   Catnav.put(CatNAV.NAV_CLRG, new S57enum(1, "clearing")); Catnav.put(CatNAV.NAV_TRST, new S57enum(2, "transit")); Catnav.put(CatNAV.NAV_LDNG, new S57enum(3, "leading"));
  }
- public enum CatOBS { OBS_UNKN, OBS_STMP, OBS_WELH, OBS_DIFF, OBS_CRIB, OBS_FHVN, OBS_FLAR, OBS_FLGD, OBS_ICEB, OBS_GTKL, OBS_BOOM } 
+ public enum CatOBS { OBS_UNKN, OBS_STMP, OBS_WELH, OBS_DIFF, OBS_CRIB, OBS_FHVN, OBS_FLAR, OBS_FLGD, OBS_ICEB, OBS_GTKL, OBS_BOOM, OBS_UWTB, OBS_TPLT, OBS_WEND, OBS_UWAS,
+	 OBS_REEF, OBS_MNFD, OBS_PNGO, OBS_RPLT, OBS_SCII } 
  private static final EnumMap<CatOBS, S57enum> Catobs = new EnumMap<>(CatOBS.class); static { Catobs.put(CatOBS.OBS_UNKN, new S57enum(0, ""));
   Catobs.put(CatOBS.OBS_STMP, new S57enum(1, "stump")); Catobs.put(CatOBS.OBS_WELH, new S57enum(2, "wellhead")); Catobs.put(CatOBS.OBS_DIFF, new S57enum(3, "diffuser"));
   Catobs.put(CatOBS.OBS_CRIB, new S57enum(4, "crib")); Catobs.put(CatOBS.OBS_FHVN, new S57enum(5, "fish_haven")); Catobs.put(CatOBS.OBS_FLAR, new S57enum(6, "foul_area"));
   Catobs.put(CatOBS.OBS_FLGD, new S57enum(7, "foul_ground")); Catobs.put(CatOBS.OBS_ICEB, new S57enum(8, "ice_boom")); Catobs.put(CatOBS.OBS_GTKL, new S57enum(9, "ground_tackle"));
-  Catobs.put(CatOBS.OBS_BOOM, new S57enum(10, "boom"));
- }
- public enum CatOFP { OFP_UNKN, OFP_OIL, OFP_PROD, OFP_OBS, OFP_ALP, OFP_SALM, OFP_MOOR, OFP_AISL, OFP_FPSO, OFP_ACCN, OFP_NCCB } 
+  Catobs.put(CatOBS.OBS_BOOM, new S57enum(10, "boom")); Catobs.put(CatOBS.OBS_UWTB, new S57enum(11, "underwater_turbine")); Catobs.put(CatOBS.OBS_TPLT, new S57enum(12, "template"));
+  Catobs.put(CatOBS.OBS_WEND, new S57enum(13, "wave_energy_device")); Catobs.put(CatOBS.OBS_UWAS, new S57enum(14, "subsurface_data")); Catobs.put(CatOBS.OBS_REEF, new S57enum(15, "artificial_reef"));
+  Catobs.put(CatOBS.OBS_MNFD, new S57enum(16, "manifold")); Catobs.put(CatOBS.OBS_PNGO, new S57enum(17, "submerged_pingo")); Catobs.put(CatOBS.OBS_RPLT, new S57enum(18, "platform_remains"));
+  Catobs.put(CatOBS.OBS_SCII, new S57enum(19, "scientific_instrument"));
+ }
+
+ public enum CatOFP { OFP_UNKN, OFP_OIL, OFP_PROD, OFP_OBS, OFP_ALP, OFP_SALM, OFP_MOOR, OFP_AISL, OFP_FPSO, OFP_ACCN, OFP_NCCB, OFP_FOTK } 
  private static final EnumMap<CatOFP, S57enum> Catofp = new EnumMap<>(CatOFP.class); static { Catofp.put(CatOFP.OFP_UNKN, new S57enum(0, ""));
   Catofp.put(CatOFP.OFP_OIL, new S57enum(1, "oil")); Catofp.put(CatOFP.OFP_PROD, new S57enum(2, "production")); Catofp.put(CatOFP.OFP_OBS, new S57enum(3, "observation"));
   Catofp.put(CatOFP.OFP_ALP, new S57enum(4, "alp")); Catofp.put(CatOFP.OFP_SALM, new S57enum(5, "salm")); Catofp.put(CatOFP.OFP_MOOR, new S57enum(6, "mooring"));
   Catofp.put(CatOFP.OFP_AISL, new S57enum(7, "artificial_island")); Catofp.put(CatOFP.OFP_FPSO, new S57enum(8, "fpso")); Catofp.put(CatOFP.OFP_ACCN, new S57enum(9, "accommodation"));
-  Catofp.put(CatOFP.OFP_NCCB, new S57enum(10, "nccb"));
+  Catofp.put(CatOFP.OFP_NCCB, new S57enum(10, "nccb")); Catofp.put(CatOFP.OFP_FOTK, new S57enum(11, "floating_oil_tank"));
  }
  public enum CatOLB { OLB_UNKN, OLB_RETN, OLB_FLTG }
@@ -286,9 +293,10 @@
   Catolb.put(CatOLB.OLB_RETN, new S57enum(1, "retention")); Catolb.put(CatOLB.OLB_FLTG, new S57enum(2, "floating"));
  }
- public enum CatPLE { PLE_UNKN, PLE_STAK, PLE_SNAG, PLE_POST, PLE_TRIP }
+ public enum CatPLE { PLE_UNKN, PLE_STAK, PLE_POST, PLE_TRIP, PLE_PLNG, PLE_PARE, PLE_PIPE }
  private static final EnumMap<CatPLE, S57enum> Catple = new EnumMap<>(CatPLE.class); static { Catple.put(CatPLE.PLE_UNKN, new S57enum(0, ""));
-  Catple.put(CatPLE.PLE_STAK, new S57enum(1, "stake")); Catple.put(CatPLE.PLE_SNAG, new S57enum(2, "snag")); Catple.put(CatPLE.PLE_POST, new S57enum(3, "post"));
-  Catple.put(CatPLE.PLE_TRIP, new S57enum(4, "tripodal"));
- }
+  Catple.put(CatPLE.PLE_STAK, new S57enum(1, "stake")); Catple.put(CatPLE.PLE_POST, new S57enum(3, "post")); Catple.put(CatPLE.PLE_TRIP, new S57enum(4, "tripodal"));
+  Catple.put(CatPLE.PLE_PLNG, new S57enum(5, "piling")); Catple.put(CatPLE.PLE_PARE, new S57enum(6, "pile_area")); Catple.put(CatPLE.PLE_PIPE, new S57enum(7, "pipe"));
+ }
+
  public enum CatPIL { PIL_UNKN, PIL_CVSL, PIL_HELI, PIL_SHOR }
  private static final EnumMap<CatPIL, S57enum> Catpil = new EnumMap<>(CatPIL.class); static { Catpil.put(CatPIL.PIL_UNKN, new S57enum(0, ""));
@@ -345,5 +353,6 @@
  }
  public enum CatREA { REA_UNKN, REA_SFTY, REA_NANC, REA_NFSH, REA_NATR, REA_BRDS, REA_GRSV, REA_SEAL, REA_DEGR, REA_MILY, REA_HIST, REA_INST,
-  REA_NASF, REA_STRD, REA_MINE, REA_NDIV, REA_TBAV, REA_PROH, REA_SWIM, REA_WAIT, REA_RSCH, REA_DREG, REA_FSNC, REA_ERES, REA_NWAK, REA_SWNG, REA_WSKI, REA_ESSA, REA_PSSA } 
+  REA_NASF, REA_STRD, REA_MINE, REA_NDIV, REA_TBAV, REA_PROH, REA_SWIM, REA_WAIT, REA_RSCH, REA_DREG, REA_FSNC, REA_ERES, REA_NWAK, REA_SWNG,
+  REA_WSKI, REA_ESSA, REA_PSSA, REA_DISA, REA_PSAR, REA_CRLS } 
  private static final EnumMap<CatREA, S57enum> Catrea = new EnumMap<>(CatREA.class); static { Catrea.put(CatREA.REA_UNKN, new S57enum(0, ""));
   Catrea.put(CatREA.REA_SFTY, new S57enum(1, "safety")); Catrea.put(CatREA.REA_NANC, new S57enum(2, "no_anchoring")); Catrea.put(CatREA.REA_NFSH, new S57enum(3, "no_fishing"));
@@ -357,4 +366,5 @@
    Catrea.put(CatREA.REA_SWNG, new S57enum(25, "swinging")); Catrea.put(CatREA.REA_WSKI, new S57enum(26, "water_skiing"));
    Catrea.put(CatREA.REA_ESSA, new S57enum(27, "environmentally_sensitive")); Catrea.put(CatREA.REA_PSSA, new S57enum(28, "particularly_sensitive"));
+   Catrea.put(CatREA.REA_DISA, new S57enum(29, "disengagement")); Catrea.put(CatREA.REA_PSAR, new S57enum(30, "port_security")); Catrea.put(CatREA.REA_CRLS, new S57enum(31, "coral_sactuary"));
  }
  public enum CatROD { ROD_UNKN, ROD_MWAY, ROD_MAJR, ROD_MINR, ROD_TRAK, ROD_MAJS, ROD_MINS, ROD_CRSG, ROD_PATH } 
@@ -556,5 +566,6 @@
  public enum FncFNC { FNC_UNKN, FNC_HBRM, FNC_CSTM, FNC_HLTH, FNC_HOSP, FNC_POST, FNC_HOTL, FNC_RAIL, FNC_POLC, FNC_WPOL, FNC_PILO, FNC_PILL, FNC_BANK,
   FNC_DIST, FNC_TRNS, FNC_FCTY, FNC_POWR, FNC_ADMIN, FNC_EDUC, FNC_CHCH, FNC_CHPL, FNC_TMPL, FNC_PGDA, FNC_SHSH, FNC_BTMP, FNC_MOSQ, FNC_MRBT,
-  FNC_LOOK, FNC_COMM, FNC_TV, FNC_RADO, FNC_RADR, FNC_LGHT, FNC_MCWV, FNC_COOL, FNC_OBS, FNC_TMBL, FNC_CLOK, FNC_CTRL, FNC_ASHM, FNC_STAD, FNC_BUSS }
+  FNC_LOOK, FNC_COMM, FNC_TV, FNC_RADO, FNC_RADR, FNC_LGHT, FNC_MCWV, FNC_COOL, FNC_OBS, FNC_TMBL, FNC_CLOK, FNC_CTRL, FNC_ASHM, FNC_STAD, FNC_BUSS,
+  FNC_PTRM, FNC_SRCT, FNC_OBSV, FNC_OREC, FNC_BTHS, FNC_PMPS }
  private static final EnumMap<FncFNC, S57enum> Functn = new EnumMap<>(FncFNC.class); static {Functn.put(FncFNC.FNC_UNKN, new S57enum(0, ""));
   Functn.put(FncFNC.FNC_HBRM, new S57enum(2, "harbour_master")); Functn.put(FncFNC.FNC_CSTM, new S57enum(3, "customs")); Functn.put(FncFNC.FNC_HLTH, new S57enum(4, "health"));
@@ -571,6 +582,9 @@
    Functn.put(FncFNC.FNC_COOL, new S57enum(35, "cooling")); Functn.put(FncFNC.FNC_OBS, new S57enum(36, "observation")); Functn.put(FncFNC.FNC_TMBL, new S57enum(37, "time_ball"));
    Functn.put(FncFNC.FNC_CLOK, new S57enum(38, "clock")); Functn.put(FncFNC.FNC_CTRL, new S57enum(39, "control")); Functn.put(FncFNC.FNC_ASHM, new S57enum(40, "airship_mooring"));
-   Functn.put(FncFNC.FNC_STAD, new S57enum(41, "stadium")); Functn.put(FncFNC.FNC_BUSS, new S57enum(42, "bus_station"));
- }
+   Functn.put(FncFNC.FNC_STAD, new S57enum(41, "stadium")); Functn.put(FncFNC.FNC_BUSS, new S57enum(42, "bus_station")); Functn.put(FncFNC.FNC_PTRM, new S57enum(43, "passenger_terminal"));
+   Functn.put(FncFNC.FNC_SRCT, new S57enum(44, "sea_rescue_control")); Functn.put(FncFNC.FNC_OBSV, new S57enum(45, "observatory")); Functn.put(FncFNC.FNC_OREC, new S57enum(46, "ore_crusher"));
+   Functn.put(FncFNC.FNC_BTHS, new S57enum(47, "boathouse")); Functn.put(FncFNC.FNC_PMPS, new S57enum(48, "pumping_station"));
+ }
+
  public enum UniHLU { HLU_UNKN, HLU_METR, HLU_FEET, HLU_KMTR, HLU_HMTR, HLU_SMIL, HLU_NMIL }
  private static final EnumMap<UniHLU, S57enum> Hunits = new EnumMap<>(UniHLU.class); static { Hunits.put(UniHLU.HLU_UNKN, new S57enum(0, ""));
@@ -606,10 +620,10 @@
   Marsys.put(MarSYS.SYS_BWR2, new S57enum(13, "bniwr2")); Marsys.put(MarSYS.SYS_BNWR, new S57enum(14, "bniwr")); Marsys.put(MarSYS.SYS_PPWB, new S57enum(15, "ppwbc"));
  }
- public enum NatCON { CON_UNKN, CON_MSNY, CON_CONC, CON_BDRS, CON_HSRF, CON_USRF, CON_WOOD, CON_METL, CON_GRP, CON_PNTD, CON_FMWK }
+ public enum NatCON { CON_UNKN, CON_MSNY, CON_CONC, CON_BDRS, CON_HSRF, CON_USRF, CON_WOOD, CON_METL, CON_GRP, CON_PNTD, CON_FMWK, CON_LATT, CON_GLAS }
  private static final EnumMap<NatCON, S57enum> Natcon = new EnumMap<>(NatCON.class); static { Natcon.put(NatCON.CON_UNKN, new S57enum(0, ""));
   Natcon.put(NatCON.CON_MSNY, new S57enum(1, "masonry")); Natcon.put(NatCON.CON_CONC, new S57enum(2, "concreted")); Natcon.put(NatCON.CON_BDRS, new S57enum(3, "loose_boulders"));
   Natcon.put(NatCON.CON_HSRF, new S57enum(4, "hard-surfaced")); Natcon.put(NatCON.CON_USRF, new S57enum(5, "unsurfaced")); Natcon.put(NatCON.CON_WOOD, new S57enum(6, "wooden"));
   Natcon.put(NatCON.CON_METL, new S57enum(7, "metal")); Natcon.put(NatCON.CON_GRP, new S57enum(8, "grp")); Natcon.put(NatCON.CON_PNTD, new S57enum(9, "painted"));
-  Natcon.put(NatCON.CON_FMWK, new S57enum(10, "framework"));
+  Natcon.put(NatCON.CON_FMWK, new S57enum(10, "framework")); Natcon.put(NatCON.CON_LATT, new S57enum(11, "latticed")); Natcon.put(NatCON.CON_GLAS, new S57enum(12, "glass"));
  }
  public enum NatSUR { SUR_UNKN, SUR_MUD, SUR_CLAY, SUR_SILT, SUR_SAND, SUR_STON, SUR_GRVL, SUR_PBBL, SUR_CBBL, SUR_ROCK, SUR_LAVA, SUR_CORL, SUR_SHEL, SUR_BLDR } 
@@ -648,5 +662,6 @@
  }
  public enum RstRST { RST_UNKN, RST_NANC, RST_RANC, RST_NFSH, RST_RFSH, RST_NTRL, RST_RTRL, RST_NENT, RST_RENT, RST_NDRG, RST_RDRG, RST_NDVG, RST_RDVG, RST_NWAK, RST_TBAV, RST_NCST, RST_NDSC,
-  RST_RDSC, RST_NEXD, RST_REXD, RST_NDRL, RST_RDRL, RST_NHAR, RST_NLTG, RST_NDRA, RST_NSTP, RST_NLND, RST_RSPD, RST_NOVT, RST_NCOV, RST_NPOV, RST_NBRT, RST_RBRT, RST_NMFT, RST_RMFT, RST_NTRN, RST_RFWD }
+  RST_RDSC, RST_NEXD, RST_REXD, RST_NDRL, RST_RDRL, RST_NHAR, RST_NLTG, RST_NDRA, RST_NSTP, RST_NLND, RST_RSPD, RST_NOVT, RST_NCOV, RST_NPOV, RST_NBRT, RST_RBRT, RST_NMFT, RST_RMFT, RST_NTRN,
+  RST_RFWD, RST_RFWW, RST_NSWM  }
  private static final EnumMap<RstRST, S57enum> Restrn = new EnumMap<>(RstRST.class); static { Restrn.put(RstRST.RST_UNKN, new S57enum(0, ""));
   Restrn.put(RstRST.RST_NANC, new S57enum(1, "no_anchoring")); Restrn.put(RstRST.RST_RANC, new S57enum(2, "restricted_anchoring")); Restrn.put(RstRST.RST_NFSH, new S57enum(3, "no_fishing"));
@@ -663,4 +678,5 @@
    Restrn.put(RstRST.RST_NBRT, new S57enum(31, "no_berthing")); Restrn.put(RstRST.RST_RBRT, new S57enum(32, "restricted_berthing")); Restrn.put(RstRST.RST_NMFT, new S57enum(33, "no_making_fast"));
    Restrn.put(RstRST.RST_RMFT, new S57enum(34, "restricted_making_fast")); Restrn.put(RstRST.RST_NTRN, new S57enum(35, "no_turning")); Restrn.put(RstRST.RST_RFWD, new S57enum(36, "restricted_fairway_depth"));
+   Restrn.put(RstRST.RST_RFWW, new S57enum(37, "restricted_fairway_width")); Restrn.put(RstRST.RST_NSWM, new S57enum(38, "no_swimming"));
  }
  public enum SigGEN { GEN_UNKN, GEN_AUTO, GEN_WAVE, GEN_HAND, GEN_WIND }
@@ -688,26 +704,28 @@
  public enum TecSOU { SOU_UNKN, SOU_ESND, SOU_FSSN, SOU_MLBM, SOU_DIVR, SOU_LDLN, SOU_WDRG, SOU_LASR, SOU_VACC, SOU_EMAG, SOU_PHGY, SOU_SATL, SOU_LEVL, SOU_SSSN, SOU_COMP } 
  private static final EnumMap<TecSOU, S57enum> Tecsou = new EnumMap<>(TecSOU.class); static { Tecsou.put(TecSOU.SOU_UNKN, new S57enum(0, ""));
-  Tecsou.put(TecSOU.SOU_ESND, new S57enum(1, "echo-sounder")); Tecsou.put(TecSOU.SOU_FSSN, new S57enum(2, "side-scan_sonar")); Tecsou.put(TecSOU.SOU_MLBM, new S57enum(3, "multi-beam"));
+ 	Tecsou.put(TecSOU.SOU_ESND, new S57enum(1, "echo-sounder")); Tecsou.put(TecSOU.SOU_FSSN, new S57enum(2, "side-scan_sonar")); Tecsou.put(TecSOU.SOU_MLBM, new S57enum(3, "multi-beam"));
   Tecsou.put(TecSOU.SOU_DIVR, new S57enum(4, "diver")); Tecsou.put(TecSOU.SOU_LDLN, new S57enum(5, "lead-line")); Tecsou.put(TecSOU.SOU_WDRG, new S57enum(6, "wire-drag"));
   Tecsou.put(TecSOU.SOU_LASR, new S57enum(7, "laser")); Tecsou.put(TecSOU.SOU_VACC, new S57enum(8, "vertical_acoustic")); Tecsou.put(TecSOU.SOU_EMAG, new S57enum(9, "electromagnetic"));
-   Tecsou.put(TecSOU.SOU_PHGY, new S57enum(10, "photogrammetry")); Tecsou.put(TecSOU.SOU_SATL, new S57enum(11, "satellite")); Tecsou.put(TecSOU.SOU_LEVL, new S57enum(12, "levelling"));
-   Tecsou.put(TecSOU.SOU_SSSN, new S57enum(13, "side-scan_sonar_swept")); Tecsou.put(TecSOU.SOU_COMP, new S57enum(14, "computer"));
+  Tecsou.put(TecSOU.SOU_PHGY, new S57enum(10, "photogrammetry")); Tecsou.put(TecSOU.SOU_SATL, new S57enum(11, "satellite")); Tecsou.put(TecSOU.SOU_LEVL, new S57enum(12, "levelling"));
+  Tecsou.put(TecSOU.SOU_SSSN, new S57enum(13, "side-scan_sonar_swept")); Tecsou.put(TecSOU.SOU_COMP, new S57enum(14, "computer"));
  }
  public enum TopSHP { TOP_UNKN, TOP_CONE, TOP_ICONE, TOP_SPHR, TOP_ISD, TOP_CAN, TOP_BORD, TOP_SALT, TOP_CROS, TOP_CUBE, TOP_WEST, TOP_EAST, TOP_RHOM,
    TOP_NORTH, TOP_SOUTH, TOP_BESM, TOP_IBESM, TOP_FLAG, TOP_SPRH, TOP_SQUR, TOP_HRECT, TOP_VRECT, TOP_TRAP, TOP_ITRAP, TOP_TRI, TOP_ITRI, TOP_CIRC,
-   TOP_CRSS, TOP_T, TOP_TRCL, TOP_CRCL, TOP_RHCL, TOP_CLTR, TOP_OTHR }
- private static final EnumMap<TopSHP, S57enum> Topshp = new EnumMap<>(TopSHP.class); static { Topshp.put(TopSHP.TOP_UNKN, new S57enum(0, ""));
-  Topshp.put(TopSHP.TOP_CONE, new S57enum(1, "cone, point up")); Topshp.put(TopSHP.TOP_ICONE, new S57enum(2, "cone, point down")); Topshp.put(TopSHP.TOP_SPHR, new S57enum(3, "sphere"));
-  Topshp.put(TopSHP.TOP_ISD, new S57enum(4, "2 spheres")); Topshp.put(TopSHP.TOP_CAN, new S57enum(5, "cylinder")); Topshp.put(TopSHP.TOP_BORD, new S57enum(6, "board"));
-  Topshp.put(TopSHP.TOP_SALT, new S57enum(7, "x-shape")); Topshp.put(TopSHP.TOP_CROS, new S57enum(8, "cross")); Topshp.put(TopSHP.TOP_CUBE, new S57enum(9, "cube, point up"));
-  Topshp.put(TopSHP.TOP_WEST, new S57enum(10, "2 cones point together")); Topshp.put(TopSHP.TOP_EAST, new S57enum(11, "2 cones base together")); Topshp.put(TopSHP.TOP_RHOM, new S57enum(12, "rhombus"));
-   Topshp.put(TopSHP.TOP_NORTH, new S57enum(13, "2 cones up")); Topshp.put(TopSHP.TOP_SOUTH, new S57enum(14, "2 cones down")); Topshp.put(TopSHP.TOP_BESM, new S57enum(15, "besom, point up"));
-   Topshp.put(TopSHP.TOP_IBESM, new S57enum(16, "besom, point down")); Topshp.put(TopSHP.TOP_FLAG, new S57enum(17, "flag")); Topshp.put(TopSHP.TOP_SPRH, new S57enum(18, "sphere over rhombus"));
-   Topshp.put(TopSHP.TOP_SQUR, new S57enum(19, "square")); Topshp.put(TopSHP.TOP_HRECT, new S57enum(20, "rectangle, horizontal")); Topshp.put(TopSHP.TOP_VRECT, new S57enum(21, "rectangle, vertical"));
-   Topshp.put(TopSHP.TOP_TRAP, new S57enum(22, "trapezium, up")); Topshp.put(TopSHP.TOP_ITRAP, new S57enum(23, "trapezium, down")); Topshp.put(TopSHP.TOP_TRI, new S57enum(24, "triangle, point up"));
-   Topshp.put(TopSHP.TOP_ITRI, new S57enum(25, "triangle, point down")); Topshp.put(TopSHP.TOP_CIRC, new S57enum(26, "circle")); Topshp.put(TopSHP.TOP_CRSS, new S57enum(27, "2 upright crosses"));
-   Topshp.put(TopSHP.TOP_T, new S57enum(28, "t-shape")); Topshp.put(TopSHP.TOP_TRCL, new S57enum(29, "triangle, point up over circle")); Topshp.put(TopSHP.TOP_CRCL, new S57enum(30, "upright cross over circle"));
-   Topshp.put(TopSHP.TOP_RHCL, new S57enum(31, "rhombus over circle")); Topshp.put(TopSHP.TOP_CLTR, new S57enum(32, "circle over triangle, point up")); Topshp.put(TopSHP.TOP_OTHR, new S57enum(33, "other"));
- }
+   TOP_CRSS, TOP_T, TOP_TRCL, TOP_CRCL, TOP_RHCL, TOP_CLTR, TOP_OTHR, TOP_CYSP, TOP_COSP }
+
+	private static final EnumMap<TopSHP, S57enum> Topshp = new EnumMap<>(TopSHP.class); static { Topshp.put(TopSHP.TOP_UNKN, new S57enum(0, ""));
+		Topshp.put(TopSHP.TOP_CONE, new S57enum(1, "cone, point up")); Topshp.put(TopSHP.TOP_ICONE, new S57enum(2, "cone, point down")); Topshp.put(TopSHP.TOP_SPHR, new S57enum(3, "sphere"));
+		Topshp.put(TopSHP.TOP_ISD, new S57enum(4, "2 spheres")); Topshp.put(TopSHP.TOP_CAN, new S57enum(5, "cylinder")); Topshp.put(TopSHP.TOP_BORD, new S57enum(6, "board"));
+		Topshp.put(TopSHP.TOP_SALT, new S57enum(7, "x-shape")); Topshp.put(TopSHP.TOP_CROS, new S57enum(8, "cross")); Topshp.put(TopSHP.TOP_CUBE, new S57enum(9, "cube, point up"));
+		Topshp.put(TopSHP.TOP_WEST, new S57enum(10, "2 cones point together")); Topshp.put(TopSHP.TOP_EAST, new S57enum(11, "2 cones base together")); Topshp.put(TopSHP.TOP_RHOM, new S57enum(12, "rhombus"));
+		Topshp.put(TopSHP.TOP_NORTH, new S57enum(13, "2 cones up")); Topshp.put(TopSHP.TOP_SOUTH, new S57enum(14, "2 cones down")); Topshp.put(TopSHP.TOP_BESM, new S57enum(15, "besom, point up"));
+		Topshp.put(TopSHP.TOP_IBESM, new S57enum(16, "besom, point down")); Topshp.put(TopSHP.TOP_FLAG, new S57enum(17, "flag")); Topshp.put(TopSHP.TOP_SPRH, new S57enum(18, "sphere over rhombus"));
+		Topshp.put(TopSHP.TOP_SQUR, new S57enum(19, "square")); Topshp.put(TopSHP.TOP_HRECT, new S57enum(20, "rectangle, horizontal")); Topshp.put(TopSHP.TOP_VRECT, new S57enum(21, "rectangle, vertical"));
+		Topshp.put(TopSHP.TOP_TRAP, new S57enum(22, "trapezium, up")); Topshp.put(TopSHP.TOP_ITRAP, new S57enum(23, "trapezium, down")); Topshp.put(TopSHP.TOP_TRI, new S57enum(24, "triangle, point up"));
+		Topshp.put(TopSHP.TOP_ITRI, new S57enum(25, "triangle, point down")); Topshp.put(TopSHP.TOP_CIRC, new S57enum(26, "circle")); Topshp.put(TopSHP.TOP_CRSS, new S57enum(27, "2 upright crosses"));
+		Topshp.put(TopSHP.TOP_T, new S57enum(28, "t-shape")); Topshp.put(TopSHP.TOP_TRCL, new S57enum(29, "triangle, point up over circle")); Topshp.put(TopSHP.TOP_CRCL, new S57enum(30, "upright cross over circle"));
+		Topshp.put(TopSHP.TOP_RHCL, new S57enum(31, "rhombus over circle")); Topshp.put(TopSHP.TOP_CLTR, new S57enum(32, "circle over triangle, point up")); Topshp.put(TopSHP.TOP_OTHR, new S57enum(33, "other"));
+		Topshp.put(TopSHP.TOP_CYSP, new S57enum(34, "cylinder over sphere")); Topshp.put(TopSHP.TOP_COSP, new S57enum(35, "cone, point up over sphere"));
+	}
  public enum TrfTRF { TRF_UNKN, TRF_INBD, TRF_OBND, TRF_ONEW, TRF_TWOW }
  private static final EnumMap<TrfTRF, S57enum> Trafic = new EnumMap<>(TrfTRF.class); static { Trafic.put(TrfTRF.TRF_UNKN, new S57enum(0, ""));
@@ -765,5 +783,5 @@
  Bnkwtw.put(BnkWTW.BWW_LEFT, new S57enum(1, "left")); Bnkwtw.put(BnkWTW.BWW_RGHT, new S57enum(2, "right"));
  }
- public enum CatNMK { NMK_UNKN, NMK_NENT, NMK_CLSA, NMK_NOVK, NMK_NCOV, NMK_NPAS, NMK_NCPS, NMK_NBRT, NMK_NBLL, NMK_NANK, NMK_NMOR, NMK_NTRN, NMK_NWSH,
+ public enum CatNMK { NMK_UNKN, NMK_NENT, NMK_CLSA, NMK_NOVK, NMK_NCOV, NMK_NPAS, NMK_NBRT, NMK_NBLL, NMK_NANK, NMK_NMOR, NMK_NTRN, NMK_NWSH,
   NMK_NPSL, NMK_NPSR, NMK_NMTC, NMK_NSPC, NMK_NWSK, NMK_NSLC, NMK_NUPC, NMK_NSLB, NMK_NWBK, NMK_NHSC, NMK_NLBG, NMK_MVTL, NMK_MVTR, NMK_MVTP,
   NMK_MVTS, NMK_KPTP, NMK_KPTS, NMK_CSTP, NMK_CSTS, NMK_STOP, NMK_SPDL, NMK_SHRN, NMK_KPLO, NMK_GWJN, NMK_GWCS, NMK_MKRC, NMK_LMDP, NMK_LMHR,
@@ -772,5 +790,6 @@
   NMK_BTU1, NMK_BTU2, NMK_BTU3, NMK_ANKP, NMK_MORP, NMK_VLBT, NMK_TRNA, NMK_SWWC, NMK_SWWR, NMK_SWWL, NMK_WRSA, NMK_WLSA, NMK_WRSL, NMK_WLSR,
   NMK_WRAL, NMK_WLAR, NMK_MWWC, NMK_MWWJ, NMK_MWAR, NMK_MWAL, NMK_WARL, NMK_WALR, NMK_PEND, NMK_DWTR, NMK_TELE, NMK_MTCP, NMK_SPCP, NMK_WSKP,
-  NMK_SLCP, NMK_UPCP, NMK_SLBP, NMK_RADI, NMK_WTBP, NMK_HSCP, NMK_LBGP, NMK_KTPM, NMK_KTSM, NMK_KTMR, NMK_CRTP, NMK_CRTS, NMK_TRBM, NMK_RSPD }
+  NMK_SLCP, NMK_UPCP, NMK_SLBP, NMK_RADI, NMK_WTBP, NMK_HSCP, NMK_LBGP, NMK_KTPM, NMK_KTSM, NMK_KTMR, NMK_CRTP, NMK_CRTS, NMK_TRBM, NMK_RSPD,
+  NMK_WRKP, NMK_PSBS, NMK_NCPS, NMK_NSMC, NMK_ATTN, NMK_FWCR, NMK_SHIP }
  private static final EnumMap<CatNMK, S57enum> Catnmk = new EnumMap<>(CatNMK.class); static { Catnmk.put(CatNMK.NMK_UNKN, new S57enum(0, ""));
   Catnmk.put(CatNMK.NMK_NENT, new S57enum(1, "no_entry")); Catnmk.put(CatNMK.NMK_CLSA, new S57enum(2, "closed_area")); Catnmk.put(CatNMK.NMK_NOVK, new S57enum(3, "no_overtaking"));
@@ -814,5 +833,7 @@
    Catnmk.put(CatNMK.NMK_KTPM, new S57enum(103, "keep_to_port_margin")); Catnmk.put(CatNMK.NMK_KTSM, new S57enum(104, "keep_to_starboard_margin")); Catnmk.put(CatNMK.NMK_KTMR, new S57enum(105, "keep_to_mid-river"));
    Catnmk.put(CatNMK.NMK_CRTP, new S57enum(106, "cross_river_to_port")); Catnmk.put(CatNMK.NMK_CRTS, new S57enum(107, "cross_river_to_starboard")); Catnmk.put(CatNMK.NMK_TRBM, new S57enum(108, "traffic_between_margins"));
-   Catnmk.put(CatNMK.NMK_RSPD, new S57enum(109, "reduce_speed")); Catnmk.put(CatNMK.NMK_NCPS, new S57enum(199, "no_convoy_passing")); 
+   Catnmk.put(CatNMK.NMK_RSPD, new S57enum(109, "reduce_speed")); Catnmk.put(CatNMK.NMK_WRKP, new S57enum(110, "wreck_pontoon")); Catnmk.put(CatNMK.NMK_PSBS, new S57enum(111, "pass_both_sides"));
+   Catnmk.put(CatNMK.NMK_NCPS, new S57enum(112, "no_convoy_passing")); Catnmk.put(CatNMK.NMK_NSMC, new S57enum(113, "no_small_craft")); Catnmk.put(CatNMK.NMK_ATTN, new S57enum(114, "attention"));
+   Catnmk.put(CatNMK.NMK_FWCR, new S57enum(115, "fairway_crossing")); Catnmk.put(CatNMK.NMK_SHIP, new S57enum(112, "shipping_inspection_point")); 
  }
  public enum ClsDNG { DNG_UNKN, DNG_1BLU, DNG_2BLU, DNG_3BLU, DNG_0BLU, DNG_1RED }
Index: applications/editors/josm/plugins/seachart/src/symbols/Areas.java
===================================================================
--- applications/editors/josm/plugins/seachart/src/symbols/Areas.java	(revision 32100)
+++ applications/editors/josm/plugins/seachart/src/symbols/Areas.java	(revision 32101)
@@ -53,5 +53,5 @@
 		LaneArrow.add(new Instr(Form.BBOX, new Rectangle2D.Double(-20,-240,40,240)));
 		LaneArrow.add(new Instr(Form.STRK, new BasicStroke(10, BasicStroke.CAP_ROUND, BasicStroke.JOIN_MITER)));
-		LaneArrow.add(new Instr(Form.FILL, Symbols.Mline));
+		LaneArrow.add(new Instr(Form.FILL, Symbols.Mtss));
 		Path2D.Double p = new Path2D.Double(); p.moveTo(15,0); p.lineTo(15,-195); p.lineTo(40,-195);
 		p.lineTo(0,-240); p.lineTo(-40,-195); p.lineTo(-15,-195); p.lineTo(-15,0); p.closePath();
@@ -204,3 +204,25 @@
 		g2.draw(p);
 	}
+	public static final Symbol KelpS = new Symbol();
+	static {
+		KelpS.add(new Instr(Form.STRK, new BasicStroke(4, BasicStroke.CAP_ROUND, BasicStroke.JOIN_MITER)));
+		Path2D.Double p = new Path2D.Double(); p.moveTo(-60,0); p.curveTo(-20,-20,-24,40,24,20); p.moveTo(-60,0); p.quadTo(-48,20,-32,12);
+		p.moveTo(-36,-4); p.quadTo(-24,-24,-4,-16); p.quadTo(8,-32,20,-24); p.moveTo(-4,-16); p.quadTo(8,0,20,-8);
+		p.moveTo(-8,20); p.quadTo(12,0,36,8); p.quadTo(48,24,60,16); p.moveTo(36,8); p.quadTo(48,-8,60,0);
+		KelpS.add(new Instr(Form.PLIN, p));
+	}
+	public static final BufferedImage KelpA = new BufferedImage(240, 240, BufferedImage.TYPE_INT_ARGB);
+	static {
+		Graphics2D g2 = KelpA.createGraphics();
+		g2.setStroke(new BasicStroke(8, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND));
+		g2.setBackground(new Color(0, true));
+		g2.clearRect(0,  0, 240, 240);
+		g2.setPaint(Color.black);
+		Path2D.Double p = new Path2D.Double();
+			p.moveTo(0,60); p.curveTo(40,40,44,100,84,80); p.moveTo(0,60); p.quadTo(12,80,28,72); p.moveTo(24,56); p.quadTo(36,36,56,44); p.quadTo(68,28,80,36);
+      p.moveTo(56,44); p.quadTo(68,60,80,52); p.moveTo(52,76); p.quadTo(72,60,96,68); p.quadTo(108,84,120,76); p.moveTo(96,68); p.quadTo(108,52,120,60);
+      p.moveTo(120,180); p.curveTo(160,160,164,220,204,200); p.moveTo(120,180); p.quadTo(132,200,148,192); p.moveTo(144,176); p.quadTo(156,156,176,164); p.quadTo(188,148,200,156);
+      p.moveTo(176,164); p.quadTo(188,180,200,172); p.moveTo(172,196); p.quadTo(192,180,216,188); p.quadTo(228,204,240,196); p.moveTo(216,188); p.quadTo(228,172,240,180);
+		g2.draw(p);
+	}
 }
Index: applications/editors/josm/plugins/seachart/src/symbols/Harbours.java
===================================================================
--- applications/editors/josm/plugins/seachart/src/symbols/Harbours.java	(revision 32100)
+++ applications/editors/josm/plugins/seachart/src/symbols/Harbours.java	(revision 32101)
@@ -159,6 +159,4 @@
 		LandingSteps.add(new Instr(Form.PGON, p));
 	}
-	public static final Symbol Lock_Gate = new Symbol();
-	public static final Symbol Lock = new Symbol();
 	public static final Symbol Marina = new Symbol();
 	static {
Index: applications/editors/josm/plugins/seachart/src/symbols/Notices.java
===================================================================
--- applications/editors/josm/plugins/seachart/src/symbols/Notices.java	(revision 32100)
+++ applications/editors/josm/plugins/seachart/src/symbols/Notices.java	(revision 32101)
@@ -1071,43 +1071,438 @@
   };
 
+  private static final Symbol NoticeBB = new Symbol();
+  static {
+  	NoticeBB.add(new Instr(Form.STRK, new BasicStroke(6, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)));
+  	NoticeBB.add(new Instr(Form.LINE, new Line2D.Double(-29,-29,-29,29)));
+  	NoticeBB.add(new Instr(Form.LINE, new Line2D.Double(29,-29,29,29)));
+  	NoticeBB.add(new Instr(Form.STRK, new BasicStroke(2, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)));
+  	NoticeBB.add(new Instr(Form.RRCT, new RoundRectangle2D.Double(-30,-30,60,60,4,4)));
+  }
+  
+  private static final Symbol NoticeBP = new Symbol();
+	static {
+		NoticeBP.add(new Instr(Form.STRK, new BasicStroke(2, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)));
+		NoticeBP.add(new Instr(Form.FILL, Color.white));
+		NoticeBP.add(new Instr(Form.RSHP, new RoundRectangle2D.Double(-30,-30,60,60,4,4)));
+		NoticeBP.add(new Instr(Form.FILL, Color.black));
+		NoticeBP.add(new Instr(Form.RRCT, new RoundRectangle2D.Double(-30,-30,60,60,4,4)));
+	}
+
+  private static final Symbol NoticeCR = new Symbol();
+	static {
+		NoticeCR.add(new Instr(Form.STRK, new BasicStroke(2, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)));
+		NoticeCR.add(new Instr(Form.FILL, Color.white));
+		Path2D.Double p = new Path2D.Double(); p.moveTo(0, -30); p.lineTo(-30, 0); p.lineTo(0, 30); p.lineTo(30, 0); p.closePath();
+		NoticeCR.add(new Instr(Form.PGON, p));
+		NoticeCR.add(new Instr(Form.FILL, Color.black));
+		NoticeCR.add(new Instr(Form.PLIN, p));
+	}
+
+  private static final Symbol NoticeKT = new Symbol();
+	static {
+		NoticeKT.add(new Instr(Form.STRK, new BasicStroke(2, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)));
+		NoticeKT.add(new Instr(Form.FILL, Color.white));
+		Path2D.Double p = new Path2D.Double(); p.moveTo(0,-30); p.lineTo(-30,30); p.lineTo(30,30); p.closePath();
+		NoticeKT.add(new Instr(Form.PGON, p));
+		NoticeKT.add(new Instr(Form.FILL, Color.black));
+		NoticeKT.add(new Instr(Form.PLIN, p));
+	}
+
 	public static final Symbol NoticeBnank = new Symbol();
 	static {
 		NoticeBnank.add(new Instr(Form.BBOX, new Rectangle2D.Double(-30,-30,60,60)));
 		Symbol colours = new Symbol();
-		Path2D.Double p = new Path2D.Double(); p.moveTo(0.0,-80.0); p.lineTo(-15.0,-47.0); p.lineTo(15.0,-47.0); p.closePath();
-		colours.add(new Instr(Form.P1, p));
-		p = new Path2D.Double(); p.moveTo(0.0,-10.0); p.lineTo(-15.0,-43.0); p.lineTo(15.0,-43.0); p.closePath();
-		colours.add(new Instr(Form.P2, p));
+		Symbol ss = new Symbol();
+		ss.add(new Instr(Form.RSHP, new RoundRectangle2D.Double(-30,-30,60,60,4,4)));
+		colours.add(new Instr(Form.N1, ss));
+		ss = new Symbol();
+		ss.add(new Instr(Form.SYMB, new Symbols.SubSymbol(Harbours.Anchor, 0.4, 0, 0, null, null)));
+		ss.add(new Instr(Form.STRK, new BasicStroke(6, BasicStroke.CAP_ROUND, BasicStroke.JOIN_MITER)));
+		ss.add(new Instr(Form.LINE, new Line2D.Double(-27,-27,27,27)));
+		ss.add(new Instr(Form.STRK, new BasicStroke(2, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)));
+		ss.add(new Instr(Form.RRCT, new RoundRectangle2D.Double(-30,-30,60,60,4,4)));
+		colours.add(new Instr(Form.N2, ss));
 		NoticeBnank.add(new Instr(Form.COLR, colours));
 	}
 	public static final Symbol NoticeBlmhr = new Symbol();
+	static {
+		NoticeBlmhr.add(new Instr(Form.BBOX, new Rectangle2D.Double(-30,-30,60,60)));
+		Symbol colours = new Symbol();
+		Symbol ss = new Symbol();
+		ss.add(new Instr(Form.RSHP, new RoundRectangle2D.Double(-30,-30,60,60,4,4)));
+		colours.add(new Instr(Form.N1, ss));
+		ss = new Symbol();
+		ss.add(new Instr(Form.STRK, new BasicStroke(8, BasicStroke.CAP_ROUND, BasicStroke.JOIN_MITER)));
+		Path2D.Double p = new Path2D.Double(); p.moveTo(-29,-29); p.lineTo(29,-29); p.lineTo(0,0); p.closePath();
+		ss.add(new Instr(Form.PGON, p));
+		ss.add(new Instr(Form.STRK, new BasicStroke(2, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)));
+		ss.add(new Instr(Form.RRCT, new RoundRectangle2D.Double(-30,-30,60,60,4,4)));
+		colours.add(new Instr(Form.N2, ss));
+		NoticeBlmhr.add(new Instr(Form.COLR, colours));
+	}
+	public static final Symbol NoticeBktpm = new Symbol();
+	static {
+		NoticeBktpm.add(new Instr(Form.BBOX, new Rectangle2D.Double(-30,-30,60,60)));
+		Symbol colours = new Symbol();
+		Symbol ss = new Symbol();
+		ss.add(new Instr(Form.RSHP, new RoundRectangle2D.Double(-30,-30,60,60,4,4)));
+		colours.add(new Instr(Form.N1, ss));
+		ss = new Symbol();
+		Path2D.Double p = new Path2D.Double(); p.moveTo(-14,-26); p.lineTo(-20,-12); p.lineTo(-8,-12); p.closePath();
+		ss.add(new Instr(Form.PGON, p));
+  	ss.add(new Instr(Form.STRK, new BasicStroke(6, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)));
+  	ss.add(new Instr(Form.LINE, new Line2D.Double(-14,-16,-14,25)));
+		ss.add(new Instr(Form.SYMB, new Symbols.SubSymbol(NoticeBB, 1.0, 0, 0, null, null)));
+		colours.add(new Instr(Form.N2, ss));
+		NoticeBktpm.add(new Instr(Form.COLR, colours));
+	}
+	public static final Symbol NoticeBktsm = new Symbol();
+	static {
+		NoticeBktsm.add(new Instr(Form.BBOX, new Rectangle2D.Double(-30,-30,60,60)));
+		Symbol colours = new Symbol();
+		Symbol ss = new Symbol();
+		ss.add(new Instr(Form.RSHP, new RoundRectangle2D.Double(-30,-30,60,60,4,4)));
+		colours.add(new Instr(Form.N1, ss));
+		ss = new Symbol();
+		Path2D.Double p = new Path2D.Double(); p.moveTo(14,-26); p.lineTo(20,-12); p.lineTo(8,-12); p.closePath();
+		ss.add(new Instr(Form.PGON, p));
+  	ss.add(new Instr(Form.STRK, new BasicStroke(6, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)));
+  	ss.add(new Instr(Form.LINE, new Line2D.Double(14,-16,14,25)));
+		ss.add(new Instr(Form.SYMB, new Symbols.SubSymbol(NoticeBB, 1.0, 0, 0, null, null)));
+		colours.add(new Instr(Form.N2, ss));
+		NoticeBktsm.add(new Instr(Form.COLR, colours));
+	}
+	public static final Symbol NoticeBktmr = new Symbol();
+	static {
+		NoticeBktmr.add(new Instr(Form.BBOX, new Rectangle2D.Double(-30,-30,60,60)));
+		Symbol colours = new Symbol();
+		Symbol ss = new Symbol();
+		ss.add(new Instr(Form.RSHP, new RoundRectangle2D.Double(-30,-30,60,60,4,4)));
+		colours.add(new Instr(Form.N1, ss));
+		ss = new Symbol();
+		Path2D.Double p = new Path2D.Double(); p.moveTo(0,-26); p.lineTo(-6,-12); p.lineTo(6,-12); p.closePath();
+		ss.add(new Instr(Form.PGON, p));
+  	ss.add(new Instr(Form.STRK, new BasicStroke(6, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)));
+  	ss.add(new Instr(Form.LINE, new Line2D.Double(0,-16,0,25)));
+		ss.add(new Instr(Form.SYMB, new Symbols.SubSymbol(NoticeBB, 1.0, 0, 0, null, null)));
+		colours.add(new Instr(Form.N2, ss));
+		NoticeBktmr.add(new Instr(Form.COLR, colours));
+	}
+	public static final Symbol NoticeBcrtp = new Symbol();
+	static {
+		NoticeBcrtp.add(new Instr(Form.BBOX, new Rectangle2D.Double(-30,-30,60,60)));
+		Symbol colours = new Symbol();
+		Symbol ss = new Symbol();
+		ss.add(new Instr(Form.RSHP, new RoundRectangle2D.Double(-30,-30,60,60,4,4)));
+		colours.add(new Instr(Form.N1, ss));
+		ss = new Symbol();
+		Path2D.Double p = new Path2D.Double(); p.moveTo(-14,-26); p.lineTo(-20,-12); p.lineTo(-8,-12); p.closePath();
+		ss.add(new Instr(Form.PGON, p));
+  	ss.add(new Instr(Form.STRK, new BasicStroke(6, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)));
+		p = new Path2D.Double(); p.moveTo(-14,-16); p.lineTo(-14,0); p.lineTo(14,10); p.lineTo(14,25);
+		ss.add(new Instr(Form.PLIN, p));
+		ss.add(new Instr(Form.SYMB, new Symbols.SubSymbol(NoticeBB, 1.0, 0, 0, null, null)));
+		colours.add(new Instr(Form.N2, ss));
+		NoticeBcrtp.add(new Instr(Form.COLR, colours));
+	}
+	public static final Symbol NoticeBcrts = new Symbol();
+	static {
+		NoticeBcrts.add(new Instr(Form.BBOX, new Rectangle2D.Double(-30,-30,60,60)));
+		Symbol colours = new Symbol();
+		Symbol ss = new Symbol();
+		ss.add(new Instr(Form.RSHP, new RoundRectangle2D.Double(-30,-30,60,60,4,4)));
+		colours.add(new Instr(Form.N1, ss));
+		ss = new Symbol();
+		Path2D.Double p = new Path2D.Double(); p.moveTo(14,-26); p.lineTo(20,-12); p.lineTo(8,-12); p.closePath();
+		ss.add(new Instr(Form.PGON, p));
+  	ss.add(new Instr(Form.STRK, new BasicStroke(6, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)));
+		p = new Path2D.Double(); p.moveTo(14,-16); p.lineTo(14,0); p.lineTo(-14,10); p.lineTo(-14,25);
+		ss.add(new Instr(Form.PLIN, p));
+		ss.add(new Instr(Form.SYMB, new Symbols.SubSymbol(NoticeBB, 1.0, 0, 0, null, null)));
+		colours.add(new Instr(Form.N2, ss));
+		NoticeBcrts.add(new Instr(Form.COLR, colours));
+	}
+	public static final Symbol NoticeBtrbm = new Symbol();
+	static {
+		NoticeBtrbm.add(new Instr(Form.BBOX, new Rectangle2D.Double(-30,-30,60,60)));
+		Symbol colours = new Symbol();
+		Symbol ss = new Symbol();
+		ss.add(new Instr(Form.RSHP, new RoundRectangle2D.Double(-30,-30,60,60,4,4)));
+		colours.add(new Instr(Form.N1, ss));
+		ss = new Symbol();
+  	ss.add(new Instr(Form.STRK, new BasicStroke(15, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)));
+  	ss.add(new Instr(Form.LINE, new Line2D.Double(0,-25,0,25)));
+  	ss.add(new Instr(Form.STRK, new BasicStroke(8, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)));
+  	ss.add(new Instr(Form.LINE, new Line2D.Double(-20,0,20,0)));
+		ss.add(new Instr(Form.SYMB, new Symbols.SubSymbol(NoticeBB, 1.0, 0, 0, null, null)));
+		colours.add(new Instr(Form.N2, ss));
+		NoticeBtrbm.add(new Instr(Form.COLR, colours));
+	}
+	public static final Symbol NoticeBrspd = new Symbol();
+	static {
+		NoticeBrspd.add(new Instr(Form.BBOX, new Rectangle2D.Double(-30,-30,60,60)));
+		Symbol colours = new Symbol();
+		Symbol ss = new Symbol();
+		ss.add(new Instr(Form.RSHP, new RoundRectangle2D.Double(-30,-30,60,60,4,4)));
+		colours.add(new Instr(Form.N1, ss));
+		ss = new Symbol();
+		ss.add(new Instr(Form.TEXT, new Caption("R", new Font("Arial", Font.BOLD, 60), null, new Delta(Handle.CC, null))));
+		ss.add(new Instr(Form.SYMB, new Symbols.SubSymbol(NoticeBB, 1.0, 0, 0, null, null)));
+		colours.add(new Instr(Form.N2, ss));
+		NoticeBrspd.add(new Instr(Form.COLR, colours));
+	}
+	static final Symbol NoticePBwral = new Symbol();
+	static {
+		NoticePBwral.add(new Instr(Form.BBOX, new Rectangle2D.Double(-30,-30,60,60)));
+		NoticePBwral.add(new Instr(Form.FILL, new Color(0xffff00)));
+		Path2D.Double p = new Path2D.Double(); p.moveTo(-20,-25); p.lineTo(-8,-5); p.lineTo(-8,25); p.lineTo(8,25); p.lineTo(8,-5);
+		p.lineTo(20,-25); p.lineTo(5,-25); p.lineTo(-5,-10); p.lineTo(-15,-25); p.closePath();
+		NoticePBwral.add(new Instr(Form.PGON, p));
+	}
 	public static final Symbol NoticeBwral = new Symbol();
-	public static final Symbol NoticeBwrar = new Symbol();
-	public static final Symbol NoticeBktpm = new Symbol();
-	public static final Symbol NoticeBktsm = new Symbol();
-	public static final Symbol NoticeBktmr = new Symbol();
-	public static final Symbol NoticeBcrtp = new Symbol();
-	public static final Symbol NoticeBcrts = new Symbol();
-	public static final Symbol NoticeBtrbm = new Symbol();
-	public static final Symbol NoticeBrspd = new Symbol();
+	static {
+		NoticeBwral.add(new Instr(Form.BBOX, new Rectangle2D.Double(-30,-30,60,60)));
+		NoticeBwral.add(new Instr(Form.FILL, Color.black));
+		NoticeBwral.add(new Instr(Form.RSHP, new RoundRectangle2D.Double(-30,-30,60,60,4,4)));
+		NoticeBwral.add(new Instr(Form.SYMB, new Symbols.SubSymbol(NoticePBwral, 1.0, 0, 0, null, null)));
+	}
+	public static final Symbol NoticeBwlar = new Symbol();
+	static {
+		NoticeBwlar.add(new Instr(Form.BBOX, new Rectangle2D.Double(-30,-30,60,60)));
+		NoticeBwlar.add(new Instr(Form.FILL, Color.black));
+		NoticeBwlar.add(new Instr(Form.RSHP, new RoundRectangle2D.Double(-30,-30,60,60,4,4)));
+		NoticeBwlar.add(new Instr(Form.SYMB, new Symbols.SubSymbol(NoticePBwral, 1.0, 0, 0, null, new Delta(Handle.CC, AffineTransform.getScaleInstance(-1, 1)))));
+	}
+	public static final Symbol NoticeBoptr = new Symbol();
+	static {
+		NoticeBoptr.add(new Instr(Form.BBOX, new Rectangle2D.Double(-30,-30,60,60)));
+		NoticeBoptr.add(new Instr(Form.SYMB, new Symbols.SubSymbol(NoticeBP, 1.0, 0, 0, null, null)));
+		NoticeBoptr.add(new Instr(Form.FILL, new Color(0x00a000)));
+		NoticeBoptr.add(new Instr(Form.RSHP, new Rectangle2D.Double(-20,-20,40,40)));
+	}
+	public static final Symbol NoticeBoptl = new Symbol();
+	static {
+		NoticeBoptl.add(new Instr(Form.BBOX, new Rectangle2D.Double(-30,-30,60,60)));
+		NoticeBoptl.add(new Instr(Form.SYMB, new Symbols.SubSymbol(NoticeBP, 1.0, 0, 0, null, null)));
+		NoticeBoptl.add(new Instr(Form.FILL, new Color(0xf00000)));
+		Path2D.Double p = new Path2D.Double(); p.moveTo(0,-20); p.lineTo(-20,20); p.lineTo(20,20); p.closePath();
+		NoticeBoptl.add(new Instr(Form.PGON, p));
+	}
 	public static final EnumMap<CatNMK, Symbol> NmkBniwr = new EnumMap<CatNMK, Symbol>(CatNMK.class);
 	static {
-		NmkBniwr.put(CatNMK.NMK_NANK, NoticeBnank); NmkBniwr.put(CatNMK.NMK_LMHR, NoticeBlmhr); NmkBniwr.put(CatNMK.NMK_OPTR, NoticeD2a); NmkBniwr.put(CatNMK.NMK_OPTL, NoticeD2b);
-		NmkBniwr.put(CatNMK.NMK_WRAL, NoticeBwral); NmkBniwr.put(CatNMK.NMK_WLAR, NoticeBwrar); NmkBniwr.put(CatNMK.NMK_KTPM, NoticeBktpm); NmkBniwr.put(CatNMK.NMK_KTSM, NoticeBktsm);
+		NmkBniwr.put(CatNMK.NMK_NANK, NoticeBnank); NmkBniwr.put(CatNMK.NMK_LMHR, NoticeBlmhr); NmkBniwr.put(CatNMK.NMK_OPTR, NoticeBoptr); NmkBniwr.put(CatNMK.NMK_OPTL, NoticeBoptl);
+		NmkBniwr.put(CatNMK.NMK_WRAL, NoticeBwral); NmkBniwr.put(CatNMK.NMK_WLAR, NoticeBwlar); NmkBniwr.put(CatNMK.NMK_KTPM, NoticeBktpm); NmkBniwr.put(CatNMK.NMK_KTSM, NoticeBktsm);
 		NmkBniwr.put(CatNMK.NMK_KTMR, NoticeBktmr); NmkBniwr.put(CatNMK.NMK_CRTP, NoticeBcrtp); NmkBniwr.put(CatNMK.NMK_CRTS, NoticeBcrts); NmkBniwr.put(CatNMK.NMK_TRBM, NoticeBtrbm);
 		NmkBniwr.put(CatNMK.NMK_RSPD, NoticeBrspd);
 	}
+	public static final Symbol NoticePwralL = new Symbol();
+	static {
+		NoticePwralL.add(new Instr(Form.BBOX, new Rectangle2D.Double(-30,-30,60,60)));
+		NoticePwralL.add(new Instr(Form.FILL, Color.black));
+		Path2D.Double p = new Path2D.Double(); p.moveTo(0,-30); p.lineTo(-30,30); p.lineTo(30,30); p.closePath();
+		NoticePwralL.add(new Instr(Form.PGON, p));
+		NoticePwralL.add(new Instr(Form.SYMB, new Symbols.SubSymbol(NoticePBwral, 1.0, 0, 0, null, new Delta(Handle.TC, AffineTransform.getScaleInstance(0.5, 0.5)))));
+	}
+	public static final Symbol NoticePwralR = new Symbol();
+	static {
+		NoticePwralR.add(new Instr(Form.BBOX, new Rectangle2D.Double(-30,-30,60,60)));
+		NoticePwralR.add(new Instr(Form.SYMB, new Symbols.SubSymbol(NoticeBwral, 1.0, 0, 0, null, null)));
+	}
+	public static final Symbol NoticePwlarL = new Symbol();
+	static {
+		NoticePwlarL.add(new Instr(Form.BBOX, new Rectangle2D.Double(-30,-30,60,60)));
+		NoticePwlarL.add(new Instr(Form.FILL, Color.black));
+		Path2D.Double p = new Path2D.Double(); p.moveTo(0,-30); p.lineTo(-30,30); p.lineTo(30,30); p.closePath();
+		NoticePwlarL.add(new Instr(Form.PGON, p));
+		NoticePwlarL.add(new Instr(Form.SYMB, new Symbols.SubSymbol(NoticePBwral, 1.0, 0, 0, null, new Delta(Handle.TC, AffineTransform.getScaleInstance(-0.5, 0.5)))));
+	}
+	public static final Symbol NoticePwlarR = new Symbol();
+	static {
+		NoticePwlarR.add(new Instr(Form.BBOX, new Rectangle2D.Double(-30,-30,60,60)));
+		NoticePwlarR.add(new Instr(Form.SYMB, new Symbols.SubSymbol(NoticeBwlar, 1.0, 0, 0, null, null)));
+	}
+	public static final Symbol NoticePktmR = new Symbol();
+	static {
+		NoticePktmR.add(new Instr(Form.BBOX, new Rectangle2D.Double(-30,-30,60,60)));
+		NoticePktmR.add(new Instr(Form.SYMB, new Symbols.SubSymbol(NoticeBP, 1.0, 0, 0, null, null)));
+		NoticePktmR.add(new Instr(Form.STRK, new BasicStroke(8, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)));
+		NoticePktmR.add(new Instr(Form.FILL, new Color(0x00d400)));
+		NoticePktmR.add(new Instr(Form.RECT, new Rectangle2D.Double(-20,-20,40,40)));
+	}
+	public static final Symbol NoticePktmL = new Symbol();
+	static {
+		NoticePktmL.add(new Instr(Form.BBOX, new Rectangle2D.Double(-30,-30,60,60)));
+		NoticePktmL.add(new Instr(Form.SYMB, new Symbols.SubSymbol(NoticeKT, 1.0, 0, 0, null, null)));
+		NoticePktmL.add(new Instr(Form.STRK, new BasicStroke(6, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)));
+		NoticePktmL.add(new Instr(Form.FILL, new Color(0xd40000)));
+		NoticePktmL.add(new Instr(Form.RECT, new Rectangle2D.Double(-12,2,24,24)));
+	}
+	public static final Symbol NoticePktmrL = new Symbol();
+	static {
+		NoticePktmrL.add(new Instr(Form.BBOX, new Rectangle2D.Double(-30,-30,60,60)));
+		NoticePktmrL.add(new Instr(Form.SYMB, new Symbols.SubSymbol(NoticeKT, 1.0, 0, 0, null, null)));
+		NoticePktmrL.add(new Instr(Form.STRK, new BasicStroke(6, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)));
+		NoticePktmrL.add(new Instr(Form.FILL, new Color(0xd40000)));
+		NoticePktmrL.add(new Instr(Form.LINE, new Line2D.Double(-12,2,-12,28)));
+		NoticePktmrL.add(new Instr(Form.LINE, new Line2D.Double(12,2,12,28)));
+		NoticePktmrL.add(new Instr(Form.LINE, new Line2D.Double(-12,15,12,15)));
+	}
+	public static final Symbol NoticePktmrR = new Symbol();
+	static {
+		NoticePktmrR.add(new Instr(Form.BBOX, new Rectangle2D.Double(-30,-30,60,60)));
+		NoticePktmrR.add(new Instr(Form.SYMB, new Symbols.SubSymbol(NoticeBP, 1.0, 0, 0, null, null)));
+		NoticePktmrR.add(new Instr(Form.STRK, new BasicStroke(8, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)));
+		NoticePktmrR.add(new Instr(Form.FILL, new Color(0x00d400)));
+		NoticePktmrR.add(new Instr(Form.LINE, new Line2D.Double(-15,-20,-15,20)));
+		NoticePktmrR.add(new Instr(Form.LINE, new Line2D.Double(15,-20,15,20)));
+		NoticePktmrR.add(new Instr(Form.LINE, new Line2D.Double(-15,0,15,0)));
+	}
+	public static final Symbol NoticePcrL = new Symbol();
+	static {
+		NoticePcrL.add(new Instr(Form.BBOX, new Rectangle2D.Double(-30,-30,60,60)));
+		NoticePcrL.add(new Instr(Form.BBOX, new Rectangle2D.Double(-30,-30,60,60)));
+		NoticePcrL.add(new Instr(Form.SYMB, new Symbols.SubSymbol(NoticeCR, 1.0, 0, 0, null, null)));
+		NoticePcrL.add(new Instr(Form.STRK, new BasicStroke(6, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)));
+		NoticePcrL.add(new Instr(Form.FILL, new Color(0xd40000)));
+		NoticePcrL.add(new Instr(Form.LINE, new Line2D.Double(-12,-12,12,12)));
+		NoticePcrL.add(new Instr(Form.LINE, new Line2D.Double(-12,12,12,-12)));
+	}
+	public static final Symbol NoticePcrR = new Symbol();
+	static {
+		NoticePcrR.add(new Instr(Form.BBOX, new Rectangle2D.Double(-30,-30,60,60)));
+		NoticePcrR.add(new Instr(Form.SYMB, new Symbols.SubSymbol(NoticeCR, 1.0, 0, 0, null, null)));
+		NoticePcrR.add(new Instr(Form.STRK, new BasicStroke(6, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)));
+		NoticePcrR.add(new Instr(Form.FILL, new Color(0x00d400)));
+		NoticePcrR.add(new Instr(Form.LINE, new Line2D.Double(-12,-12,12,12)));
+		NoticePcrR.add(new Instr(Form.LINE, new Line2D.Double(-12,12,12,-12)));
+	}
+	static final Symbol NoticeRphib = new Symbol();
+	static {
+		NoticeRphib.add(new Instr(Form.STRK, new BasicStroke(6, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)));
+		NoticeRphib.add(new Instr(Form.FILL, new Color(0xd40000)));
+		NoticeRphib.add(new Instr(Form.ELPS, new Ellipse2D.Double(-30,-30,60,60)));
+		NoticeRphib.add(new Instr(Form.LINE, new Line2D.Double(-20,-20,20,20)));
+	}
+	static final Symbol NoticeRinfo = new Symbol();
+	static {
+		NoticeRinfo.add(new Instr(Form.STRK, new BasicStroke(6, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)));
+		NoticeRinfo.add(new Instr(Form.FILL, new Color(0xd40000)));
+		NoticeRinfo.add(new Instr(Form.RECT, new Rectangle2D.Double(-30,-30,60,60)));
+	}
+	public static final Symbol NoticeRnpas = new Symbol();
+	static {
+		NoticeRnpas.add(new Instr(Form.BBOX, new Rectangle2D.Double(-30,-30,60,60)));
+		NoticeRnpas.add(new Instr(Form.SYMB, new Symbols.SubSymbol(NoticeRphib, 1.0, 0, 0, null, null)));
+		NoticeRnpas.add(new Instr(Form.FILL, Color.black));
+		Path2D.Double p = new Path2D.Double(); p.moveTo(-10,-15); p.lineTo(-10,8); p.lineTo(-6,8); p.lineTo(-12.5,16); p.lineTo(-19,8); p.lineTo(-15,8); p.lineTo(-15,-15);
+		p.closePath(); p.moveTo(10,15); p.lineTo(10,-8); p.lineTo(6,-8); p.lineTo(12.5,-16); p.lineTo(19,-8); p.lineTo(15,-8); p.lineTo(15,15); p.closePath();
+		NoticeRnpas.add(new Instr(Form.PGON, p));
+	}
+	public static final Symbol NoticeRnank = new Symbol();
+	static {
+		NoticeRnank.add(new Instr(Form.BBOX, new Rectangle2D.Double(-30,-30,60,60)));
+		NoticeRnank.add(new Instr(Form.SYMB, new Symbols.SubSymbol(NoticeRphib, 1.0, 0, 0, null, null)));
+		NoticeRnank.add(new Instr(Form.SYMB, new Symbols.SubSymbol(Harbours.Anchor, 0.4, 0, 0, new Scheme(Color.black), null)));
+	}
+	public static final Symbol NoticeRnwsh = new Symbol();
+	static {
+		NoticeRnwsh.add(new Instr(Form.BBOX, new Rectangle2D.Double(-30,-30,60,60)));
+		NoticeRnwsh.add(new Instr(Form.SYMB, new Symbols.SubSymbol(NoticeRphib, 1.0, 0, 0, null, null)));
+		NoticeRnwsh.add(new Instr(Form.FILL, Color.black));
+		Path2D.Double p = new Path2D.Double(); p.moveTo(-23,10); p.curveTo(-11,10,-12,4,0,4); p.curveTo(12,4,11,10,23,10);
+		p.moveTo(-23,-3); p.curveTo(-11,-3,-12,-9,0,-9); p.curveTo(12,-9,11,-3,23,-3);
+		NoticeRnwsh.add(new Instr(Form.PLIN, p));
+	}
+	public static final Symbol NoticeRlmhr = new Symbol();
+	static {
+		NoticeRlmhr.add(new Instr(Form.BBOX, new Rectangle2D.Double(-30,-30,60,60)));
+		NoticeRlmhr.add(new Instr(Form.SYMB, new Symbols.SubSymbol(NoticeRinfo, 1.0, 0, 0, null, null)));
+		NoticeRlmhr.add(new Instr(Form.FILL, Color.black));
+		Path2D.Double p = new Path2D.Double(); p.moveTo(0,-10); p.lineTo(27,-27); p.lineTo(-27,-27); p.closePath();
+		NoticeRlmhr.add(new Instr(Form.PGON, p));
+	}
+	public static final Symbol NoticeRtrna = new Symbol();
+	static {
+		NoticeRtrna.add(new Instr(Form.BBOX, new Rectangle2D.Double(-30,-30,60,60)));
+		NoticeRtrna.add(new Instr(Form.SYMB, new Symbols.SubSymbol(NoticeCR, 1.0, 0, 0, null, null)));
+		NoticeRtrna.add(new Instr(Form.STRK, new BasicStroke(5, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)));
+		NoticeRtrna.add(new Instr(Form.EARC, new Arc2D.Double(-15.0,-15.0,30.0,30.0,315.0,-280.0,Arc2D.OPEN)));
+		Path2D.Double p = new Path2D.Double(); p.moveTo(18.8,-2.0); p.lineTo(15.8,-13.2); p.lineTo(7.5,-5.0); p.closePath();
+		NoticeRtrna.add(new Instr(Form.PGON, p));
+	}
+	public static final Symbol NoticeRncps = new Symbol();
+	static {
+		NoticeRncps.add(new Instr(Form.BBOX, new Rectangle2D.Double(-30,-30,60,60)));
+		NoticeRncps.add(new Instr(Form.SYMB, new Symbols.SubSymbol(NoticeRphib, 1.0, 0, 0, null, null)));
+		NoticeRncps.add(new Instr(Form.FILL, Color.black));
+		Path2D.Double p = new Path2D.Double(); p.moveTo(-10,0); p.lineTo(-10,8); p.lineTo(-6,8); p.lineTo(-12.5,16); p.lineTo(-19,8); p.lineTo(-15,8); p.lineTo(-15,0);
+		p.closePath(); p.moveTo(10,0); p.lineTo(10,-8); p.lineTo(6,-8); p.lineTo(12.5,-16); p.lineTo(19,-8); p.lineTo(15,-8); p.lineTo(15,0); p.closePath();
+		NoticeRncps.add(new Instr(Form.PGON, p));
+	}
+	public static final Symbol NoticeRnsmc = new Symbol();
+	static {
+		NoticeRnsmc.add(new Instr(Form.BBOX, new Rectangle2D.Double(-30,-30,60,60)));
+		NoticeRnsmc.add(new Instr(Form.SYMB, new Symbols.SubSymbol(NoticeRphib, 1.0, 0, 0, null, null)));
+		NoticeRnsmc.add(new Instr(Form.FILL, Color.black));
+		Path2D.Double p = new Path2D.Double(); p.moveTo(-15,5); p.lineTo(15,5); p.lineTo(25,-10); p.lineTo(12,-5); p.lineTo(-18,-1); p.closePath();
+		p.moveTo(-23,2); p.lineTo(-21,10); p.lineTo(-18,8); p.lineTo(-20,0); p.closePath();
+		NoticeRnsmc.add(new Instr(Form.PGON, p));
+	}
+	public static final Symbol NoticeRattn = new Symbol();
+	static {
+		NoticeRattn.add(new Instr(Form.BBOX, new Rectangle2D.Double(-30,-30,60,60)));
+		NoticeRattn.add(new Instr(Form.SYMB, new Symbols.SubSymbol(NoticeRinfo, 1.0, 0, 0, null, null)));
+		NoticeRattn.add(new Instr(Form.STRK, new BasicStroke(6, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)));
+		NoticeRattn.add(new Instr(Form.FILL, Color.black));
+		NoticeRattn.add(new Instr(Form.LINE, new Line2D.Double(0,-20,0,10)));
+		NoticeRattn.add(new Instr(Form.LINE, new Line2D.Double(0,15,0,20)));
+	}
+	public static final Symbol NoticeRfwcr = new Symbol();
+	static {
+		NoticeRfwcr.add(new Instr(Form.BBOX, new Rectangle2D.Double(-30,-30,60,60)));
+		NoticeRfwcr.add(new Instr(Form.SYMB, new Symbols.SubSymbol(NoticeRinfo, 1.0, 0, 0, null, null)));
+		NoticeRfwcr.add(new Instr(Form.FILL, Color.black));
+		Path2D.Double p = new Path2D.Double(); p.moveTo(0,-25); p.lineTo(-8,-15); p.lineTo(-8,5); p.lineTo(-20,5); p.lineTo(-20,15); p.lineTo(-8,15); p.lineTo(-8,25);
+		p.lineTo(8,25); p.lineTo(8,15); p.lineTo(20,15); p.lineTo(20,5); p.lineTo(8,5); p.lineTo(8,-15); p.closePath();
+		NoticeRfwcr.add(new Instr(Form.PGON, p));
+	}
+	public static final Symbol NoticeRship = new Symbol();
+	static {
+		NoticeRship.add(new Instr(Form.BBOX, new Rectangle2D.Double(-30,-30,60,60)));
+		NoticeRship.add(new Instr(Form.SYMB, new Symbols.SubSymbol(NoticeCR, 1.0, 0, 0, null, null)));
+		NoticeRship.add(new Instr(Form.STRK, new BasicStroke(4, BasicStroke.CAP_ROUND, BasicStroke.JOIN_MITER)));
+		NoticeRship.add(new Instr(Form.FILL, Color.black));
+		NoticeRship.add(new Instr(Form.LINE, new Line2D.Double(-12,-12,10,10)));
+		NoticeRship.add(new Instr(Form.LINE, new Line2D.Double(-12,-8,-8,-12)));
+		NoticeRship.add(new Instr(Form.LINE, new Line2D.Double(12,-12,-10,10)));
+		NoticeRship.add(new Instr(Form.LINE, new Line2D.Double(12,-8,8,-12)));
+		NoticeRship.add(new Instr(Form.EARC, new Arc2D.Double(-17,-13,30,30,185,80,Arc2D.OPEN)));
+		NoticeRship.add(new Instr(Form.EARC, new Arc2D.Double(-13,-13,30,30,275,80,Arc2D.OPEN)));
+	}
 
-	public static final EnumMap<CatNMK, Symbol> NmkPpwbc = new EnumMap<CatNMK, Symbol>(CatNMK.class);
-	static {
-		NmkPpwbc.put(CatNMK.NMK_WRAL, Notice); NmkPpwbc.put(CatNMK.NMK_WLAR, Notice); NmkPpwbc.put(CatNMK.NMK_KTPM, Notice); NmkPpwbc.put(CatNMK.NMK_KTSM, Notice);
-		NmkPpwbc.put(CatNMK.NMK_KTMR, Notice); NmkPpwbc.put(CatNMK.NMK_CRTP, Notice); NmkPpwbc.put(CatNMK.NMK_CRTS, Notice);
+	public static final EnumMap<CatNMK, Symbol> NmkPpwbcl = new EnumMap<CatNMK, Symbol>(CatNMK.class);
+	static {
+		NmkPpwbcl.put(CatNMK.NMK_WRAL, NoticePwralL); NmkPpwbcl.put(CatNMK.NMK_WLAR, NoticePwlarL); NmkPpwbcl.put(CatNMK.NMK_KTPM, NoticePktmL); NmkPpwbcl.put(CatNMK.NMK_KTSM, NoticePktmL);
+		NmkPpwbcl.put(CatNMK.NMK_KTMR, NoticePktmrL); NmkPpwbcl.put(CatNMK.NMK_CRTP, NoticePcrL); NmkPpwbcl.put(CatNMK.NMK_CRTS, NoticePcrL);
+	}
+	
+	public static final EnumMap<CatNMK, Symbol> NmkPpwbcr = new EnumMap<CatNMK, Symbol>(CatNMK.class);
+	static {
+		NmkPpwbcr.put(CatNMK.NMK_WRAL, NoticePwralR); NmkPpwbcr.put(CatNMK.NMK_WLAR, NoticePwlarR); NmkPpwbcr.put(CatNMK.NMK_KTPM, NoticePktmR); NmkPpwbcr.put(CatNMK.NMK_KTSM, NoticePktmR);
+		NmkPpwbcr.put(CatNMK.NMK_KTMR, NoticePktmrR); NmkPpwbcr.put(CatNMK.NMK_CRTP, NoticePcrR); NmkPpwbcr.put(CatNMK.NMK_CRTS, NoticePcrR);
+	}
+	
+	public static final EnumMap<CatNMK, Symbol> NmkRiwr = new EnumMap<CatNMK, Symbol>(CatNMK.class);
+	static {
+		NmkRiwr.put(CatNMK.NMK_NPAS, NoticeRnpas); NmkRiwr.put(CatNMK.NMK_NANK, NoticeRnank); NmkRiwr.put(CatNMK.NMK_NWSH, NoticeRnwsh); NmkRiwr.put(CatNMK.NMK_LMHR, NoticeRlmhr); NmkRiwr.put(CatNMK.NMK_TRNA, NoticeRtrna);
+		NmkRiwr.put(CatNMK.NMK_NCPS, NoticeRncps); NmkRiwr.put(CatNMK.NMK_NSMC, NoticeRnsmc); NmkRiwr.put(CatNMK.NMK_ATTN, NoticeRattn); NmkRiwr.put(CatNMK.NMK_FWCR, NoticeRfwcr); NmkRiwr.put(CatNMK.NMK_SHIP, NoticeRship);
 	}
 	
 	public static Scheme getScheme(MarSYS sys, BnkWTW bank) {
 		ArrayList<Color> colours = new ArrayList<Color>();
-		Scheme scheme = new Scheme(null, colours);
+		Scheme scheme = new Scheme(colours);
 		switch (sys) {
 		case SYS_BNWR:
+		case SYS_BWR2:
 			switch (bank) {
 			case BWW_LEFT:
@@ -1125,18 +1520,4 @@
 			}
 			break;
-		case SYS_PPWB:
-			switch (bank) {
-			case BWW_LEFT:
-				colours.add(Color.white);
-				colours.add(new Color(0xd40000));
-				break;
-			case BWW_RGHT:
-				colours.add(Color.white);
-				colours.add(new Color(0x00d400));
-				break;
-			default:
-				break;
-			}
-			break;
 		default:
 			break;
@@ -1145,5 +1526,5 @@
 	}
 	
-	public static Symbol getNotice(CatNMK cat, MarSYS sys) {
+	public static Symbol getNotice(CatNMK cat, MarSYS sys, BnkWTW bank) {
 		Symbol symbol = null;
 		switch (sys) {
@@ -1152,8 +1533,21 @@
 			break;
 		case SYS_BNWR:
+		case SYS_BWR2:
 			symbol = NmkBniwr.get(cat);
 			break;
 		case SYS_PPWB:
-			symbol = NmkPpwbc.get(cat);
+			switch (bank) {
+			case BWW_LEFT:
+				symbol = NmkPpwbcl.get(cat);
+				break;
+			case BWW_RGHT:
+				symbol = NmkPpwbcr.get(cat);
+				break;
+			default:
+				break;
+			}
+			break;
+		case SYS_RIWR:
+			symbol = NmkRiwr.get(cat);
 			break;
 		default:
Index: applications/editors/josm/plugins/seachart/src/symbols/Symbols.java
===================================================================
--- applications/editors/josm/plugins/seachart/src/symbols/Symbols.java	(revision 32100)
+++ applications/editors/josm/plugins/seachart/src/symbols/Symbols.java	(revision 32101)
@@ -25,8 +25,8 @@
 	public static final Color Mline = new Color(0x9a6078);
 	public static final Color Msymb = new Color(0xa30075);
-	public static final Color Mtss = new Color(0x80c480ff, true);
+	public static final Color Mtss = new Color(0xc0c480ff, true);
 	
 	public enum Form {
-		BBOX, STRK, COLR, FILL, LINE, RECT, RRCT, ELPS, EARC, PLIN, PGON, RSHP, TEXT, SYMB, P1, P2, H2, H3, H4, H5, V2, V3, D2, D3, D4, B1, S2, S3, S4, C2, X2
+		BBOX, STRK, COLR, FILL, LINE, RECT, RRCT, ELPS, EARC, PLIN, PGON, RSHP, TEXT, SYMB, N1, N2, P1, P2, H2, H3, H4, H5, V2, V3, D2, D3, D4, B1, S2, S3, S4, C2, X2
 	}
 
@@ -67,4 +67,8 @@
 		public ArrayList<Color> col;
 
+		public Scheme(ArrayList<Color> icol) {
+			pat = new ArrayList<Patt>();
+			col = icol;
+		}
 		public Scheme(ArrayList<Patt> ipat, ArrayList<Color> icol) {
 			pat = ipat;
@@ -233,4 +237,16 @@
 						for (Instr patch : (Symbol) item.params) {
 							switch (patch.type) {
+							case N1:
+								if (cn > 0) {
+									Symbol s = (Symbol) patch.params;
+									drawSymbol(g2, s, 1.0, 0, 0, new Scheme(cs.col.get(0)), null);
+								}
+								break;
+							case N2:
+								if (cn > 0) {
+									Symbol s = (Symbol) patch.params;
+									drawSymbol(g2, s, 1.0, 0, 0, new Scheme((cn > 1) ? cs.col.get(1) : cs.col.get(0)), null);
+								}
+								break;
 							case P1:
 								if (cn > 0) {
@@ -288,4 +304,22 @@
 								if (bpat == Patt.B) {
 									g2.setPaint(bcol);
+									g2.fill((Path2D.Double) patch.params);
+								}
+								break;
+							case S2:
+								if ((cn > 1) && (pn > 0) && (cs.pat.get(0) == Patt.S)) {
+									g2.setPaint(cs.col.get(1));
+									g2.fill((Path2D.Double) patch.params);
+								}
+								break;
+							case S3:
+								if ((cn > 2) && (pn > 0) && (cs.pat.get(0) == Patt.S)) {
+									g2.setPaint(cs.col.get(2));
+									g2.fill((Path2D.Double) patch.params);
+								}
+								break;
+							case S4:
+								if ((cn == 4) && (pn > 0) && (cs.pat.get(0) == Patt.S)) {
+									g2.setPaint(cs.col.get(3));
 									g2.fill((Path2D.Double) patch.params);
 								}
Index: applications/editors/josm/plugins/seachart/src/symbols/Topmarks.java
===================================================================
--- applications/editors/josm/plugins/seachart/src/symbols/Topmarks.java	(revision 32100)
+++ applications/editors/josm/plugins/seachart/src/symbols/Topmarks.java	(revision 32101)
@@ -117,4 +117,35 @@
 		TopEast.add(new Instr(Form.PLIN, p));
 	}
+	public static final Symbol TopFlag = new Symbol();
+	static {
+		TopFlag.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,-40); p.lineTo(0,-10); p.lineTo(39,-10); p.lineTo(39,-40); p.closePath();
+		colours.add(new Instr(Form.P1, p));
+		p = new Path2D.Double(); p.moveTo(0,-25); p.lineTo(0,-10); p.lineTo(40,-10); p.lineTo(39,-25); p.closePath();
+		colours.add(new Instr(Form.H2, p));
+		p = new Path2D.Double(); p.moveTo(0,-30); p.lineTo(0,-20); p.lineTo(40,-20); p.lineTo(39,-30); p.closePath();
+		colours.add(new Instr(Form.H3, p));
+		p = new Path2D.Double(); p.moveTo(19.5,-40); p.lineTo(19.5,-10); p.lineTo(39,-10); p.lineTo(39,-40); p.closePath();
+		colours.add(new Instr(Form.V2, p));
+		p = new Path2D.Double(); p.moveTo(13,-40); p.lineTo(13,-10); p.lineTo(26,-10); p.lineTo(26,-40); p.closePath();
+		colours.add(new Instr(Form.V3, p));
+		p = new Path2D.Double(); p.setWindingRule(GeneralPath.WIND_EVEN_ODD);
+		p.moveTo(0,-40); p.lineTo(0,-10); p.lineTo(39,-10); p.lineTo(39,-40); p.closePath();
+		p.moveTo(8,-35); p.lineTo(8,-15); p.lineTo(33,-15); p.lineTo(33,-35); p.closePath();
+		colours.add(new Instr(Form.B1, p));
+		p = new Path2D.Double(); p.moveTo(0,-25); p.lineTo(0,-10); p.lineTo(20,-10); p.lineTo(20,-40); p.lineTo(39,-40); p.lineTo(39,-25); p.closePath();
+		colours.add(new Instr(Form.S2, p));
+		p = new Path2D.Double(); p.moveTo(0,-25); p.lineTo(0,-10); p.lineTo(20,-10); p.lineTo(20,-25); p.closePath();
+		colours.add(new Instr(Form.S3, p));
+		p = new Path2D.Double(); p.moveTo(20,-25); p.lineTo(20,-10); p.lineTo(39,-10); p.lineTo(39,-25); p.closePath();
+		colours.add(new Instr(Form.S4, p));
+		TopFlag.add(new Instr(Form.COLR, colours));
+		TopFlag.add(new Instr(Form.STRK, new BasicStroke(4, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)));
+		TopFlag.add(new Instr(Form.FILL, Color.black));
+		TopFlag.add(new Instr(Form.LINE, new Line2D.Double(0,0,0,-45)));
+		TopFlag.add(new Instr(Form.STRK, new BasicStroke(2, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)));
+		TopFlag.add(new Instr(Form.RECT, new Rectangle2D.Double(0,-40,39,30)));
+	}
 	public static final Symbol TopIcone = new Symbol();
 	static {
@@ -321,6 +352,9 @@
 		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_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
+	 */
 	public static final EnumMap<BoySHP, Delta> BuoyDeltas = new EnumMap<BoySHP, Delta>(BoySHP.class);
 	static {
