Index: applications/editors/josm/plugins/smed2/src/seamap/Renderer.java
===================================================================
--- applications/editors/josm/plugins/smed2/src/seamap/Renderer.java	(revision 29185)
+++ applications/editors/josm/plugins/smed2/src/seamap/Renderer.java	(revision 29186)
@@ -112,9 +112,9 @@
 	}
 	
-	public static void symbol(Feature feature, ArrayList<Instr> symbol, Obj obj) {
+	public static void symbol(Feature feature, Symbol symbol, Obj obj, Delta delta) {
 		Point2D point = helper.getPoint(findCentroid(feature));
 		ArrayList<ColCOL> colours = (ArrayList<ColCOL>) getAttVal(feature, obj, 0, Att.COLOUR);
 		ArrayList<ColPAT> pattern = (ArrayList<ColPAT>) getAttVal(feature, obj, 0, Att.COLPAT);
-		Symbols.drawSymbol(g2, symbol, sScale, point.getX(), point.getY(), null, new Scheme(pattern, colours));
+		Symbols.drawSymbol(g2, symbol, sScale, point.getX(), point.getY(), delta, new Scheme(pattern, colours));
 	}
 	
Index: applications/editors/josm/plugins/smed2/src/seamap/Rules.java
===================================================================
--- applications/editors/josm/plugins/smed2/src/seamap/Rules.java	(revision 29185)
+++ applications/editors/josm/plugins/smed2/src/seamap/Rules.java	(revision 29186)
@@ -16,10 +16,8 @@
 import s57.S57obj.*;
 
+import seamap.SeaMap.AttItem;
 import seamap.SeaMap.*;
-import symbols.Beacons;
-import symbols.Buoys;
-import symbols.Harbours;
-import symbols.Landmarks;
-import symbols.Symbols.Instr;
+import symbols.*;
+import symbols.Symbols.*;
 
 public class Rules {
@@ -119,12 +117,12 @@
 		for (Feature feature : features) {
 			ArrayList<CatLMK> cats = (ArrayList<CatLMK>) Renderer.getAttVal(feature, feature.type, 0, Att.CATLMK);
-			ArrayList<Instr> catSym = Landmarks.Shapes.get(cats.get(0));
+			Symbol catSym = Landmarks.Shapes.get(cats.get(0));
 			ArrayList<FncFNC> fncs = (ArrayList<FncFNC>) Renderer.getAttVal(feature, feature.type, 0, Att.FUNCTN);
-			ArrayList<Instr> fncSym = Landmarks.Funcs.get(fncs.get(0));
+			Symbol fncSym = Landmarks.Funcs.get(fncs.get(0));
 			if ((fncs.get(0) == FncFNC.FNC_CHCH) && (cats.get(0) == CatLMK.LMK_TOWR)) catSym = Landmarks.ChurchTower;
 			if ((cats.get(0) == CatLMK.LMK_UNKN) && (fncs.get(0) == FncFNC.FNC_UNKN) && (feature.objs.get(Obj.LIGHTS) != null)) catSym = Beacons.LightMajor;
 			if (cats.get(0) == CatLMK.LMK_RADR) fncSym = Landmarks.RadioTV;
-			Renderer.symbol(feature, catSym, feature.type);
-			Renderer.symbol(feature, fncSym, feature.type);
+			Renderer.symbol(feature, catSym, feature.type, null);
+			Renderer.symbol(feature, fncSym, feature.type, null);
 		}
 	}
@@ -134,17 +132,17 @@
 			switch (cat) {
 			case MOR_DLPN:
-				Renderer.symbol(feature, Harbours.Dolphin, feature.type);
+				Renderer.symbol(feature, Harbours.Dolphin, feature.type, null);
 				break;
 			case MOR_DDPN:
-				Renderer.symbol(feature, Harbours.DeviationDolphin, feature.type);
+				Renderer.symbol(feature, Harbours.DeviationDolphin, feature.type, null);
 				break;
 			case MOR_BLRD:
 			case MOR_POST:
-				Renderer.symbol(feature, Harbours.Bollard, feature.type);
+				Renderer.symbol(feature, Harbours.Bollard, feature.type, null);
 				break;
 			case MOR_BUOY:
 				BoySHP shape = (BoySHP) Renderer.getAttVal(feature, feature.type, 0, Att.BOYSHP);
 				if (shape == BoySHP.BOY_UNKN) shape = BoySHP.BOY_SPHR;
-				Renderer.symbol(feature, Buoys.Shapes.get(shape), feature.type);
+				Renderer.symbol(feature, Buoys.Shapes.get(shape), feature.type, null);
 				break;
 			}
@@ -160,9 +158,9 @@
 			switch (feature.type) {
 			case LITMAJ:
-				Renderer.symbol(feature, Beacons.LightMajor, feature.type);
+				Renderer.symbol(feature, Beacons.LightMajor, feature.type, null);
 				break;
 			case LITMIN:
 			case LIGHTS:
-				Renderer.symbol(feature, Beacons.LightMinor, feature.type);
+				Renderer.symbol(feature, Beacons.LightMinor, feature.type, null);
 				break;
 			}
@@ -174,20 +172,20 @@
 			case SISTAT:
 			case SISTAW:
-				Renderer.symbol(feature, Harbours.SignalStation, feature.type);
+				Renderer.symbol(feature, Harbours.SignalStation, feature.type, null);
 				break;
 			case RDOSTA:
-				Renderer.symbol(feature, Harbours.SignalStation, feature.type);
+				Renderer.symbol(feature, Harbours.SignalStation, feature.type, null);
 				break;
 			case RADSTA:
-				Renderer.symbol(feature, Harbours.SignalStation, feature.type);
+				Renderer.symbol(feature, Harbours.SignalStation, feature.type, null);
 				break;
 			case PILBOP:
-				Renderer.symbol(feature, Harbours.SignalStation, feature.type);
+				Renderer.symbol(feature, Harbours.SignalStation, feature.type, null);
 				break;
 			case CGUSTA:
-//			Renderer.symbol(feature, Harbours.CGuardStation, feature.type);
+//			Renderer.symbol(feature, Harbours.CGuardStation, feature.type, null);
 			break;
 			case RSCSTA:
-//				Renderer.symbol(feature, Harbours.RescueStation, feature.type);
+//				Renderer.symbol(feature, Harbours.RescueStation, feature.type, null);
 				break;
 			}
@@ -198,18 +196,20 @@
 			switch (feature.type) {
 			case LITVES:
-				Renderer.symbol(feature, Buoys.Super, feature.type);
+				Renderer.symbol(feature, Buoys.Super, feature.type, null);
 				break;
 			case LITFLT:
-				Renderer.symbol(feature, Buoys.Float, feature.type);
+				Renderer.symbol(feature, Buoys.Float, feature.type, null);
 				break;
 			case BOYINB:
-				Renderer.symbol(feature, Buoys.Storage, feature.type);
-				break;
-			}
+				Renderer.symbol(feature, Buoys.Storage, feature.type, null);
+				break;
+			}
+			if (feature.objs.get(Obj.TOPMAR) != null)
+				Renderer.symbol(feature, Topmarks.Shapes.get(feature.objs.get(Obj.TOPMAR).get(0).get(Att.TOPSHP).val), Obj.TOPMAR, Topmarks.Floats);
 		}
 	}
 	private static void platforms(ArrayList<Feature> features) {
 		for (Feature feature : features) {
-			Renderer.symbol(feature, Landmarks.Platform, feature.type);
+			Renderer.symbol(feature, Landmarks.Platform, feature.type, null);
 		}
 	}
@@ -217,5 +217,8 @@
 		for (Feature feature : features) {
 			BoySHP shape = (BoySHP) Renderer.getAttVal(feature, feature.type, 0, Att.BOYSHP);
-			Renderer.symbol(feature, Buoys.Shapes.get(shape), feature.type);
+			Renderer.symbol(feature, Buoys.Shapes.get(shape), feature.type, null);
+			if (feature.objs.get(Obj.TOPMAR) != null) {
+				Renderer.symbol(feature, Topmarks.Shapes.get(feature.objs.get(Obj.TOPMAR).get(0).get(Att.TOPSHP).val), Obj.TOPMAR, Topmarks.Buoys.get(shape));
+			}
 		}
 	}
@@ -228,19 +231,21 @@
 				case LAM_PORT:
 					if (shape == BcnSHP.BCN_PRCH)
-						Renderer.symbol(feature, Beacons.PerchPort, feature.type);
+						Renderer.symbol(feature, Beacons.PerchPort, feature.type, null);
 					else
-						Renderer.symbol(feature, Beacons.WithyPort, feature.type);
+						Renderer.symbol(feature, Beacons.WithyPort, feature.type, null);
 					break;
 				case LAM_STBD:
 					if (shape == BcnSHP.BCN_PRCH)
-						Renderer.symbol(feature, Beacons.PerchStarboard, feature.type);
+						Renderer.symbol(feature, Beacons.PerchStarboard, feature.type, null);
 					else
-						Renderer.symbol(feature, Beacons.WithyStarboard, feature.type);
+						Renderer.symbol(feature, Beacons.WithyStarboard, feature.type, null);
 					break;
 				default:
-					Renderer.symbol(feature, Beacons.Stake, feature.type);
+					Renderer.symbol(feature, Beacons.Stake, feature.type, null);
 				}
 			} else {
-				Renderer.symbol(feature, Beacons.Shapes.get(shape), feature.type);
+				Renderer.symbol(feature, Beacons.Shapes.get(shape), feature.type, null);
+				if (feature.objs.get(Obj.TOPMAR) != null)
+					Renderer.symbol(feature, Topmarks.Shapes.get(feature.objs.get(Obj.TOPMAR).get(0).get(Att.TOPSHP).val), Obj.TOPMAR, Topmarks.Beacons);
 			}
 		}
Index: applications/editors/josm/plugins/smed2/src/symbols/Areas.java
===================================================================
--- applications/editors/josm/plugins/smed2/src/symbols/Areas.java	(revision 29185)
+++ applications/editors/josm/plugins/smed2/src/symbols/Areas.java	(revision 29186)
@@ -14,10 +14,9 @@
 import java.awt.Rectangle;
 import java.awt.geom.*;
-import java.util.ArrayList;
 
 import symbols.Symbols.*;
 
 public class Areas {
-	public static final ArrayList<Instr> Plane = new ArrayList<Instr>();
+	public static final Symbol Plane = new Symbol();
 	static {
 		Plane.add(new Instr(Prim.BBOX, new Rectangle(-60,-60,120,120)));
@@ -26,5 +25,5 @@
 		Plane.add(new Instr(Prim.PGON, p));
 	}
-	public static final ArrayList<Instr> Cable = new ArrayList<Instr>();
+	public static final Symbol Cable = new Symbol();
 	static {
 		Cable.add(new Instr(Prim.BBOX, new Rectangle(-30,-60,60,60)));
@@ -34,5 +33,5 @@
 		Cable.add(new Instr(Prim.PLIN, p));
 	}
-	public static final ArrayList<Instr> LaneArrow = new ArrayList<Instr>();
+	public static final Symbol LaneArrow = new Symbol();
 	static {
 		LaneArrow.add(new Instr(Prim.STRK, new BasicStroke(10.0f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_MITER)));
@@ -42,15 +41,15 @@
 		LaneArrow.add(new Instr(Prim.PLIN, p));
 	}
-	public static final ArrayList<Instr> LineAnchor = new ArrayList<Instr>();
+	public static final Symbol LineAnchor = new Symbol();
 	static {
 		LineAnchor.add(new Instr(Prim.FILL, new Color(0xc480ff)));
-		LineAnchor.add(new Instr(Prim.SYMB, new Symbols.Symbol(Harbours.Anchor, 0.5, 0, 0, new Delta(Handle.CC, AffineTransform.getRotateInstance(Math.toRadians(-90.0))), null)));
+		LineAnchor.add(new Instr(Prim.SYMB, new Symbols.SubSymbol(Harbours.Anchor, 0.5, 0, 0, new Delta(Handle.CC, AffineTransform.getRotateInstance(Math.toRadians(-90.0))), null)));
 	}
-	public static final ArrayList<Instr> LinePlane = new ArrayList<Instr>();
+	public static final Symbol LinePlane = new Symbol();
 	static {
 		LinePlane.add(new Instr(Prim.FILL, new Color(0xc480ff)));
-		LinePlane.add(new Instr(Prim.SYMB, new Symbols.Symbol(Areas.Plane, 0.5, 0, 0, new Delta(Handle.CC, AffineTransform.getRotateInstance(Math.toRadians(-90.0))), null)));
+		LinePlane.add(new Instr(Prim.SYMB, new Symbols.SubSymbol(Areas.Plane, 0.5, 0, 0, new Delta(Handle.CC, AffineTransform.getRotateInstance(Math.toRadians(-90.0))), null)));
 	}
-	public static final ArrayList<Instr> MarineFarm = new ArrayList<Instr>();
+	public static final Symbol MarineFarm = new Symbol();
 	static {
 		MarineFarm.add(new Instr(Prim.STRK, new BasicStroke(3.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND)));
@@ -62,5 +61,5 @@
 		MarineFarm.add(new Instr(Prim.RSHP, new Ellipse2D.Double(9,-2,4,4)));
 	}
-	public static final ArrayList<Instr> NoWake = new ArrayList<Instr>();
+	public static final Symbol NoWake = new Symbol();
 	static {
 		NoWake.add(new Instr(Prim.STRK, new BasicStroke(12.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)));
@@ -72,5 +71,5 @@
 		NoWake.add(new Instr(Prim.LINE, new Line2D.Double(-60,-60,60,60)));
 	}
-	public static final ArrayList<Instr> Pipeline = new ArrayList<Instr>();
+	public static final Symbol Pipeline = new Symbol();
 	static {
 		Pipeline.add(new Instr(Prim.BBOX, new Rectangle(-15,-60,30,60)));
@@ -80,5 +79,5 @@
 		Pipeline.add(new Instr(Prim.RSHP, new Ellipse2D.Double(-10,-60,20,20)));
 	}
-	public static final ArrayList<Instr> Restricted = new ArrayList<Instr>();
+	public static final Symbol Restricted = new Symbol();
 	static {
 		Restricted.add(new Instr(Prim.BBOX, new Rectangle(-15,-30,30,30)));
@@ -88,5 +87,5 @@
 		Restricted.add(new Instr(Prim.LINE, new Line2D.Double(0,-15,17,-15)));
 	}
-	public static final ArrayList<Instr> Rock = new ArrayList<Instr>();
+	public static final Symbol Rock = new Symbol();
 	static {
 		Rock.add(new Instr(Prim.FILL, new Color(0x80c0ff)));
@@ -99,5 +98,5 @@
 		Rock.add(new Instr(Prim.LINE, new Line2D.Double(0,-20,0,20)));
 	}
-	public static final ArrayList<Instr> RockA = new ArrayList<Instr>();
+	public static final Symbol RockA = new Symbol();
 	static {
 		RockA.add(new Instr(Prim.FILL, new Color(0x80c0ff)));
@@ -114,5 +113,5 @@
 		RockA.add(new Instr(Prim.RSHP, new Ellipse2D.Double(9,9,8,8)));
 	}
-	public static final ArrayList<Instr> RockC = new ArrayList<Instr>();
+	public static final Symbol RockC = new Symbol();
 	static {
 		RockC.add(new Instr(Prim.FILL, new Color(0x80c0ff)));
@@ -126,13 +125,13 @@
 		RockC.add(new Instr(Prim.LINE, new Line2D.Double(10,17.3,-10,-17.3)));
 	}
-	public static final ArrayList<Instr> Sandwaves = new ArrayList<Instr>();
-	public static final ArrayList<Instr> Seaplane = new ArrayList<Instr>();
+	public static final Symbol Sandwaves = new Symbol();
+	public static final Symbol Seaplane = new Symbol();
 	static {
 		Seaplane.add(new Instr(Prim.STRK, new BasicStroke(4.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)));
 		Seaplane.add(new Instr(Prim.FILL, new Color(0xa30075)));
 		Seaplane.add(new Instr(Prim.ELPS, new Ellipse2D.Double(-60,-60,120,120)));
-		Seaplane.add(new Instr(Prim.SYMB, new Symbols.Symbol(Areas.Plane, 1.0, 0, 0, null, null)));
+		Seaplane.add(new Instr(Prim.SYMB, new Symbols.SubSymbol(Areas.Plane, 1.0, 0, 0, null, null)));
 	}
-	public static final ArrayList<Instr> WindFarm = new ArrayList<Instr>();
+	public static final Symbol WindFarm = new Symbol();
 	static {
 		WindFarm.add(new Instr(Prim.STRK, new BasicStroke(4.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)));
@@ -145,5 +144,5 @@
 		WindFarm.add(new Instr(Prim.LINE, new Line2D.Double(0,-27.5,-13.8,-53.6)));
 	}
-	public static final ArrayList<Instr> WreckD = new ArrayList<Instr>();
+	public static final Symbol WreckD = new Symbol();
 	static {
 		WreckD.add(new Instr(Prim.FILL, new Color(0x80c0ff)));
@@ -158,5 +157,5 @@
 		WreckD.add(new Instr(Prim.LINE, new Line2D.Double(20,-15,20,15)));
 	}
-	public static final ArrayList<Instr> WreckND = new ArrayList<Instr>();
+	public static final Symbol WreckND = new Symbol();
 	static {
 		WreckND.add(new Instr(Prim.STRK, new BasicStroke(5.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)));
@@ -167,5 +166,5 @@
 		WreckND.add(new Instr(Prim.LINE, new Line2D.Double(20,-15,20,15)));
 	}
-	public static final ArrayList<Instr> WreckS = new ArrayList<Instr>();
+	public static final Symbol WreckS = new Symbol();
 	static {
 		WreckS.add(new Instr(Prim.STRK, new BasicStroke(3.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)));
Index: applications/editors/josm/plugins/smed2/src/symbols/Beacons.java
===================================================================
--- applications/editors/josm/plugins/smed2/src/symbols/Beacons.java	(revision 29185)
+++ applications/editors/josm/plugins/smed2/src/symbols/Beacons.java	(revision 29186)
@@ -17,9 +17,7 @@
 import java.awt.geom.Line2D;
 import java.awt.geom.Path2D;
-import java.util.ArrayList;
 import java.util.EnumMap;
 
-import symbols.Symbols.Instr;
-import symbols.Symbols.Prim;
+import symbols.Symbols.*;
 
 import s57.S57val.*;
@@ -27,7 +25,7 @@
 public class Beacons {
 	
-	public static final ArrayList<Instr> Beacon = new ArrayList<Instr>();
+	public static final Symbol Beacon = new Symbol();
 	static {
-		ArrayList<Instr> colours = new ArrayList<Instr>();
+		Symbol colours = new Symbol();
 		Path2D.Double p = new Path2D.Double(); p.moveTo(-6.0,-8.5); p.lineTo(-6.0,-70.0); p.lineTo(6.0,-70.0); p.lineTo(6.0,-8.5); p.curveTo(6.0,-10.0,-6.0,-10.0,-6.0,-8.5); p.closePath();
 		colours.add(new Instr(Prim.P1, p));
@@ -51,5 +49,5 @@
 		Beacon.add(new Instr(Prim.PLIN, p));
 	}
-	public static final ArrayList<Instr> Cairn = new ArrayList<Instr>();
+	public static final Symbol Cairn = new Symbol();
 	static {
 		Cairn.add(new Instr(Prim.STRK, new BasicStroke(4.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND)));
@@ -62,5 +60,5 @@
 		Cairn.add(new Instr(Prim.ELPS, new Ellipse2D.Double(-18,-70,36,36)));
 	}
-	public static final ArrayList<Instr> FogSignal = new ArrayList<Instr>();
+	public static final Symbol FogSignal = new Symbol();
 	static {
 		FogSignal.add(new Instr(Prim.STRK, new BasicStroke(3.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND)));
@@ -73,5 +71,5 @@
 		FogSignal.add(new Instr(Prim.EARC, new Arc2D.Double(-65.0,-65.0,130.0,130.0,190.0,50.0,Arc2D.OPEN)));
 	}
-	public static final ArrayList<Instr> LightFlare = new ArrayList<Instr>();
+	public static final Symbol LightFlare = new Symbol();
 	static {
 		LightFlare.add(new Instr(Prim.RSHP, new Ellipse2D.Double(-3,-3,6,6)));
@@ -81,5 +79,5 @@
 		LightFlare.add(new Instr(Prim.PGON, p));
 	}
-	public static final ArrayList<Instr> LightMajor = new ArrayList<Instr>();
+	public static final Symbol LightMajor = new Symbol();
 	static {
 		LightMajor.add(new Instr(Prim.FILL, Color.black));
@@ -90,5 +88,5 @@
 		LightMajor.add(new Instr(Prim.PGON, p));
 	}
-	public static final ArrayList<Instr> LightMinor = new ArrayList<Instr>();
+	public static final Symbol LightMinor = new Symbol();
 	static {
 		LightMinor.add(new Instr(Prim.FILL, Color.black));
@@ -97,5 +95,5 @@
 		LightMinor.add(new Instr(Prim.PGON, p));
 	}
-	public static final ArrayList<Instr> PerchPort = new ArrayList<Instr>();
+	public static final Symbol PerchPort = new Symbol();
 	static {
 		PerchPort.add(new Instr(Prim.STRK, new BasicStroke(4.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND)));
@@ -106,5 +104,5 @@
 		PerchPort.add(new Instr(Prim.LINE, new Line2D.Double(-25,-70,0,-40)));
 	}
-	public static final ArrayList<Instr> PerchStarboard = new ArrayList<Instr>();
+	public static final Symbol PerchStarboard = new Symbol();
 	static {
 		PerchStarboard.add(new Instr(Prim.STRK, new BasicStroke(4.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND)));
@@ -115,5 +113,5 @@
 		PerchStarboard.add(new Instr(Prim.LINE, new Line2D.Double(-25,-40,0,-68.7)));
 	}
-	public static final ArrayList<Instr> RadarStation = new ArrayList<Instr>();
+	public static final Symbol RadarStation = new Symbol();
 	static {
 		RadarStation.add(new Instr(Prim.STRK, new BasicStroke(2.5f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND)));
@@ -121,10 +119,10 @@
 		RadarStation.add(new Instr(Prim.ELPS, new Ellipse2D.Double(-125,-125,250,250)));
 	}
-	public static final ArrayList<Instr> Stake = new ArrayList<Instr>();
+	public static final Symbol Stake = new Symbol();
 	static {
 		Stake.add(new Instr(Prim.STRK, new BasicStroke(4.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND)));
 		Stake.add(new Instr(Prim.FILL, Color.black));
 		Stake.add(new Instr(Prim.LINE, new Line2D.Double(0,0,0,-70)));
-		ArrayList<Instr> colours = new ArrayList<Instr>();
+		Symbol colours = new Symbol();
 		Path2D.Double p = new Path2D.Double(); p.moveTo(-2.0,0.0); p.lineTo(-2.0,-70.0); p.lineTo(2.0,-70.0); p.lineTo(2.0,0.0); p.closePath();
 		colours.add(new Instr(Prim.P1, p));
@@ -141,7 +139,7 @@
 		Stake.add(new Instr(Prim.LINE, new Line2D.Double(-10,0,10,0)));
 	}
-	public static final ArrayList<Instr> Tower = new ArrayList<Instr>();
+	public static final Symbol Tower = new Symbol();
 	static {
-		ArrayList<Instr> colours = new ArrayList<Instr>();
+		Symbol colours = new Symbol();
 		Path2D.Double p = new Path2D.Double(); p.moveTo(-25.0,0.0); p.lineTo(-20.0,-70.0); p.lineTo(20.0,-70.0); p.lineTo(25.0,0.0); p.lineTo(10.0,0.0); p.curveTo(10.0,-13.3,-10.0,-13.3,-10.0,0.0); p.closePath();
 		colours.add(new Instr(Prim.P1, p));
@@ -165,5 +163,5 @@
 		Tower.add(new Instr(Prim.PLIN, p));
 	}
-	public static final ArrayList<Instr> WithyPort = new ArrayList<Instr>();
+	public static final Symbol WithyPort = new Symbol();
 	static {
 		WithyPort.add(new Instr(Prim.STRK, new BasicStroke(4.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND)));
@@ -176,5 +174,5 @@
 		WithyPort.add(new Instr(Prim.LINE, new Line2D.Double(-30,-35,0,-21)));
 	}
-	public static final ArrayList<Instr> WithyStarboard = new ArrayList<Instr>();
+	public static final Symbol WithyStarboard = new Symbol();
 	static {
 		WithyStarboard.add(new Instr(Prim.STRK, new BasicStroke(4.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND)));
@@ -188,5 +186,5 @@
 	}
 	
-	public static final EnumMap<BcnSHP, ArrayList<Instr>> Shapes = new EnumMap<BcnSHP, ArrayList<Instr>>(BcnSHP.class);
+	public static final EnumMap<BcnSHP, Symbol> Shapes = new EnumMap<BcnSHP, Symbol>(BcnSHP.class);
 	static {
 		Shapes.put(BcnSHP.BCN_UNKN, Beacons.Beacon); Shapes.put(BcnSHP.BCN_STAK, Beacons.Stake); Shapes.put(BcnSHP.BCN_TOWR, Beacons.Tower);
Index: applications/editors/josm/plugins/smed2/src/symbols/Buoys.java
===================================================================
--- applications/editors/josm/plugins/smed2/src/symbols/Buoys.java	(revision 29185)
+++ applications/editors/josm/plugins/smed2/src/symbols/Buoys.java	(revision 29186)
@@ -13,5 +13,4 @@
 import java.awt.Color;
 import java.awt.geom.*;
-import java.util.ArrayList;
 import java.util.EnumMap;
 
@@ -21,7 +20,7 @@
 public class Buoys {
 
-	public static final ArrayList<Instr> Barrel = new ArrayList<Instr>();
-	static {
-		ArrayList<Instr> colours = new ArrayList<Instr>();
+	public static final Symbol Barrel = new Symbol();
+	static {
+		Symbol colours = new Symbol();
 		Path2D.Double p = new Path2D.Double(); p.moveTo(-50.0,0); p.curveTo(-50.0,-11.0,-45.0,-32.0,-32.0,-36.0);
 		p.curveTo(-18.0,-40.0,12.0,-40.0,25.0,-36.0); p.curveTo(38.0,-32.0,43.0,-11.0,43.0,0);
@@ -38,7 +37,7 @@
     Barrel.add(new Instr(Prim.PLIN, p));
 	}
-	public static final ArrayList<Instr> Can = new ArrayList<Instr>();
-	static {
-		ArrayList<Instr> colours = new ArrayList<Instr>();
+	public static final Symbol Can = new Symbol();
+	static {
+		Symbol colours = new Symbol();
 		Path2D.Double p = new Path2D.Double(); p.moveTo(-31.6, 0); p.lineTo(-15.7,-47.4); p.lineTo(41.1,-28.4); p.lineTo(31.6,0);
 		p.lineTo(8.0, 0.0); p.curveTo(8.0,-11.0,-8.0,-11.0,-8.0,0.0); p.closePath();
@@ -64,7 +63,7 @@
     Can.add(new Instr(Prim.PLIN, p));
 	}
-	public static final ArrayList<Instr> Cone = new ArrayList<Instr>();
-	static {
-		ArrayList<Instr> colours = new ArrayList<Instr>();
+	public static final Symbol Cone = new Symbol();
+	static {
+		Symbol colours = new Symbol();
 		Path2D.Double p = new Path2D.Double(); p.moveTo(-31.6,0); p.curveTo(-24.9,-32.2, 1.4,-38.7,12.7,-37.9); p.curveTo(21.9,-30.5,32.8,-18.4,32.1,0.0);
 		p.lineTo(8.0,0.0); p.curveTo(8.0,-11.0,-8.0,-11.0,-8.0,0.0); p.closePath();
@@ -90,7 +89,7 @@
     Cone.add(new Instr(Prim.PLIN, p));
 	}
-	public static final ArrayList<Instr> Float = new ArrayList<Instr>();
-	static {
-		ArrayList<Instr> colours = new ArrayList<Instr>();
+	public static final Symbol Float = new Symbol();
+	static {
+		Symbol colours = new Symbol();
 		Path2D.Double p = new Path2D.Double(); p.moveTo(-36.0,0); p.lineTo(-47.0,-33.0); p.quadTo(-30.0, -25.0, -19.0,-23.0);
 		p.lineTo(-12.0,-42.0); p.lineTo(12.0,-42.0); p.lineTo(19.0,-23.0); p.quadTo(30.0,-25.0,47.0,-33.0); p.lineTo(36.0,0);
@@ -121,7 +120,7 @@
     Float.add(new Instr(Prim.PLIN, p));
 	}
-	public static final ArrayList<Instr> Ice = new ArrayList<Instr>();
-	static {
-		ArrayList<Instr> colours = new ArrayList<Instr>();
+	public static final Symbol Ice = new Symbol();
+	static {
+		Symbol colours = new Symbol();
 		Path2D.Double p = new Path2D.Double(); p.moveTo(-15.0,0); p.quadTo(-30.0,0.0,-30.0,-15.0); p.lineTo(-30.0,-25.0); p.lineTo(30.0,-25.0); p.lineTo(30.0,-15); p.quadTo(30.0,0.0,15.0,0.0);
 		p.lineTo(8.0, 0.0); p.curveTo(8.0,-11.0,-8.0,-11.0,-8.0,0.0); p.closePath();
@@ -138,7 +137,7 @@
 		Ice.add(new Instr(Prim.PLIN, p));
 	}
-	public static final ArrayList<Instr> Pillar = new ArrayList<Instr>();
-	static {
-		ArrayList<Instr> colours = new ArrayList<Instr>();
+	public static final Symbol Pillar = new Symbol();
+	static {
+		Symbol colours = new Symbol();
 		Path2D.Double p = new Path2D.Double(); p.moveTo(-32.0,0.0); p.lineTo(-2.8,-32.5); p.lineTo(25.6,-96.7); p.lineTo(37.0,-92.9); p.lineTo(21.8,-24.3);
 		p.lineTo(25.0,0.0); p.lineTo(8.0, 0.0); p.curveTo(8.0,-11.0,-8.0,-11.0,-8.0,0.0); p.closePath();
@@ -165,7 +164,7 @@
 		Pillar.add(new Instr(Prim.PLIN, p));
 	}
-	public static final ArrayList<Instr> Spar = new ArrayList<Instr>();
-	static {
-		ArrayList<Instr> colours = new ArrayList<Instr>();
+	public static final Symbol Spar = new Symbol();
+	static {
+		Symbol colours = new Symbol();
 		Path2D.Double p = new Path2D.Double(); p.moveTo(-3.2,-9.5); p.lineTo(25.6,-96.7); p.lineTo(37.0,-92.9); p.lineTo(8.2,-5.7); p.closePath();
 		colours.add(new Instr(Prim.P1, p));
@@ -189,7 +188,7 @@
 		Spar.add(new Instr(Prim.PLIN, p));
 	}
-	public static final ArrayList<Instr> Sphere = new ArrayList<Instr>();
-	static {
-		ArrayList<Instr> colours = new ArrayList<Instr>();
+	public static final Symbol Sphere = new Symbol();
+	static {
+		Symbol colours = new Symbol();
 		Path2D.Double p = new Path2D.Double(); p.moveTo(-25.0,0); p.curveTo(-32.0,-21.0,-14.0,-45.5,12.7,-37.9); p.curveTo(27.5,-33.8,37.8,-15.5,32.0,0.0);
 		p.lineTo(8.0,0.0); p.curveTo(8.0,-11.0,-8.0,-11.0,-8.0,0.0); p.closePath();
@@ -214,5 +213,5 @@
     Sphere.add(new Instr(Prim.EARC, new Arc2D.Double(-26.5,-39.4,60.0,60.0,-18.0,216.0,Arc2D.OPEN)));
 	}
-	public static final ArrayList<Instr> Storage = new ArrayList<Instr>();
+	public static final Symbol Storage = new Symbol();
 	static {
 		Storage.add(new Instr(Prim.STRK, new BasicStroke(4.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)));
@@ -223,7 +222,7 @@
     Storage.add(new Instr(Prim.PLIN, p));
 	}
-	public static final ArrayList<Instr> Super = new ArrayList<Instr>();
-	static {
-		ArrayList<Instr> colours = new ArrayList<Instr>();
+	public static final Symbol Super = new Symbol();
+	static {
+		Symbol colours = new Symbol();
 		Path2D.Double p = new Path2D.Double(); p.moveTo(-48.0,0); p.lineTo(-28.0,-42.0); p.lineTo(28.0,-42.0); p.lineTo(48.0,0);
 		p.lineTo(8.0, 0.0); p.curveTo(8.0,-11.0,-8.0,-11.0,-8.0,0.0); p.closePath();
@@ -250,5 +249,5 @@
 	}
 	
-	public static final EnumMap<BoySHP, ArrayList<Instr>> Shapes = new EnumMap<BoySHP, ArrayList<Instr>>(BoySHP.class);
+	public static final EnumMap<BoySHP, Symbol> Shapes = new EnumMap<BoySHP, Symbol>(BoySHP.class);
 	static {
 		Shapes.put(BoySHP.BOY_UNKN, Buoys.Pillar); Shapes.put(BoySHP.BOY_CONE, Buoys.Cone); Shapes.put(BoySHP.BOY_CAN, Buoys.Can);
Index: applications/editors/josm/plugins/smed2/src/symbols/Facilities.java
===================================================================
--- applications/editors/josm/plugins/smed2/src/symbols/Facilities.java	(revision 29185)
+++ applications/editors/josm/plugins/smed2/src/symbols/Facilities.java	(revision 29186)
@@ -13,11 +13,9 @@
 import java.awt.Color;
 import java.awt.geom.*;
-import java.util.ArrayList;
 
-import symbols.Symbols.Instr;
-import symbols.Symbols.Prim;
+import symbols.Symbols.*;
 
 public class Facilities {
-	private static final ArrayList<Instr> Facility = new ArrayList<Instr>();
+	private static final Symbol Facility = new Symbol();
 	static {
 		Facility.add(new Instr(Prim.STRK, new BasicStroke(2.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)));
@@ -28,7 +26,7 @@
 		Facility.add(new Instr(Prim.RRCT, s));
 	}
-	public static final ArrayList<Instr> Boatlift = new ArrayList<Instr>();//was Crane
+	public static final Symbol Boatlift = new Symbol();//was Crane
 	static {
-		Boatlift.add(new Instr(Prim.SYMB, new Symbols.Symbol(Facilities.Facility, 1.0, 0, 0, null, null)));
+		Boatlift.add(new Instr(Prim.SYMB, new Symbols.SubSymbol(Facilities.Facility, 1.0, 0, 0, null, null)));
 		Boatlift.add(new Instr(Prim.STRK, new BasicStroke(4.0f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND)));
 		Boatlift.add(new Instr(Prim.ELPS, new Ellipse2D.Double(-3.7,-19.7,12,12)));
@@ -36,7 +34,7 @@
 		Boatlift.add(new Instr(Prim.EARC, new Arc2D.Double(-10.0,-1.5,20,20,75.0,-260.0,Arc2D.OPEN)));
 	}
-	public static final ArrayList<Instr> Boatyard = new ArrayList<Instr>();
+	public static final Symbol Boatyard = new Symbol();
 	static {
-		Boatyard.add(new Instr(Prim.SYMB, new Symbols.Symbol(Facilities.Facility, 1.0, 0, 0, null, null)));
+		Boatyard.add(new Instr(Prim.SYMB, new Symbols.SubSymbol(Facilities.Facility, 1.0, 0, 0, null, null)));
 		Boatyard.add(new Instr(Prim.STRK, new BasicStroke(8.0f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_MITER)));
 		Boatyard.add(new Instr(Prim.LINE, new Line2D.Double(19,19,-8,-8)));
@@ -45,7 +43,7 @@
 		Boatyard.add(new Instr(Prim.PGON, p));
 	}
-	public static final ArrayList<Instr> Chandler = new ArrayList<Instr>();
+	public static final Symbol Chandler = new Symbol();
 	static {
-		Chandler.add(new Instr(Prim.SYMB, new Symbols.Symbol(Facilities.Facility, 1.0, 0, 0, null, null)));
+		Chandler.add(new Instr(Prim.SYMB, new Symbols.SubSymbol(Facilities.Facility, 1.0, 0, 0, null, null)));
 		Chandler.add(new Instr(Prim.STRK, new BasicStroke(5.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND)));
 		Chandler.add(new Instr(Prim.ELPS, new Ellipse2D.Double(14,7,10,10)));
@@ -55,7 +53,7 @@
 		Chandler.add(new Instr(Prim.EARC, new Arc2D.Double(-16.0,-20.5,24,24,0.0,180.0,Arc2D.OPEN)));
 	}
-	public static final ArrayList<Instr> Fuel = new ArrayList<Instr>();
+	public static final Symbol Fuel = new Symbol();
 	static {
-		Fuel.add(new Instr(Prim.SYMB, new Symbols.Symbol(Facilities.Facility, 1.0, 0, 0, null, null)));
+		Fuel.add(new Instr(Prim.SYMB, new Symbols.SubSymbol(Facilities.Facility, 1.0, 0, 0, null, null)));
 		Fuel.add(new Instr(Prim.STRK, new BasicStroke(2.5f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND)));
 		Fuel.add(new Instr(Prim.FILL, new Color(0xa30075)));
@@ -69,7 +67,7 @@
 		Fuel.add(new Instr(Prim.PLIN, p));
 	}
-	public static final ArrayList<Instr> Laundrette = new ArrayList<Instr>();
+	public static final Symbol Laundrette = new Symbol();
 	static {
-		Laundrette.add(new Instr(Prim.SYMB, new Symbols.Symbol(Facilities.Facility, 1.0, 0, 0, null, null)));
+		Laundrette.add(new Instr(Prim.SYMB, new Symbols.SubSymbol(Facilities.Facility, 1.0, 0, 0, null, null)));
 		Laundrette.add(new Instr(Prim.STRK, new BasicStroke(1.5f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND)));
 		Laundrette.add(new Instr(Prim.FILL, new Color(0xa30075)));
@@ -80,7 +78,7 @@
 		Laundrette.add(new Instr(Prim.PLIN, p));
 	}
-	public static final ArrayList<Instr> PumpOut = new ArrayList<Instr>();
+	public static final Symbol PumpOut = new Symbol();
 	static {
-		PumpOut.add(new Instr(Prim.SYMB, new Symbols.Symbol(Facilities.Facility, 1.0, 0, 0, null, null)));
+		PumpOut.add(new Instr(Prim.SYMB, new Symbols.SubSymbol(Facilities.Facility, 1.0, 0, 0, null, null)));
 		PumpOut.add(new Instr(Prim.STRK, new BasicStroke(2.5f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_MITER)));
 		PumpOut.add(new Instr(Prim.FILL, new Color(0xa30075)));
@@ -96,7 +94,7 @@
 		PumpOut.add(new Instr(Prim.PGON, p));
 	}
-	public static final ArrayList<Instr> SailingClub = new ArrayList<Instr>();
+	public static final Symbol SailingClub = new Symbol();
 	static {
-		SailingClub.add(new Instr(Prim.SYMB, new Symbols.Symbol(Facilities.Facility, 1.0, 0, 0, null, null)));
+		SailingClub.add(new Instr(Prim.SYMB, new Symbols.SubSymbol(Facilities.Facility, 1.0, 0, 0, null, null)));
 		SailingClub.add(new Instr(Prim.STRK, new BasicStroke(2.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND)));
 		SailingClub.add(new Instr(Prim.FILL, new Color(0xa30075)));
@@ -105,7 +103,7 @@
 		SailingClub.add(new Instr(Prim.PGON, p));
 	}
-	public static final ArrayList<Instr> Shower = new ArrayList<Instr>();
+	public static final Symbol Shower = new Symbol();
 	static {
-		Shower.add(new Instr(Prim.SYMB, new Symbols.Symbol(Facilities.Facility, 1.0, 0, 0, null, null)));
+		Shower.add(new Instr(Prim.SYMB, new Symbols.SubSymbol(Facilities.Facility, 1.0, 0, 0, null, null)));
 		Shower.add(new Instr(Prim.STRK, new BasicStroke(4.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND)));
 		Shower.add(new Instr(Prim.FILL, new Color(0xa30075)));
@@ -119,7 +117,7 @@
 		Shower.add(new Instr(Prim.PLIN, p));
 	}
-	public static final ArrayList<Instr> Slipway = new ArrayList<Instr>();
+	public static final Symbol Slipway = new Symbol();
 	static {
-		Slipway.add(new Instr(Prim.SYMB, new Symbols.Symbol(Facilities.Facility, 1.0, 0, 0, null, null)));
+		Slipway.add(new Instr(Prim.SYMB, new Symbols.SubSymbol(Facilities.Facility, 1.0, 0, 0, null, null)));
 		Slipway.add(new Instr(Prim.STRK, new BasicStroke(3.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND)));
 		Slipway.add(new Instr(Prim.FILL, new Color(0xa30075)));
@@ -136,7 +134,7 @@
 		Slipway.add(new Instr(Prim.PGON, p));
 	}
-	public static final ArrayList<Instr> Toilet = new ArrayList<Instr>();
+	public static final Symbol Toilet = new Symbol();
 	static {
-		Toilet.add(new Instr(Prim.SYMB, new Symbols.Symbol(Facilities.Facility, 1.0, 0, 0, null, null)));
+		Toilet.add(new Instr(Prim.SYMB, new Symbols.SubSymbol(Facilities.Facility, 1.0, 0, 0, null, null)));
 		Toilet.add(new Instr(Prim.STRK, new BasicStroke(4.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND)));
 		Toilet.add(new Instr(Prim.FILL, new Color(0xa30075)));
@@ -153,5 +151,5 @@
 		Toilet.add(new Instr(Prim.PGON, p));
 	}
-	public static final ArrayList<Instr> VisitorBerth = new ArrayList<Instr>();
+	public static final Symbol VisitorBerth = new Symbol();
 	static {
 		VisitorBerth.add(new Instr(Prim.FILL, new Color(0xa30075)));
@@ -162,5 +160,5 @@
 		VisitorBerth.add(new Instr(Prim.PGON, p));
 	}
-	public static final ArrayList<Instr> VisitorMooring = new ArrayList<Instr>();
+	public static final Symbol VisitorMooring = new Symbol();
 	static {
 		VisitorMooring.add(new Instr(Prim.FILL, new Color(0xa30075)));
Index: applications/editors/josm/plugins/smed2/src/symbols/Harbours.java
===================================================================
--- applications/editors/josm/plugins/smed2/src/symbols/Harbours.java	(revision 29185)
+++ applications/editors/josm/plugins/smed2/src/symbols/Harbours.java	(revision 29186)
@@ -14,11 +14,9 @@
 import java.awt.Rectangle;
 import java.awt.geom.*;
-import java.util.ArrayList;
 
-import symbols.Symbols.Instr;
-import symbols.Symbols.Prim;
+import symbols.Symbols.*;
 
 public class Harbours {
-	public static final ArrayList<Instr> Anchor = new ArrayList<Instr>();
+	public static final Symbol Anchor = new Symbol();
 	static {
 		Anchor.add(new Instr(Prim.BBOX, new Rectangle(-60,-60,120,120)));
@@ -31,5 +29,5 @@
 		Anchor.add(new Instr(Prim.PGON, p));
 	}
-	public static final ArrayList<Instr> Yacht = new ArrayList<Instr>();
+	public static final Symbol Yacht = new Symbol();
 	static {
 		Yacht.add(new Instr(Prim.STRK, new BasicStroke(4.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)));
@@ -39,12 +37,12 @@
 		Yacht.add(new Instr(Prim.PGON, p));
 	}
-	public static final ArrayList<Instr> Anchorage = new ArrayList<Instr>();
+	public static final Symbol Anchorage = new Symbol();
 	static {
 		Anchorage.add(new Instr(Prim.FILL, new Color(0xa30075)));
-		Anchorage.add(new Instr(Prim.SYMB, new Symbols.Symbol(Harbours.Anchor, 1.0, 0, 0, null, null)));
+		Anchorage.add(new Instr(Prim.SYMB, new Symbols.SubSymbol(Harbours.Anchor, 1.0, 0, 0, null, null)));
 	}
-	public static final ArrayList<Instr> AnchorBerth = new ArrayList<Instr>();
+	public static final Symbol AnchorBerth = new Symbol();
 	static {
-		AnchorBerth.add(new Instr(Prim.SYMB, new Symbols.Symbol(Harbours.Anchorage, 1.0, 0, 0, null, null)));
+		AnchorBerth.add(new Instr(Prim.SYMB, new Symbols.SubSymbol(Harbours.Anchorage, 1.0, 0, 0, null, null)));
 		AnchorBerth.add(new Instr(Prim.STRK, new BasicStroke(2.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)));
 		AnchorBerth.add(new Instr(Prim.FILL, Color.white));
@@ -54,5 +52,5 @@
 		AnchorBerth.add(new Instr(Prim.ELPS, s));
 	}
-	public static final ArrayList<Instr> Bollard = new ArrayList<Instr>();
+	public static final Symbol Bollard = new Symbol();
 	static {
 		Bollard.add(new Instr(Prim.STRK, new BasicStroke(4.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)));
@@ -63,5 +61,5 @@
 		Bollard.add(new Instr(Prim.ELPS, s));
 	}
-	public static final ArrayList<Instr> ClearV = new ArrayList<Instr>();
+	public static final Symbol ClearV = new Symbol();
 	static {
 		ClearV.add(new Instr(Prim.STRK, new BasicStroke(4.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)));
@@ -74,5 +72,5 @@
 		ClearV.add(new Instr(Prim.LINE, new Line2D.Double(0,25,0,15)));
 	}
-	public static final ArrayList<Instr> ContainerCrane = new ArrayList<Instr>();
+	public static final Symbol ContainerCrane = new Symbol();
 	static {
 		ContainerCrane.add(new Instr(Prim.STRK, new BasicStroke(4.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)));
@@ -81,5 +79,5 @@
 		ContainerCrane.add(new Instr(Prim.RECT, new Rectangle2D.Double(-40,-12.5,80,25)));
 	}
-	public static final ArrayList<Instr> DeviationDolphin = new ArrayList<Instr>();
+	public static final Symbol DeviationDolphin = new Symbol();
 	static {
 		DeviationDolphin.add(new Instr(Prim.STRK, new BasicStroke(4.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)));
@@ -89,5 +87,5 @@
 		DeviationDolphin.add(new Instr(Prim.PLIN, p));
 	}
-	public static final ArrayList<Instr> DistanceI = new ArrayList<Instr>();
+	public static final Symbol DistanceI = new Symbol();
 	static {
 		DistanceI.add(new Instr(Prim.STRK, new BasicStroke(3.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)));
@@ -95,5 +93,5 @@
 		DistanceI.add(new Instr(Prim.ELPS, new Ellipse2D.Double(-11,-11,22,22)));
 	}
-	public static final ArrayList<Instr> DistanceU = new ArrayList<Instr>();
+	public static final Symbol DistanceU = new Symbol();
 	static {
 		DistanceU.add(new Instr(Prim.STRK, new BasicStroke(3.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)));
@@ -101,5 +99,5 @@
 		DistanceU.add(new Instr(Prim.ELPS, new Ellipse2D.Double(-11,-11,22,22)));
 	}
-	public static final ArrayList<Instr> Dolphin = new ArrayList<Instr>();
+	public static final Symbol Dolphin = new Symbol();
 	static {
 		Dolphin.add(new Instr(Prim.STRK, new BasicStroke(2.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)));
@@ -111,19 +109,19 @@
 		Dolphin.add(new Instr(Prim.PLIN, p));
 	}
-	public static final ArrayList<Instr> Harbour = new ArrayList<Instr>();
+	public static final Symbol Harbour = new Symbol();
 	static {
 		Harbour.add(new Instr(Prim.STRK, new BasicStroke(15.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)));
 		Harbour.add(new Instr(Prim.FILL, new Color(0xa30075)));
 		Harbour.add(new Instr(Prim.ELPS, new Ellipse2D.Double(-75,-75,150,150)));
-		Harbour.add(new Instr(Prim.SYMB, new Symbols.Symbol(Harbours.Anchor, 1.0, 0, 0, null, null)));
+		Harbour.add(new Instr(Prim.SYMB, new Symbols.SubSymbol(Harbours.Anchor, 1.0, 0, 0, null, null)));
 	}
-	public static final ArrayList<Instr> HarbourMaster = new ArrayList<Instr>();
+	public static final Symbol HarbourMaster = new Symbol();
 	static {
 		HarbourMaster.add(new Instr(Prim.STRK, new BasicStroke(4.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)));
 		HarbourMaster.add(new Instr(Prim.FILL, Color.black));
 		HarbourMaster.add(new Instr(Prim.ELPS, new Ellipse2D.Double(-35,-50,70,100)));
-		HarbourMaster.add(new Instr(Prim.SYMB, new Symbols.Symbol(Harbours.Anchor, 0.6, 0, 0, null, null)));
+		HarbourMaster.add(new Instr(Prim.SYMB, new Symbols.SubSymbol(Harbours.Anchor, 0.6, 0, 0, null, null)));
 	}
-	public static final ArrayList<Instr> LandingSteps = new ArrayList<Instr>();
+	public static final Symbol LandingSteps = new Symbol();
 	static {
 		LandingSteps.add(new Instr(Prim.FILL, new Color(0xa30075)));
@@ -132,20 +130,20 @@
 		LandingSteps.add(new Instr(Prim.PGON, p));
 	}
-	public static final ArrayList<Instr> Lock_Gate = new ArrayList<Instr>();
-	public static final ArrayList<Instr> Lock = new ArrayList<Instr>();
-	public static final ArrayList<Instr> Marina = new ArrayList<Instr>();
+	public static final Symbol Lock_Gate = new Symbol();
+	public static final Symbol Lock = new Symbol();
+	public static final Symbol Marina = new Symbol();
 	static {
 		Marina.add(new Instr(Prim.STRK, new BasicStroke(15.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)));
 		Marina.add(new Instr(Prim.FILL, new Color(0xa30075)));
-		Marina.add(new Instr(Prim.SYMB, new Symbols.Symbol(Harbours.Yacht, 1.0, 0, 0, null, null)));
+		Marina.add(new Instr(Prim.SYMB, new Symbols.SubSymbol(Harbours.Yacht, 1.0, 0, 0, null, null)));
 		Marina.add(new Instr(Prim.EARC, new Arc2D.Double(-80.0,-80.0,160.0,160.0,215.0,-250.0,Arc2D.OPEN)));
 	}
-	public static final ArrayList<Instr> MarinaNF = new ArrayList<Instr>();
+	public static final Symbol MarinaNF = new Symbol();
 	static {
 		MarinaNF.add(new Instr(Prim.STRK, new BasicStroke(15.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)));
 		MarinaNF.add(new Instr(Prim.FILL, new Color(0xa30075)));
-		MarinaNF.add(new Instr(Prim.SYMB, new Symbols.Symbol(Harbours.Yacht, 1.0, 0, 0, null, null)));
+		MarinaNF.add(new Instr(Prim.SYMB, new Symbols.SubSymbol(Harbours.Yacht, 1.0, 0, 0, null, null)));
 	}
-	public static final ArrayList<Instr> PortCrane = new ArrayList<Instr>();
+	public static final Symbol PortCrane = new Symbol();
 	static {
 		PortCrane.add(new Instr(Prim.STRK, new BasicStroke(4.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)));
@@ -154,10 +152,10 @@
 		PortCrane.add(new Instr(Prim.LINE, new Line2D.Double(0,0,0,-60)));
 	}
-	public static final ArrayList<Instr> Post = new ArrayList<Instr>();
+	public static final Symbol Post = new Symbol();
 	static {
 		Post.add(new Instr(Prim.FILL, Color.black));
 		Post.add(new Instr(Prim.RSHP, new Ellipse2D.Double(-10,-10,20,20)));
 	}
-	public static final ArrayList<Instr> SignalStation = new ArrayList<Instr>();
+	public static final Symbol SignalStation = new Symbol();
 	static {
 		SignalStation.add(new Instr(Prim.STRK, new BasicStroke(4.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)));
@@ -166,5 +164,5 @@
 		SignalStation.add(new Instr(Prim.RSHP, new Ellipse2D.Double(-4,-4,8,8)));
 	}
-	public static final ArrayList<Instr> TideGauge = new ArrayList<Instr>();
+	public static final Symbol TideGauge = new Symbol();
 	static {
 		TideGauge.add(new Instr(Prim.STRK, new BasicStroke(3.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)));
Index: applications/editors/josm/plugins/smed2/src/symbols/Landmarks.java
===================================================================
--- applications/editors/josm/plugins/smed2/src/symbols/Landmarks.java	(revision 29185)
+++ applications/editors/josm/plugins/smed2/src/symbols/Landmarks.java	(revision 29186)
@@ -17,5 +17,4 @@
 import java.awt.geom.Path2D;
 import java.awt.geom.Rectangle2D;
-import java.util.ArrayList;
 import java.util.EnumMap;
 
@@ -25,5 +24,5 @@
 
 public class Landmarks {
-	private static final ArrayList<Instr> Base = new ArrayList<Instr>();
+	private static final Symbol Base = new Symbol();
 	static {
 		Base.add(new Instr(Prim.STRK, new BasicStroke(4.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)));
@@ -34,7 +33,7 @@
 	}
 	
-	public static final ArrayList<Instr> Chimney = new ArrayList<Instr>();
-	static {
-		Chimney.add(new Instr(Prim.SYMB, new Symbols.Symbol(Landmarks.Base, 1.0, 0, 0, null, null)));
+	public static final Symbol Chimney = new Symbol();
+	static {
+		Chimney.add(new Instr(Prim.SYMB, new Symbols.SubSymbol(Landmarks.Base, 1.0, 0, 0, null, null)));
 		Chimney.add(new Instr(Prim.STRK, new BasicStroke(4.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)));
 		Chimney.add(new Instr(Prim.FILL, Color.black));
@@ -45,5 +44,5 @@
 		Chimney.add(new Instr(Prim.PLIN, p));
 	}
-	public static final ArrayList<Instr> Church = new ArrayList<Instr>();
+	public static final Symbol Church = new Symbol();
 	static {
 		Church.add(new Instr(Prim.FILL, Color.black));
@@ -55,5 +54,5 @@
 		Church.add(new Instr(Prim.PGON, p));
 	}
-	public static final ArrayList<Instr> ChurchTower = new ArrayList<Instr>();
+	public static final Symbol ChurchTower = new Symbol();
 	static {
 		ChurchTower.add(new Instr(Prim.STRK, new BasicStroke(4.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)));
@@ -62,7 +61,7 @@
 		ChurchTower.add(new Instr(Prim.ELPS, new Ellipse2D.Double(-2,-2,4,4)));
 	}
-	public static final ArrayList<Instr> Cross = new ArrayList<Instr>();
-	static {
-		Cross.add(new Instr(Prim.SYMB, new Symbols.Symbol(Landmarks.Base, 1.0, 0, 0, null, null)));
+	public static final Symbol Cross = new Symbol();
+	static {
+		Cross.add(new Instr(Prim.SYMB, new Symbols.SubSymbol(Landmarks.Base, 1.0, 0, 0, null, null)));
 		Cross.add(new Instr(Prim.STRK, new BasicStroke(6.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)));
 		Cross.add(new Instr(Prim.FILL, Color.black));
@@ -70,7 +69,7 @@
 		Cross.add(new Instr(Prim.LINE, new Line2D.Double(-30,-115,30,-115)));
 	}
-	public static final ArrayList<Instr> DishAerial = new ArrayList<Instr>();
-	static {
-		DishAerial.add(new Instr(Prim.SYMB, new Symbols.Symbol(Landmarks.Base, 1.0, 0, 0, null, null)));
+	public static final Symbol DishAerial = new Symbol();
+	static {
+		DishAerial.add(new Instr(Prim.SYMB, new Symbols.SubSymbol(Landmarks.Base, 1.0, 0, 0, null, null)));
 		DishAerial.add(new Instr(Prim.STRK, new BasicStroke(4.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL)));
 		DishAerial.add(new Instr(Prim.FILL, Color.black));
@@ -79,5 +78,5 @@
 		DishAerial.add(new Instr(Prim.PLIN, p));
 	}
-	public static final ArrayList<Instr> Dome = new ArrayList<Instr>();
+	public static final Symbol Dome = new Symbol();
 	static {
 		Dome.add(new Instr(Prim.STRK, new BasicStroke(4.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)));
@@ -86,7 +85,7 @@
 		Dome.add(new Instr(Prim.RSHP, new Ellipse2D.Double(-4,-4,8,8)));
 	}
-	public static final ArrayList<Instr> Flagstaff = new ArrayList<Instr>();
-	static {
-		Flagstaff.add(new Instr(Prim.SYMB, new Symbols.Symbol(Landmarks.Base, 1.0, 0, 0, null, null)));
+	public static final Symbol Flagstaff = new Symbol();
+	static {
+		Flagstaff.add(new Instr(Prim.SYMB, new Symbols.SubSymbol(Landmarks.Base, 1.0, 0, 0, null, null)));
 		Flagstaff.add(new Instr(Prim.STRK, new BasicStroke(4.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)));
 		Flagstaff.add(new Instr(Prim.FILL, Color.black));
@@ -94,7 +93,7 @@
 		Flagstaff.add(new Instr(Prim.PLIN, p));
 	}
-	public static final ArrayList<Instr> FlareStack = new ArrayList<Instr>();
-	static {
-		FlareStack.add(new Instr(Prim.SYMB, new Symbols.Symbol(Landmarks.Base, 1.0, 0, 0, null, null)));
+	public static final Symbol FlareStack = new Symbol();
+	static {
+		FlareStack.add(new Instr(Prim.SYMB, new Symbols.SubSymbol(Landmarks.Base, 1.0, 0, 0, null, null)));
 		FlareStack.add(new Instr(Prim.STRK, new BasicStroke(4.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)));
 		FlareStack.add(new Instr(Prim.FILL, Color.black));
@@ -105,7 +104,7 @@
 		FlareStack.add(new Instr(Prim.PLIN, p));
 	}
-	public static final ArrayList<Instr> LandTower = new ArrayList<Instr>();
-	static {
-		LandTower.add(new Instr(Prim.SYMB, new Symbols.Symbol(Landmarks.Base, 1.0, 0, 0, null, null)));
+	public static final Symbol LandTower = new Symbol();
+	static {
+		LandTower.add(new Instr(Prim.SYMB, new Symbols.SubSymbol(Landmarks.Base, 1.0, 0, 0, null, null)));
 		LandTower.add(new Instr(Prim.STRK, new BasicStroke(4.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)));
 		LandTower.add(new Instr(Prim.FILL, Color.black));
@@ -114,7 +113,7 @@
 		LandTower.add(new Instr(Prim.RECT, new Rectangle2D.Double(-15,-150,30,30)));
 	}
-	public static final ArrayList<Instr> Mast = new ArrayList<Instr>();
-	static {
-		Mast.add(new Instr(Prim.SYMB, new Symbols.Symbol(Landmarks.Base, 1.0, 0, 0, null, null)));
+	public static final Symbol Mast = new Symbol();
+	static {
+		Mast.add(new Instr(Prim.SYMB, new Symbols.SubSymbol(Landmarks.Base, 1.0, 0, 0, null, null)));
 		Mast.add(new Instr(Prim.STRK, new BasicStroke(4.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL)));
 		Mast.add(new Instr(Prim.FILL, Color.black));
@@ -122,7 +121,7 @@
 		Mast.add(new Instr(Prim.PLIN, p));
 	}
-	public static final ArrayList<Instr> Monument = new ArrayList<Instr>();
-	static {
-		Monument.add(new Instr(Prim.SYMB, new Symbols.Symbol(Landmarks.Base, 1.0, 0, 0, null, null)));
+	public static final Symbol Monument = new Symbol();
+	static {
+		Monument.add(new Instr(Prim.SYMB, new Symbols.SubSymbol(Landmarks.Base, 1.0, 0, 0, null, null)));
 		Monument.add(new Instr(Prim.STRK, new BasicStroke(4.0f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_MITER)));
 		Monument.add(new Instr(Prim.FILL, Color.black));
@@ -131,5 +130,5 @@
 		Monument.add(new Instr(Prim.EARC, new Arc2D.Double(-25.0,-150.0,50.0,50.0,233.0,-285.0,Arc2D.OPEN)));
 	}
-	public static final ArrayList<Instr> Platform = new ArrayList<Instr>();
+	public static final Symbol Platform = new Symbol();
 	static {
 		Platform.add(new Instr(Prim.STRK, new BasicStroke(4.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)));
@@ -138,5 +137,5 @@
 		Platform.add(new Instr(Prim.RSHP, new Ellipse2D.Double(-4,-4,8,8)));
 	}
-	public static final ArrayList<Instr> RadioTV = new ArrayList<Instr>();
+	public static final Symbol RadioTV = new Symbol();
 	static {
 		RadioTV.add(new Instr(Prim.STRK, new BasicStroke(4.0f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_BEVEL)));
@@ -147,5 +146,5 @@
 		RadioTV.add(new Instr(Prim.EARC, new Arc2D.Double(-45.0,-195.0,90.0,90.0,225.0,-90.0,Arc2D.OPEN)));
 	}
-	public static final ArrayList<Instr> Spire = new ArrayList<Instr>();
+	public static final Symbol Spire = new Symbol();
 	static {
 		Spire.add(new Instr(Prim.STRK, new BasicStroke(4.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)));
@@ -154,7 +153,7 @@
 		Spire.add(new Instr(Prim.RSHP, new Ellipse2D.Double(-4,-4,8,8)));
 	}
-	public static final ArrayList<Instr> Minaret = new ArrayList<Instr>();
-	static {
-		Minaret.add(new Instr(Prim.SYMB, new Symbols.Symbol(Landmarks.Spire, 1.0, 0, 0, null, null)));
+	public static final Symbol Minaret = new Symbol();
+	static {
+		Minaret.add(new Instr(Prim.SYMB, new Symbols.SubSymbol(Landmarks.Spire, 1.0, 0, 0, null, null)));
 		Minaret.add(new Instr(Prim.STRK, new BasicStroke(6.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)));
 		Minaret.add(new Instr(Prim.LINE, new Line2D.Double(0,-25,0,-50)));
@@ -162,5 +161,5 @@
 		Minaret.add(new Instr(Prim.EARC, new Arc2D.Double(-40.0,-110.0,80.0,60.0,180.0,180.0,Arc2D.OPEN)));
 	}
-	public static final ArrayList<Instr> Temple = new ArrayList<Instr>();
+	public static final Symbol Temple = new Symbol();
 	static {
 		Temple.add(new Instr(Prim.STRK, new BasicStroke(4.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)));
@@ -170,7 +169,7 @@
 		Temple.add(new Instr(Prim.LINE, new Line2D.Double(-35,21,35,-21)));
 	}
-	public static final ArrayList<Instr> WaterTower = new ArrayList<Instr>();
-	static {
-		WaterTower.add(new Instr(Prim.SYMB, new Symbols.Symbol(Landmarks.Base, 1.0, 0, 0, null, null)));
+	public static final Symbol WaterTower = new Symbol();
+	static {
+		WaterTower.add(new Instr(Prim.SYMB, new Symbols.SubSymbol(Landmarks.Base, 1.0, 0, 0, null, null)));
 		WaterTower.add(new Instr(Prim.STRK, new BasicStroke(4.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)));
 		WaterTower.add(new Instr(Prim.FILL, Color.black));
@@ -179,7 +178,7 @@
 		WaterTower.add(new Instr(Prim.RECT, new Rectangle2D.Double(-25,-150,50,30)));
 	}
-	public static final ArrayList<Instr> WindMotor = new ArrayList<Instr>();
-	static {
-		WindMotor.add(new Instr(Prim.SYMB, new Symbols.Symbol(Landmarks.Base, 1.0, 0, 0, null, null)));
+	public static final Symbol WindMotor = new Symbol();
+	static {
+		WindMotor.add(new Instr(Prim.SYMB, new Symbols.SubSymbol(Landmarks.Base, 1.0, 0, 0, null, null)));
 		WindMotor.add(new Instr(Prim.STRK, new BasicStroke(4.0f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_MITER)));
 		WindMotor.add(new Instr(Prim.FILL, Color.black));
@@ -189,5 +188,5 @@
 		WindMotor.add(new Instr(Prim.LINE, new Line2D.Double(0,-90,-14.3,-66.7)));
 	}
-	public static final ArrayList<Instr> Windmill = new ArrayList<Instr>();
+	public static final Symbol Windmill = new Symbol();
 	static {
 		Windmill.add(new Instr(Prim.STRK, new BasicStroke(4.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)));
@@ -197,7 +196,7 @@
 		Windmill.add(new Instr(Prim.LINE, new Line2D.Double(-30,10,30,-42)));
 	}
-	public static final ArrayList<Instr> Windsock = new ArrayList<Instr>();
-	static {
-		Windsock.add(new Instr(Prim.SYMB, new Symbols.Symbol(Landmarks.Base, 1.0, 0, 0, null, null)));
+	public static final Symbol Windsock = new Symbol();
+	static {
+		Windsock.add(new Instr(Prim.SYMB, new Symbols.SubSymbol(Landmarks.Base, 1.0, 0, 0, null, null)));
 		Windsock.add(new Instr(Prim.STRK, new BasicStroke(4.0f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_MITER)));
 		Windsock.add(new Instr(Prim.FILL, Color.black));
@@ -212,5 +211,5 @@
 	}
 	
-	public static final EnumMap<CatLMK, ArrayList<Instr>> Shapes = new EnumMap<CatLMK, ArrayList<Instr>>(CatLMK.class);
+	public static final EnumMap<CatLMK, Symbol> Shapes = new EnumMap<CatLMK, Symbol>(CatLMK.class);
 	static {
 		Shapes.put(CatLMK.LMK_CARN, Beacons.Cairn); Shapes.put(CatLMK.LMK_CHMY, Landmarks.Chimney);
@@ -224,5 +223,5 @@
 	}
 
-	public static final EnumMap<FncFNC, ArrayList<Instr>> Funcs = new EnumMap<FncFNC, ArrayList<Instr>>(FncFNC.class);
+	public static final EnumMap<FncFNC, Symbol> Funcs = new EnumMap<FncFNC, Symbol>(FncFNC.class);
 	static {
 		Funcs.put(FncFNC.FNC_CHCH, Landmarks.Church); Funcs.put(FncFNC.FNC_CHPL, Landmarks.Church); Funcs.put(FncFNC.FNC_TMPL, Landmarks.Temple);
Index: applications/editors/josm/plugins/smed2/src/symbols/Notices.java
===================================================================
--- applications/editors/josm/plugins/smed2/src/symbols/Notices.java	(revision 29185)
+++ applications/editors/josm/plugins/smed2/src/symbols/Notices.java	(revision 29186)
@@ -15,14 +15,9 @@
 import java.awt.Rectangle;
 import java.awt.geom.*;
-import java.util.ArrayList;
-
-import symbols.Symbols.Caption;
-import symbols.Symbols.Delta;
-import symbols.Symbols.Handle;
-import symbols.Symbols.Instr;
-import symbols.Symbols.Prim;
+
+import symbols.Symbols.*;
 
 public class Notices {
-	private static final ArrayList<Instr> Bollard = new ArrayList<Instr>();
+	private static final Symbol Bollard = new Symbol();
 	static {
 		Bollard.add(new Instr(Prim.FILL, Color.black));
@@ -33,11 +28,11 @@
 		Bollard.add(new Instr(Prim.PGON, p));
 	}
-	private static final ArrayList<Instr> Crossing = new ArrayList<Instr>();
-	private static final ArrayList<Instr> CrossingL = new ArrayList<Instr>();
-	private static final ArrayList<Instr> CrossingR = new ArrayList<Instr>();
-	private static final ArrayList<Instr> Junction = new ArrayList<Instr>();
-	private static final ArrayList<Instr> JunctionL = new ArrayList<Instr>();
-	private static final ArrayList<Instr> JunctionR = new ArrayList<Instr>();
-	private static final ArrayList<Instr> Motor = new ArrayList<Instr>();
+	private static final Symbol Crossing = new Symbol();
+	private static final Symbol CrossingL = new Symbol();
+	private static final Symbol CrossingR = new Symbol();
+	private static final Symbol Junction = new Symbol();
+	private static final Symbol JunctionL = new Symbol();
+	private static final Symbol JunctionR = new Symbol();
+	private static final Symbol Motor = new Symbol();
 	static {
 		Motor.add(new Instr(Prim.FILL, Color.black));
@@ -48,16 +43,16 @@
 		Motor.add(new Instr(Prim.PGON, p));
 	}
-	private static final ArrayList<Instr> Proceed = new ArrayList<Instr>();
-	private static final ArrayList<Instr> Rowboat = new ArrayList<Instr>();
-	private static final ArrayList<Instr> Sailboard = new ArrayList<Instr>();
-	private static final ArrayList<Instr> Sailboat = new ArrayList<Instr>();
-	private static final ArrayList<Instr> Slipway = new ArrayList<Instr>();
-	private static final ArrayList<Instr> Speedboat = new ArrayList<Instr>();
-	private static final ArrayList<Instr> Sport = new ArrayList<Instr>();
+	private static final Symbol Proceed = new Symbol();
+	private static final Symbol Rowboat = new Symbol();
+	private static final Symbol Sailboard = new Symbol();
+	private static final Symbol Sailboat = new Symbol();
+	private static final Symbol Slipway = new Symbol();
+	private static final Symbol Speedboat = new Symbol();
+	private static final Symbol Sport = new Symbol();
 	static {
 		Sport.add(new Instr(Prim.FONT, new Font("Arial", Font.BOLD, 15)));
 		Sport.add(new Instr(Prim.TEXT, new Caption("SPORT", (float)-25.0, (float)5.0)));
 	}
-	private static final ArrayList<Instr> Turn = new ArrayList<Instr>();
+	private static final Symbol Turn = new Symbol();
 	static {
 		Turn.add(new Instr(Prim.STRK, new BasicStroke(5.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)));
@@ -69,12 +64,12 @@
 		Turn.add(new Instr(Prim.PGON, p));
 	}
-	private static final ArrayList<Instr> VHF = new ArrayList<Instr>();
+	private static final Symbol VHF = new Symbol();
 	static {
 		VHF.add(new Instr(Prim.FONT, new Font("Arial", Font.BOLD, 20)));
 		VHF.add(new Instr(Prim.TEXT, new Caption("VHF", (float)-20.0, (float)-5.0)));
 	}
-	private static final ArrayList<Instr> Waterbike = new ArrayList<Instr>();
-	private static final ArrayList<Instr> Waterski = new ArrayList<Instr>();
-	private static final ArrayList<Instr> NoticeA = new ArrayList<Instr>();
+	private static final Symbol Waterbike = new Symbol();
+	private static final Symbol Waterski = new Symbol();
+	private static final Symbol NoticeA = new Symbol();
 	static {
 		NoticeA.add(new Instr(Prim.FILL, new Color(0xe80000)));
@@ -89,5 +84,5 @@
 		NoticeA.add(new Instr(Prim.RRCT, new RoundRectangle2D.Double(-30,-30,60,60,4,4)));
 	}
-	private static final ArrayList<Instr> NoticeB = new ArrayList<Instr>();
+	private static final Symbol NoticeB = new Symbol();
 	static {
 		NoticeB.add(new Instr(Prim.FILL, new Color(0xe80000)));
@@ -99,5 +94,5 @@
 		NoticeB.add(new Instr(Prim.RRCT, new RoundRectangle2D.Double(-30,-30,60,60,4,4)));
 	}
-	private static final ArrayList<Instr> NoticeE = new ArrayList<Instr>();
+	private static final Symbol NoticeE = new Symbol();
 	static {
 		NoticeE.add(new Instr(Prim.FILL, new Color(0x0000a0)));
@@ -108,6 +103,6 @@
 	}
 
-	public static final ArrayList<Instr> Notice = new ArrayList<Instr>();
-	public static final ArrayList<Instr> NoticeA1 = new ArrayList<Instr>();
+	public static final Symbol Notice = new Symbol();
+	public static final Symbol NoticeA1 = new Symbol();
 	static {
 		NoticeA1.add(new Instr(Prim.FILL, new Color(0xe80000)));
@@ -119,5 +114,5 @@
 		NoticeA1.add(new Instr(Prim.RRCT, new RoundRectangle2D.Double(-30,-30,60,60,4,4)));
 	}
-	public static final ArrayList<Instr> NoticeA1a = new ArrayList<Instr>();
+	public static final Symbol NoticeA1a = new Symbol();
 	static {
 		NoticeA1a.add(new Instr(Prim.FILL, new Color(0xe80000)));
@@ -129,7 +124,7 @@
 		NoticeA1a.add(new Instr(Prim.ELPS, new Ellipse2D.Double(-30,-30,60,60)));
 	}
-	public static final ArrayList<Instr> NoticeA2 = new ArrayList<Instr>();
-	static {
-		NoticeA2.add(new Instr(Prim.SYMB, new Symbols.Symbol(Notices.NoticeA, 1.0, 0, 0, null, null)));
+	public static final Symbol NoticeA2 = new Symbol();
+	static {
+		NoticeA2.add(new Instr(Prim.SYMB, new Symbols.SubSymbol(Notices.NoticeA, 1.0, 0, 0, null, null)));
 		NoticeA2.add(new Instr(Prim.FILL, Color.black));
 		Path2D.Double p = new Path2D.Double(); p.moveTo(-10,23); p.lineTo(-10,0); p.lineTo(-6,0); p.lineTo(-12.5,-8); p.lineTo(-19,0); p.lineTo(-15,0); p.lineTo(-15,23);
@@ -137,14 +132,14 @@
 		NoticeA2.add(new Instr(Prim.PGON, p));
 	}
-	public static final ArrayList<Instr> NoticeA3 = new ArrayList<Instr>();
-	static {
-		NoticeA3.add(new Instr(Prim.SYMB, new Symbols.Symbol(Notices.NoticeA2, 1.0, 0, 0, null, null)));
+	public static final Symbol NoticeA3 = new Symbol();
+	static {
+		NoticeA3.add(new Instr(Prim.SYMB, new Symbols.SubSymbol(Notices.NoticeA2, 1.0, 0, 0, null, null)));
 		Path2D.Double p = new Path2D.Double(); p.moveTo(-10,12); p.lineTo(-6,12); p.lineTo(-12.5,4); p.lineTo(-19,12);
 		p.closePath(); p.moveTo(10,-3); p.lineTo(6,-3); p.lineTo(12.5,-11); p.lineTo(19,-3); p.closePath();
 		NoticeA3.add(new Instr(Prim.PGON, p));
 	}
-	public static final ArrayList<Instr> NoticeA4 = new ArrayList<Instr>();
-	static {
-		NoticeA4.add(new Instr(Prim.SYMB, new Symbols.Symbol(Notices.NoticeA, 1.0, 0, 0, null, null)));
+	public static final Symbol NoticeA4 = new Symbol();
+	static {
+		NoticeA4.add(new Instr(Prim.SYMB, new Symbols.SubSymbol(Notices.NoticeA, 1.0, 0, 0, null, null)));
 		NoticeA4.add(new Instr(Prim.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);
@@ -152,14 +147,14 @@
 		NoticeA4.add(new Instr(Prim.PGON, p));
 	}
-	public static final ArrayList<Instr> NoticeA4_1 = new ArrayList<Instr>();
-	static {
-		NoticeA4_1.add(new Instr(Prim.SYMB, new Symbols.Symbol(Notices.NoticeA4, 1.0, 0, 0, null, null)));
+	public static final Symbol NoticeA4_1 = new Symbol();
+	static {
+		NoticeA4_1.add(new Instr(Prim.SYMB, new Symbols.SubSymbol(Notices.NoticeA4, 1.0, 0, 0, null, null)));
 		Path2D.Double p = new Path2D.Double(); p.moveTo(-10,-4); p.lineTo(-6,-4); p.lineTo(-12.5,4); p.lineTo(-19,-4);
 		p.closePath(); p.moveTo(10,5); p.lineTo(6,5); p.lineTo(12.5,-3); p.lineTo(19,5); p.closePath();
 		NoticeA4_1.add(new Instr(Prim.PGON, p));
 	}
-	public static final ArrayList<Instr> NoticeA5 = new ArrayList<Instr>();
-	static {
-		NoticeA5.add(new Instr(Prim.SYMB, new Symbols.Symbol(Notices.NoticeA, 1.0, 0, 0, null, null)));
+	public static final Symbol NoticeA5 = new Symbol();
+	static {
+		NoticeA5.add(new Instr(Prim.SYMB, new Symbols.SubSymbol(Notices.NoticeA, 1.0, 0, 0, null, null)));
 		NoticeA5.add(new Instr(Prim.FILL, Color.black));
 		Path2D.Double p = new Path2D.Double(); p.setWindingRule(GeneralPath.WIND_EVEN_ODD); p.moveTo(-5.3,14.6); p.lineTo(-5.3,4.0); p.lineTo(0.0,4.0); p.curveTo(4.2,4.0,7.4,3.5,9.4,0.0);
@@ -168,26 +163,26 @@
 		NoticeA5.add(new Instr(Prim.PGON, p));
 	}
-	public static final ArrayList<Instr> NoticeA5_1 = new ArrayList<Instr>();
-	static {
-		NoticeA5_1.add(new Instr(Prim.SYMB, new Symbols.Symbol(Notices.NoticeA, 1.0, 0, 0, null, null)));
-	}
-	public static final ArrayList<Instr> NoticeA6 = new ArrayList<Instr>();
-	static {
-		NoticeA6.add(new Instr(Prim.SYMB, new Symbols.Symbol(Notices.NoticeA, 1.0, 0, 0, null, null)));
-		NoticeA6.add(new Instr(Prim.SYMB, new Symbols.Symbol(Harbours.Anchor, 0.4, 0, 0, new Delta(Handle.CC, AffineTransform.getRotateInstance(Math.toRadians(180.0))), null)));
-	}
-	public static final ArrayList<Instr> NoticeA7 = new ArrayList<Instr>();
-	static {
-		NoticeA7.add(new Instr(Prim.SYMB, new Symbols.Symbol(Notices.NoticeA, 1.0, 0, 0, null, null)));
-		NoticeA7.add(new Instr(Prim.SYMB, new Symbols.Symbol(Notices.Bollard, 1.0, 0, 0, null, null)));
-	}
-	public static final ArrayList<Instr> NoticeA8 = new ArrayList<Instr>();
-	static {
-		NoticeA8.add(new Instr(Prim.SYMB, new Symbols.Symbol(Notices.NoticeA, 1.0, 0, 0, null, null)));
-		NoticeA8.add(new Instr(Prim.SYMB, new Symbols.Symbol(Notices.Turn, 1.0, 0, 0, null, null)));
-	}
-	public static final ArrayList<Instr> NoticeA9 = new ArrayList<Instr>();
-	static {
-		NoticeA9.add(new Instr(Prim.SYMB, new Symbols.Symbol(Notices.NoticeA, 1.0, 0, 0, null, null)));
+	public static final Symbol NoticeA5_1 = new Symbol();
+	static {
+		NoticeA5_1.add(new Instr(Prim.SYMB, new Symbols.SubSymbol(Notices.NoticeA, 1.0, 0, 0, null, null)));
+	}
+	public static final Symbol NoticeA6 = new Symbol();
+	static {
+		NoticeA6.add(new Instr(Prim.SYMB, new Symbols.SubSymbol(Notices.NoticeA, 1.0, 0, 0, null, null)));
+		NoticeA6.add(new Instr(Prim.SYMB, new Symbols.SubSymbol(Harbours.Anchor, 0.4, 0, 0, new Delta(Handle.CC, AffineTransform.getRotateInstance(Math.toRadians(180.0))), null)));
+	}
+	public static final Symbol NoticeA7 = new Symbol();
+	static {
+		NoticeA7.add(new Instr(Prim.SYMB, new Symbols.SubSymbol(Notices.NoticeA, 1.0, 0, 0, null, null)));
+		NoticeA7.add(new Instr(Prim.SYMB, new Symbols.SubSymbol(Notices.Bollard, 1.0, 0, 0, null, null)));
+	}
+	public static final Symbol NoticeA8 = new Symbol();
+	static {
+		NoticeA8.add(new Instr(Prim.SYMB, new Symbols.SubSymbol(Notices.NoticeA, 1.0, 0, 0, null, null)));
+		NoticeA8.add(new Instr(Prim.SYMB, new Symbols.SubSymbol(Notices.Turn, 1.0, 0, 0, null, null)));
+	}
+	public static final Symbol NoticeA9 = new Symbol();
+	static {
+		NoticeA9.add(new Instr(Prim.SYMB, new Symbols.SubSymbol(Notices.NoticeA, 1.0, 0, 0, null, null)));
 		NoticeA9.add(new Instr(Prim.STRK, new BasicStroke(7.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)));
 		NoticeA9.add(new Instr(Prim.FILL, Color.black));
@@ -196,5 +191,5 @@
 		NoticeA9.add(new Instr(Prim.PLIN, p));
 	}
-	public static final ArrayList<Instr> NoticeA10a = new ArrayList<Instr>();
+	public static final Symbol NoticeA10a = new Symbol();
 	static {
 		NoticeA10a.add(new Instr(Prim.BBOX, new Rectangle(-30,-30,60,60)));
@@ -210,96 +205,96 @@
 		NoticeA10a.add(new Instr(Prim.PLIN, p));
 	}
-	public static final ArrayList<Instr> NoticeA10b = new ArrayList<Instr>();
-	static {
-		NoticeA10b.add(new Instr(Prim.SYMB, new Symbols.Symbol(Notices.NoticeA10a, 1.0, 0, 0, new Delta(Handle.CC, AffineTransform.getRotateInstance(Math.toRadians(180.0))), null)));
-	}
-	public static final ArrayList<Instr> NoticeA12= new ArrayList<Instr>();
-	static {
-		NoticeA12.add(new Instr(Prim.SYMB, new Symbols.Symbol(Notices.NoticeA, 1.0, 0, 0, null, null)));
-		NoticeA12.add(new Instr(Prim.SYMB, new Symbols.Symbol(Notices.Motor, 1.0, 0, 0, null, null)));
-	}
-	public static final ArrayList<Instr> NoticeA13= new ArrayList<Instr>();
-	static {
-		NoticeA13.add(new Instr(Prim.SYMB, new Symbols.Symbol(Notices.NoticeA, 1.0, 0, 0, null, null)));
-		NoticeA13.add(new Instr(Prim.SYMB, new Symbols.Symbol(Notices.Sport, 1.0, 0, 0, null, null)));
-	}
-	public static final ArrayList<Instr> NoticeA14= new ArrayList<Instr>();
-	static {
-		NoticeA14.add(new Instr(Prim.SYMB, new Symbols.Symbol(Notices.NoticeA, 1.0, 0, 0, null, null)));
-		NoticeA14.add(new Instr(Prim.SYMB, new Symbols.Symbol(Notices.Waterski, 1.0, 0, 0, null, null)));
-	}
-	public static final ArrayList<Instr> NoticeA15= new ArrayList<Instr>();
-	static {
-		NoticeA15.add(new Instr(Prim.SYMB, new Symbols.Symbol(Notices.NoticeA, 1.0, 0, 0, null, null)));
-		NoticeA15.add(new Instr(Prim.SYMB, new Symbols.Symbol(Notices.Sailboat, 1.0, 0, 0, null, null)));
-	}
-	public static final ArrayList<Instr> NoticeA16= new ArrayList<Instr>();
-	static {
-		NoticeA16.add(new Instr(Prim.SYMB, new Symbols.Symbol(Notices.NoticeA, 1.0, 0, 0, null, null)));
-		NoticeA16.add(new Instr(Prim.SYMB, new Symbols.Symbol(Notices.Rowboat, 1.0, 0, 0, null, null)));
-	}
-	public static final ArrayList<Instr> NoticeA17= new ArrayList<Instr>();
-	static {
-		NoticeA17.add(new Instr(Prim.SYMB, new Symbols.Symbol(Notices.NoticeA, 1.0, 0, 0, null, null)));
-		NoticeA17.add(new Instr(Prim.SYMB, new Symbols.Symbol(Notices.Sailboard, 1.0, 0, 0, null, null)));
-	}
-	public static final ArrayList<Instr> NoticeA18= new ArrayList<Instr>();
-	static {
-		NoticeA18.add(new Instr(Prim.SYMB, new Symbols.Symbol(Notices.NoticeA, 1.0, 0, 0, null, null)));
-		NoticeA18.add(new Instr(Prim.SYMB, new Symbols.Symbol(Notices.Speedboat, 1.0, 0, 0, null, null)));
-	}
-	public static final ArrayList<Instr> NoticeA19= new ArrayList<Instr>();
-	static {
-		NoticeA19.add(new Instr(Prim.SYMB, new Symbols.Symbol(Notices.NoticeA, 1.0, 0, 0, null, null)));
-		NoticeA19.add(new Instr(Prim.SYMB, new Symbols.Symbol(Notices.Slipway, 1.0, 0, 0, null, null)));
-	}
-	public static final ArrayList<Instr> NoticeA20= new ArrayList<Instr>();
-	static {
-		NoticeA20.add(new Instr(Prim.SYMB, new Symbols.Symbol(Notices.NoticeA, 1.0, 0, 0, null, null)));
-		NoticeA20.add(new Instr(Prim.SYMB, new Symbols.Symbol(Notices.Waterbike, 1.0, 0, 0, null, null)));
-	}
-	public static final ArrayList<Instr> NoticeB2a = new ArrayList<Instr>();
-	public static final ArrayList<Instr> NoticeB2b = new ArrayList<Instr>();
-	public static final ArrayList<Instr> NoticeB3a = new ArrayList<Instr>();
-	public static final ArrayList<Instr> NoticeB3b = new ArrayList<Instr>();
-	public static final ArrayList<Instr> NoticeB4a = new ArrayList<Instr>();
-	public static final ArrayList<Instr> NoticeB4b = new ArrayList<Instr>();
-	public static final ArrayList<Instr> NoticeB5 = new ArrayList<Instr>();
-	public static final ArrayList<Instr> NoticeB7 = new ArrayList<Instr>();
-	public static final ArrayList<Instr> NoticeB8 = new ArrayList<Instr>();
-	public static final ArrayList<Instr> NoticeB11a = new ArrayList<Instr>();
-	static {
-		NoticeB11a.add(new Instr(Prim.SYMB, new Symbols.Symbol(Notices.NoticeB, 1.0, 0, 0, null, null)));
-		NoticeB11a.add(new Instr(Prim.SYMB, new Symbols.Symbol(Notices.VHF, 1.0, 0, 0, null, null)));
-	}
-	public static final ArrayList<Instr> NoticeC1 = new ArrayList<Instr>();
-	public static final ArrayList<Instr> NoticeC2 = new ArrayList<Instr>();
-	public static final ArrayList<Instr> NoticeC3 = new ArrayList<Instr>();
-	public static final ArrayList<Instr> NoticeC5a = new ArrayList<Instr>();
-	public static final ArrayList<Instr> NoticeC5b = new ArrayList<Instr>();
-	public static final ArrayList<Instr> NoticeD1a = new ArrayList<Instr>();
-	public static final ArrayList<Instr> NoticeD1b = new ArrayList<Instr>();
-	public static final ArrayList<Instr> NoticeD2a = new ArrayList<Instr>();
-	public static final ArrayList<Instr> NoticeD2b = new ArrayList<Instr>();
-	public static final ArrayList<Instr> NoticeE1 = new ArrayList<Instr>();
-	public static final ArrayList<Instr> NoticeE2 = new ArrayList<Instr>();
-	public static final ArrayList<Instr> NoticeE3 = new ArrayList<Instr>();
-	public static final ArrayList<Instr> NoticeE4a = new ArrayList<Instr>();
-	public static final ArrayList<Instr> NoticeE4b = new ArrayList<Instr>();
-	public static final ArrayList<Instr> NoticeE5_4 = new ArrayList<Instr>();
-	public static final ArrayList<Instr> NoticeE5_5 = new ArrayList<Instr>();
-	public static final ArrayList<Instr> NoticeE5_6 = new ArrayList<Instr>();
-	public static final ArrayList<Instr> NoticeE5_7 = new ArrayList<Instr>();
-	public static final ArrayList<Instr> NoticeE5_8 = new ArrayList<Instr>();
-	public static final ArrayList<Instr> NoticeE5_9 = new ArrayList<Instr>();
-	public static final ArrayList<Instr> NoticeE5_10 = new ArrayList<Instr>();
-	public static final ArrayList<Instr> NoticeE5_11 = new ArrayList<Instr>();
-	public static final ArrayList<Instr> NoticeE5_12 = new ArrayList<Instr>();
-	public static final ArrayList<Instr> NoticeE5_13 = new ArrayList<Instr>();
-	public static final ArrayList<Instr> NoticeE5_14 = new ArrayList<Instr>();
-	public static final ArrayList<Instr> NoticeE5_15 = new ArrayList<Instr>();
-	public static final ArrayList<Instr> NoticeE7_1 = new ArrayList<Instr>();
-	public static final ArrayList<Instr> Notice11 = new ArrayList<Instr>();
-	public static final ArrayList<Instr> Notice13 = new ArrayList<Instr>();
-	public static final ArrayList<Instr> Notice14 = new ArrayList<Instr>();
+	public static final Symbol NoticeA10b = new Symbol();
+	static {
+		NoticeA10b.add(new Instr(Prim.SYMB, new Symbols.SubSymbol(Notices.NoticeA10a, 1.0, 0, 0, new Delta(Handle.CC, AffineTransform.getRotateInstance(Math.toRadians(180.0))), null)));
+	}
+	public static final Symbol NoticeA12= new Symbol();
+	static {
+		NoticeA12.add(new Instr(Prim.SYMB, new Symbols.SubSymbol(Notices.NoticeA, 1.0, 0, 0, null, null)));
+		NoticeA12.add(new Instr(Prim.SYMB, new Symbols.SubSymbol(Notices.Motor, 1.0, 0, 0, null, null)));
+	}
+	public static final Symbol NoticeA13= new Symbol();
+	static {
+		NoticeA13.add(new Instr(Prim.SYMB, new Symbols.SubSymbol(Notices.NoticeA, 1.0, 0, 0, null, null)));
+		NoticeA13.add(new Instr(Prim.SYMB, new Symbols.SubSymbol(Notices.Sport, 1.0, 0, 0, null, null)));
+	}
+	public static final Symbol NoticeA14= new Symbol();
+	static {
+		NoticeA14.add(new Instr(Prim.SYMB, new Symbols.SubSymbol(Notices.NoticeA, 1.0, 0, 0, null, null)));
+		NoticeA14.add(new Instr(Prim.SYMB, new Symbols.SubSymbol(Notices.Waterski, 1.0, 0, 0, null, null)));
+	}
+	public static final Symbol NoticeA15= new Symbol();
+	static {
+		NoticeA15.add(new Instr(Prim.SYMB, new Symbols.SubSymbol(Notices.NoticeA, 1.0, 0, 0, null, null)));
+		NoticeA15.add(new Instr(Prim.SYMB, new Symbols.SubSymbol(Notices.Sailboat, 1.0, 0, 0, null, null)));
+	}
+	public static final Symbol NoticeA16= new Symbol();
+	static {
+		NoticeA16.add(new Instr(Prim.SYMB, new Symbols.SubSymbol(Notices.NoticeA, 1.0, 0, 0, null, null)));
+		NoticeA16.add(new Instr(Prim.SYMB, new Symbols.SubSymbol(Notices.Rowboat, 1.0, 0, 0, null, null)));
+	}
+	public static final Symbol NoticeA17= new Symbol();
+	static {
+		NoticeA17.add(new Instr(Prim.SYMB, new Symbols.SubSymbol(Notices.NoticeA, 1.0, 0, 0, null, null)));
+		NoticeA17.add(new Instr(Prim.SYMB, new Symbols.SubSymbol(Notices.Sailboard, 1.0, 0, 0, null, null)));
+	}
+	public static final Symbol NoticeA18= new Symbol();
+	static {
+		NoticeA18.add(new Instr(Prim.SYMB, new Symbols.SubSymbol(Notices.NoticeA, 1.0, 0, 0, null, null)));
+		NoticeA18.add(new Instr(Prim.SYMB, new Symbols.SubSymbol(Notices.Speedboat, 1.0, 0, 0, null, null)));
+	}
+	public static final Symbol NoticeA19= new Symbol();
+	static {
+		NoticeA19.add(new Instr(Prim.SYMB, new Symbols.SubSymbol(Notices.NoticeA, 1.0, 0, 0, null, null)));
+		NoticeA19.add(new Instr(Prim.SYMB, new Symbols.SubSymbol(Notices.Slipway, 1.0, 0, 0, null, null)));
+	}
+	public static final Symbol NoticeA20= new Symbol();
+	static {
+		NoticeA20.add(new Instr(Prim.SYMB, new Symbols.SubSymbol(Notices.NoticeA, 1.0, 0, 0, null, null)));
+		NoticeA20.add(new Instr(Prim.SYMB, new Symbols.SubSymbol(Notices.Waterbike, 1.0, 0, 0, null, null)));
+	}
+	public static final Symbol NoticeB2a = new Symbol();
+	public static final Symbol NoticeB2b = new Symbol();
+	public static final Symbol NoticeB3a = new Symbol();
+	public static final Symbol NoticeB3b = new Symbol();
+	public static final Symbol NoticeB4a = new Symbol();
+	public static final Symbol NoticeB4b = new Symbol();
+	public static final Symbol NoticeB5 = new Symbol();
+	public static final Symbol NoticeB7 = new Symbol();
+	public static final Symbol NoticeB8 = new Symbol();
+	public static final Symbol NoticeB11a = new Symbol();
+	static {
+		NoticeB11a.add(new Instr(Prim.SYMB, new Symbols.SubSymbol(Notices.NoticeB, 1.0, 0, 0, null, null)));
+		NoticeB11a.add(new Instr(Prim.SYMB, new Symbols.SubSymbol(Notices.VHF, 1.0, 0, 0, null, null)));
+	}
+	public static final Symbol NoticeC1 = new Symbol();
+	public static final Symbol NoticeC2 = new Symbol();
+	public static final Symbol NoticeC3 = new Symbol();
+	public static final Symbol NoticeC5a = new Symbol();
+	public static final Symbol NoticeC5b = new Symbol();
+	public static final Symbol NoticeD1a = new Symbol();
+	public static final Symbol NoticeD1b = new Symbol();
+	public static final Symbol NoticeD2a = new Symbol();
+	public static final Symbol NoticeD2b = new Symbol();
+	public static final Symbol NoticeE1 = new Symbol();
+	public static final Symbol NoticeE2 = new Symbol();
+	public static final Symbol NoticeE3 = new Symbol();
+	public static final Symbol NoticeE4a = new Symbol();
+	public static final Symbol NoticeE4b = new Symbol();
+	public static final Symbol NoticeE5_4 = new Symbol();
+	public static final Symbol NoticeE5_5 = new Symbol();
+	public static final Symbol NoticeE5_6 = new Symbol();
+	public static final Symbol NoticeE5_7 = new Symbol();
+	public static final Symbol NoticeE5_8 = new Symbol();
+	public static final Symbol NoticeE5_9 = new Symbol();
+	public static final Symbol NoticeE5_10 = new Symbol();
+	public static final Symbol NoticeE5_11 = new Symbol();
+	public static final Symbol NoticeE5_12 = new Symbol();
+	public static final Symbol NoticeE5_13 = new Symbol();
+	public static final Symbol NoticeE5_14 = new Symbol();
+	public static final Symbol NoticeE5_15 = new Symbol();
+	public static final Symbol NoticeE7_1 = new Symbol();
+	public static final Symbol Notice11 = new Symbol();
+	public static final Symbol Notice13 = new Symbol();
+	public static final Symbol Notice14 = new Symbol();
 }
Index: applications/editors/josm/plugins/smed2/src/symbols/Symbols.java
===================================================================
--- applications/editors/josm/plugins/smed2/src/symbols/Symbols.java	(revision 29185)
+++ applications/editors/josm/plugins/smed2/src/symbols/Symbols.java	(revision 29186)
@@ -97,6 +97,14 @@
 	}
 
-	public static class Symbol {
-		ArrayList<Instr> instr;
+	public static class Symbol extends ArrayList<Instr> {
+		private static final long serialVersionUID = 1L;
+
+		public Symbol() {
+			super();
+		}
+	}
+	
+	public static class SubSymbol {
+		Symbol instr;
 		double scale;
 		double x;
@@ -105,5 +113,5 @@
 		Scheme scheme;
 
-		public Symbol(ArrayList<Instr> iinstr, double iscale, double ix, double iy, Delta idelta, Scheme ischeme) {
+		public SubSymbol(Symbol iinstr, double iscale, double ix, double iy, Delta idelta, Scheme ischeme) {
 			instr = iinstr;
 			scale = iscale;
@@ -115,5 +123,5 @@
 	}
 
-	public static void drawSymbol(Graphics2D g2, ArrayList<Instr> symbol, double scale, double x, double y, Delta dd, Scheme cs) {
+	public static void drawSymbol(Graphics2D g2, Symbol symbol, double scale, double x, double y, Delta dd, Scheme cs) {
 		int pn = 0;
 		int cn = 0;
@@ -260,5 +268,5 @@
 					break;
 				case SYMB:
-					Symbol s = (Symbol) item.params;
+					SubSymbol s = (SubSymbol) item.params;
 					drawSymbol(g2, s.instr, s.scale, s.x, s.y, s.delta, s.scheme);
 					break;
Index: applications/editors/josm/plugins/smed2/src/symbols/Topmarks.java
===================================================================
--- applications/editors/josm/plugins/smed2/src/symbols/Topmarks.java	(revision 29185)
+++ applications/editors/josm/plugins/smed2/src/symbols/Topmarks.java	(revision 29186)
@@ -17,5 +17,4 @@
 import java.awt.geom.Line2D;
 import java.awt.geom.Path2D;
-import java.util.ArrayList;
 import java.util.EnumMap;
 
@@ -25,11 +24,8 @@
 public class Topmarks {
 	
-	public static final ArrayList<Instr> FogSignal = new ArrayList<Instr>();
-	public static final ArrayList<Instr> LightFlare = new ArrayList<Instr>();
-	public static final ArrayList<Instr> Radar = new ArrayList<Instr>();
-	public static final ArrayList<Instr> TopBoard = new ArrayList<Instr>();
+	public static final Symbol TopBoard = new Symbol();
 	static {
 		TopBoard.add(new Instr(Prim.BBOX, new Rectangle(-20,-80,40,80)));
-		ArrayList<Instr> colours = new ArrayList<Instr>();
+		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(Prim.P1, p));
@@ -40,8 +36,8 @@
 		TopBoard.add(new Instr(Prim.PLIN, p));
 	}
-	public static final ArrayList<Instr> TopCan = new ArrayList<Instr>();
+	public static final Symbol TopCan = new Symbol();
 	static {
 		TopCan.add(new Instr(Prim.BBOX, new Rectangle(-20,-80,40,80)));
-		ArrayList<Instr> colours = new ArrayList<Instr>();
+		Symbol colours = new Symbol();
 		Path2D.Double p = new Path2D.Double(); p.moveTo(-12.0,-15.0); p.lineTo(-12.0,-48.0); p.lineTo(12.0,-48.0); p.lineTo(12.0,-15.0); p.closePath();
 		colours.add(new Instr(Prim.P1, p));
@@ -53,8 +49,8 @@
 		TopCan.add(new Instr(Prim.PLIN, p));
 	}
-	public static final ArrayList<Instr> TopCone = new ArrayList<Instr>();
+	public static final Symbol TopCone = new Symbol();
 	static {
 		TopCone.add(new Instr(Prim.BBOX, new Rectangle(-20,-80,40,80)));
-		ArrayList<Instr> colours = new ArrayList<Instr>();
+		Symbol colours = new Symbol();
 		Path2D.Double p = new Path2D.Double(); p.moveTo(-15.0,-15.0); p.lineTo(0.0,-45.0); p.lineTo(15.0,-15.0); p.closePath();
 		colours.add(new Instr(Prim.P1, p));
@@ -66,8 +62,8 @@
 		TopCone.add(new Instr(Prim.PLIN, p));
 	}
-	public static final ArrayList<Instr> TopCross = new ArrayList<Instr>();
+	public static final Symbol TopCross = new Symbol();
 	static {
 		TopCross.add(new Instr(Prim.BBOX, new Rectangle(-30,-80,60,80)));
-		ArrayList<Instr> colours = new ArrayList<Instr>();
+		Symbol colours = new Symbol();
 		Path2D.Double p = new Path2D.Double(); p.moveTo(-5.0,-15.0); p.lineTo(-5.0,-32.5); p.lineTo(-22.5,-32.5);	p.lineTo(-22.5,-42.5); p.lineTo(-5.0,-42.5);
 		p.lineTo(-5.0,-60.0); 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();
@@ -82,8 +78,8 @@
 		TopCross.add(new Instr(Prim.PLIN, p));
 	}
-	public static final ArrayList<Instr> TopEast = new ArrayList<Instr>();
+	public static final Symbol TopEast = new Symbol();
 	static {
 		TopEast.add(new Instr(Prim.BBOX, new Rectangle(-30,-80,60,80)));
-		ArrayList<Instr> colours = new ArrayList<Instr>();
+		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(Prim.P1, p));
@@ -100,8 +96,8 @@
 		TopEast.add(new Instr(Prim.PLIN, p));
 	}
-	public static final ArrayList<Instr> TopIsol = new ArrayList<Instr>();
+	public static final Symbol TopIsol = new Symbol();
 	static {
 		TopIsol.add(new Instr(Prim.BBOX, new Rectangle(-30,-80,60,80)));
-		ArrayList<Instr> colours = new ArrayList<Instr>();
+		Symbol colours = new Symbol();
 		Path2D.Double p = new Path2D.Double(); p.moveTo(-13.0,-55.0); p.curveTo(-13.0, -72.3, 13.0, -72.3, 13.0,-55.0); p.curveTo(13.0, -37.7, -13.0, -37.7, -13.0,-55.0); p.closePath();
 		colours.add(new Instr(Prim.P1, p));
@@ -116,5 +112,5 @@
 		TopIsol.add(new Instr(Prim.ELPS, new Ellipse2D.Double(-13,-68,26,26)));
 	}
-	public static final ArrayList<Instr> TopMooring = new ArrayList<Instr>();
+	public static final Symbol TopMooring = new Symbol();
 	static {
 		TopMooring.add(new Instr(Prim.BBOX, new Rectangle(-30,-80,60,80)));
@@ -124,8 +120,8 @@
 		TopMooring.add(new Instr(Prim.ELPS, new Ellipse2D.Double(-8.5,-25,17,17)));
 	}
-	public static final ArrayList<Instr> TopNorth = new ArrayList<Instr>();
+	public static final Symbol TopNorth = new Symbol();
 	static {
 		TopNorth.add(new Instr(Prim.BBOX, new Rectangle(-30,-80,60,80)));
-		ArrayList<Instr> colours = new ArrayList<Instr>();
+		Symbol colours = new Symbol();
 		Path2D.Double p = new Path2D.Double(); p.moveTo(0.0,-78.0); p.lineTo(-15.0,-45.0); p.lineTo(15.0,-45.0); p.closePath();
 		colours.add(new Instr(Prim.P1, p));
@@ -141,8 +137,8 @@
 		TopNorth.add(new Instr(Prim.PLIN, p));
 	}
-	public static final ArrayList<Instr> TopSouth = new ArrayList<Instr>();
+	public static final Symbol TopSouth = new Symbol();
 	static {
 		TopSouth.add(new Instr(Prim.BBOX, new Rectangle(-30,-80,60,80)));
-		ArrayList<Instr> colours = new ArrayList<Instr>();
+		Symbol colours = new Symbol();
 		Path2D.Double p = new Path2D.Double(); p.moveTo(-15.0,-78.0); p.lineTo(0.0,-45.0);  p.lineTo(15.0,-78.0); p.closePath();
 		colours.add(new Instr(Prim.P1, p));
@@ -158,8 +154,8 @@
 		TopSouth.add(new Instr(Prim.PLIN, p));
 	}
-	public static final ArrayList<Instr> TopSphere = new ArrayList<Instr>();
+	public static final Symbol TopSphere = new Symbol();
 	static {
 		TopSphere.add(new Instr(Prim.BBOX, new Rectangle(-30,-80,60,80)));
-		ArrayList<Instr> colours = new ArrayList<Instr>();
+		Symbol colours = new Symbol();
 		Path2D.Double p = new Path2D.Double(); 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(Prim.P1, p));
@@ -171,8 +167,8 @@
 		TopSphere.add(new Instr(Prim.ELPS, new Ellipse2D.Double(-14,-42,28,28)));
 	}
-	public static final ArrayList<Instr> TopSquare = new ArrayList<Instr>();
+	public static final Symbol TopSquare = new Symbol();
 	static {
 		TopSquare.add(new Instr(Prim.BBOX, new Rectangle(-20,-80,40,80)));
-		ArrayList<Instr> colours = new ArrayList<Instr>();
+		Symbol colours = new Symbol();
 		Path2D.Double p = new Path2D.Double(); p.moveTo(-13.0,-1.0); p.lineTo(-13.0,-27.0); p.lineTo(13.0,-27.0); p.lineTo(13.0,-1.0); p.closePath();
 		colours.add(new Instr(Prim.P1, p));
@@ -183,8 +179,8 @@
 		TopSquare.add(new Instr(Prim.PLIN, p));
 	}
-	public static final ArrayList<Instr> TopTriangle = new ArrayList<Instr>();
+	public static final Symbol TopTriangle = new Symbol();
 	static {
 		TopTriangle.add(new Instr(Prim.BBOX, new Rectangle(-20,-80,40,80)));
-		ArrayList<Instr> colours = new ArrayList<Instr>();
+		Symbol colours = new Symbol();
 		Path2D.Double p = new Path2D.Double(); p.moveTo(-15.0,-1.0); p.lineTo(0.0,-29.0); p.lineTo(15.0,-1.0); p.closePath();
 		colours.add(new Instr(Prim.P1, p));
@@ -195,8 +191,8 @@
 		TopTriangle.add(new Instr(Prim.PLIN, p));
 	}
-	public static final ArrayList<Instr> TopWest = new ArrayList<Instr>();
+	public static final Symbol TopWest = new Symbol();
 	static {
 		TopWest.add(new Instr(Prim.BBOX, new Rectangle(-30,-80,60,80)));
-		ArrayList<Instr> colours = new ArrayList<Instr>();
+		Symbol colours = new Symbol();
 		Path2D.Double p = new Path2D.Double(); p.moveTo(-15.0,-78.0); p.lineTo(0.0,-45.0);  p.lineTo(15.0,-78.0); p.closePath();
 		colours.add(new Instr(Prim.P1, p));
@@ -212,8 +208,8 @@
 		TopWest.add(new Instr(Prim.PLIN, p));
 	}
-	public static final ArrayList<Instr> TopX = new ArrayList<Instr>();
+	public static final Symbol TopX = new Symbol();
 	static {
 		TopX.add(new Instr(Prim.BBOX, new Rectangle(-30,-80,60,80)));
-		ArrayList<Instr> colours = new ArrayList<Instr>();
+		Symbol colours = new Symbol();
 		Path2D.Double p = new Path2D.Double(); p.moveTo(0.0,-27.7); p.lineTo(-12.4,-15.7); p.lineTo(-19.3,-22.6); p.lineTo(-7.3,-35.0); p.lineTo(-19.3,-47.3);
 		p.lineTo(-12.4,-54.2); p.lineTo(0.0,-42.4); p.lineTo(12.4,-54.2); p.lineTo(19.3,-47.3); p.lineTo(7.3,-35.0); p.lineTo(19.3,-22.6); p.lineTo(12.4,-15.7); p.closePath();
@@ -229,4 +225,11 @@
 	}
 	
+	public static final EnumMap<TopSHP, Symbol> Shapes = new EnumMap<TopSHP, Symbol>(TopSHP.class);
+	static {
+		Shapes.put(TopSHP.TOP_BORD, TopBoard); Shapes.put(TopSHP.TOP_CAN, TopCan); Shapes.put(TopSHP.TOP_CONE, TopCone); Shapes.put(TopSHP.TOP_CROS, TopCross);
+		 Shapes.put(TopSHP.TOP_EAST, TopEast); 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_WEST, TopWest);
+		 Shapes.put(TopSHP.TOP_SALT, TopX);
+	}
 	public static final EnumMap<BoySHP, Delta> Buoys = new EnumMap<BoySHP, Delta>(BoySHP.class);
 	static {
@@ -240,5 +243,6 @@
 		Buoys.put(BoySHP.BOY_ICE, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0.0, -25.0))); 
 	}
-	public static final Delta Floats = new Delta(Handle.BC, AffineTransform.getTranslateInstance(0.0, -70.0));
+	public static final Delta Floats = new Delta(Handle.BC, AffineTransform.getTranslateInstance(0.0, -42.0));
+	public static final Delta Beacons = new Delta(Handle.BC, AffineTransform.getTranslateInstance(0.0, -70.0));
 
 }
