Index: /applications/editors/josm/plugins/smed2/src/panels/PanelMain.java
===================================================================
--- /applications/editors/josm/plugins/smed2/src/panels/PanelMain.java	(revision 29073)
+++ /applications/editors/josm/plugins/smed2/src/panels/PanelMain.java	(revision 29074)
@@ -13,6 +13,4 @@
 
 import smed2.Smed2Action;
-
-import S57.S57dat;
 
 public class PanelMain extends JPanel {
Index: /applications/editors/josm/plugins/smed2/src/s57/S57dat.java
===================================================================
--- /applications/editors/josm/plugins/smed2/src/s57/S57dat.java	(revision 29073)
+++ /applications/editors/josm/plugins/smed2/src/s57/S57dat.java	(revision 29074)
@@ -1,3 +1,3 @@
-package S57;
+package s57;
 
 import static org.openstreetmap.josm.tools.I18n.tr;
@@ -20,7 +20,7 @@
 import smed2.Smed2Action;
 
-import S57.S57obj;
-import S57.S57att;
-import S57.S57val;
+import s57.S57obj;
+import s57.S57att;
+import s57.S57val;
 
 public class S57dat extends JPanel {
Index: /applications/editors/josm/plugins/smed2/src/s57/S57val.java
===================================================================
--- /applications/editors/josm/plugins/smed2/src/s57/S57val.java	(revision 29073)
+++ /applications/editors/josm/plugins/smed2/src/s57/S57val.java	(revision 29074)
@@ -20,6 +20,6 @@
 	static class S57key {
 		Conv conv;
-		EnumMap map;
-		S57key(Conv c, EnumMap m) {
+		EnumMap<?, ?> map;
+		S57key(Conv c, EnumMap<?, ?> m) {
 			conv = c; map = m;
 		}
@@ -1096,5 +1096,5 @@
 
 	public static Integer encodeValue(String val, Att att) {        // Convert OSeaM attribute value string to S57 attribute value
-		EnumMap map = keys.get(att).map;
+		EnumMap<?, ?> map = keys.get(att).map;
 		for (Object item : map.keySet()) {
 			if (((S57enum)map.get(item)).val.equals(val))
@@ -1111,8 +1111,8 @@
 			return (String)attval.val;
 		case E:
-			return (String)((EnumMap)attval.val).get(attval.att);
+			return (String)((EnumMap<?, ?>)attval.val).get(attval.att);
 		case L:
 			String str = "";
-			for (Object item : (ArrayList)attval.val) {
+			for (Object item : (ArrayList<?>)attval.val) {
 				if (!str.isEmpty()) str += ";";
 				str += keys.get(attval.att).map.get(item);
@@ -1127,11 +1127,11 @@
 	}
 	
-	public static Enum enumValue(String val, Att att) {           // Convert OSeaM attribute value string to OSeaM enumeration
-		EnumMap map = keys.get(att).map;
-		Enum unkn = null;
+	public static Enum<?> enumValue(String val, Att att) {           // Convert OSeaM attribute value string to OSeaM enumeration
+		EnumMap<?, ?> map = keys.get(att).map;
+		Enum<?> unkn = null;
 		for (Object item : map.keySet()) {
-			if (unkn == null) unkn = (Enum)item;
+			if (unkn == null) unkn = (Enum<?>)item;
 			if (((S57enum)map.get(item)).val.equals(val))
-				return (Enum)item;
+				return (Enum<?>)item;
 		}
 		return unkn;
Index: /applications/editors/josm/plugins/smed2/src/smed2/Smed2Action.java
===================================================================
--- /applications/editors/josm/plugins/smed2/src/smed2/Smed2Action.java	(revision 29073)
+++ /applications/editors/josm/plugins/smed2/src/smed2/Smed2Action.java	(revision 29074)
@@ -1,5 +1,4 @@
 package smed2;
 
-import java.awt.Dialog;
 import java.awt.Dimension;
 import java.awt.event.ActionEvent;
@@ -15,5 +14,5 @@
 import org.openstreetmap.josm.Main;
 
-import S57.S57dat;
+import s57.S57dat;
 
 import panels.PanelMain;
Index: /applications/editors/josm/plugins/smed2/src/symbols/Areas.java
===================================================================
--- /applications/editors/josm/plugins/smed2/src/symbols/Areas.java	(revision 29074)
+++ /applications/editors/josm/plugins/smed2/src/symbols/Areas.java	(revision 29074)
@@ -0,0 +1,14 @@
+/* Copyright 2012 Malcolm Herring
+ *
+ * This is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 3 of the License.
+ *
+ * For a copy of the GNU General Public License, see <http://www.gnu.org/licenses/>.
+ */
+
+package symbols;
+
+public class Areas {
+
+}
Index: /applications/editors/josm/plugins/smed2/src/symbols/Beacons.java
===================================================================
--- /applications/editors/josm/plugins/smed2/src/symbols/Beacons.java	(revision 29074)
+++ /applications/editors/josm/plugins/smed2/src/symbols/Beacons.java	(revision 29074)
@@ -0,0 +1,28 @@
+/* Copyright 2012 Malcolm Herring
+ *
+ * This is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 3 of the License.
+ *
+ * For a copy of the GNU General Public License, see <http://www.gnu.org/licenses/>.
+ */
+
+package symbols;
+
+import java.util.ArrayList;
+
+import symbols.Symbols.Instr;
+
+public class Beacons {
+	public static final ArrayList<Instr> Beacon = new ArrayList<Instr>();
+	public static final ArrayList<Instr> Cairn = new ArrayList<Instr>();
+	public static final ArrayList<Instr> LightMajor = new ArrayList<Instr>();
+	public static final ArrayList<Instr> LightMinor = new ArrayList<Instr>();
+	public static final ArrayList<Instr> PerchPort = new ArrayList<Instr>();
+	public static final ArrayList<Instr> PerchStarboard = new ArrayList<Instr>();
+	public static final ArrayList<Instr> Stake = new ArrayList<Instr>();
+	public static final ArrayList<Instr> Tower = new ArrayList<Instr>();
+	public static final ArrayList<Instr> WithyPort = new ArrayList<Instr>();
+	public static final ArrayList<Instr> WithyStarboard = new ArrayList<Instr>();
+
+}
Index: /applications/editors/josm/plugins/smed2/src/symbols/Buoys.java
===================================================================
--- /applications/editors/josm/plugins/smed2/src/symbols/Buoys.java	(revision 29074)
+++ /applications/editors/josm/plugins/smed2/src/symbols/Buoys.java	(revision 29074)
@@ -0,0 +1,230 @@
+/* Copyright 2012 Malcolm Herring
+ *
+ * This is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 3 of the License.
+ *
+ * For a copy of the GNU General Public License, see <http://www.gnu.org/licenses/>.
+ */
+
+package symbols;
+
+import java.awt.BasicStroke;
+import java.awt.Color;
+import java.awt.geom.*;
+import java.util.ArrayList;
+
+import symbols.Symbols.*;
+
+public class Buoys {
+
+	public static final ArrayList<Instr> Barrel = new ArrayList<Instr>();
+	static {
+		ArrayList<Instr> colours = new ArrayList<Instr>();
+		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);
+		p.lineTo(8.0, 0.0); p.curveTo(8.0,-11.0,-8.0,-11.0,-8.0,0.0); p.closePath();
+		colours.add(new Instr(Prim.P1, p));
+		Barrel.add(new Instr(Prim.COLR, colours));
+    Barrel.add(new Instr(Prim.STRK, new BasicStroke(4.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND)));
+		Barrel.add(new Instr(Prim.FILL, Color.black));
+		Barrel.add(new Instr(Prim.ELPS, new Ellipse2D.Double(-10,-10,20,20)));
+		Barrel.add(new Instr(Prim.LINE, new Line2D.Double(-57,0,-10,0)));
+		Barrel.add(new Instr(Prim.LINE, new Line2D.Double(10,0,50,0)));
+		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); p.moveTo(-32.0,-36.0); p.curveTo(-23.0,-25.0,-21.0,-12.0,-21.0,0.0);
+    Barrel.add(new Instr(Prim.PLIN, p));
+	}
+
+	public static final ArrayList<Instr> Can = new ArrayList<Instr>();
+	static {
+		ArrayList<Instr> colours = new ArrayList<Instr>();
+		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();
+		colours.add(new Instr(Prim.P1, p));
+		p = new Path2D.Double(); p.moveTo(-31.6,0); p.lineTo(-22.0,-28.4); p.lineTo(34.8,-9.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();
+    colours.add(new Instr(Prim.H2, p));
+		p = new Path2D.Double(); p.moveTo(-24.2,-22.1); p.lineTo(-19.9,-34.8); p.lineTo(36.9,-15.8); p.lineTo(32.6,-3.1);	p.closePath();
+    colours.add(new Instr(Prim.H3, p));
+		p = new Path2D.Double(); p.moveTo(-22.0,-28.4); p.lineTo(-18.9,-37.9); p.lineTo(37.9,-18.9); p.lineTo(34.8,-9.4);	p.closePath();
+    colours.add(new Instr(Prim.H4, p));
+		p = new Path2D.Double(); p.moveTo(-25.2,-19.0); p.lineTo(-22.0,-28.4); p.lineTo(34.8,-9.4); p.lineTo(31.6,0.0);	p.closePath();
+    colours.add(new Instr(Prim.H5, p));
+		p = new Path2D.Double(); p.moveTo(12.7,-37.9); p.lineTo(41.1,-28.4); p.lineTo(31.6,0);	p.lineTo(8.0,0.0); p.quadTo(8.0,-6.0,2.5,-7.6); p.closePath();
+    colours.add(new Instr(Prim.V2, p));
+		Can.add(new Instr(Prim.COLR, colours));
+    Can.add(new Instr(Prim.STRK, new BasicStroke(4.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND)));
+		Can.add(new Instr(Prim.FILL, Color.black));
+		Can.add(new Instr(Prim.ELPS, new Ellipse2D.Double(-10,-10,20,20)));
+		Can.add(new Instr(Prim.LINE, new Line2D.Double(-40,0,-10,0)));
+		Can.add(new Instr(Prim.LINE, new Line2D.Double(10,0,40,0)));
+		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);
+    Can.add(new Instr(Prim.PLIN, p));
+	}
+	
+	public static final ArrayList<Instr> Cone = new ArrayList<Instr>();
+	static {
+		ArrayList<Instr> colours = new ArrayList<Instr>();
+		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();
+		colours.add(new Instr(Prim.P1, p));
+		p = new Path2D.Double(); p.moveTo(-31.6,0); p.quadTo(-29.0,-15.5,-17.3,-26.9); p.lineTo(31.5,-10.5); p.quadTo(33.0,-5.0,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();
+    colours.add(new Instr(Prim.H2, p));
+		p = new Path2D.Double(); p.moveTo(-22.3,-21.4); p.quadTo(-15.2,-29.8,-10.8,-31.8); p.lineTo(28.8,-18.5); p.quadTo(31.8,-12.5,32.6,-3.1); p.closePath();
+    colours.add(new Instr(Prim.H3, p));
+		p = new Path2D.Double(); p.moveTo(-17.3,-27.0); p.quadTo(-13.0,-31.4,-6.9,-33.8); p.lineTo(26.4,-22.7); p.quadTo(30.0,-17.0,31.7,-10.3); p.closePath();
+    colours.add(new Instr(Prim.H4, p));
+		p = new Path2D.Double(); p.moveTo(-24.4,-18.7); p.quadTo(-20.3,-25.0,-17.3,-27.0); p.lineTo(31.7,-10.3); p.quadTo(32.7,-4.5,32.1,0.0); p.closePath();
+    colours.add(new Instr(Prim.H5, p));
+		p = new Path2D.Double(); p.moveTo(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.quadTo(8.0,-6.0,2.5,-7.6); p.closePath();
+    colours.add(new Instr(Prim.V2, p));
+		Cone.add(new Instr(Prim.COLR, colours));
+    Cone.add(new Instr(Prim.STRK, new BasicStroke(4.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND)));
+		Cone.add(new Instr(Prim.FILL, Color.black));
+		Cone.add(new Instr(Prim.ELPS, new Ellipse2D.Double(-10,-10,20,20)));
+		Cone.add(new Instr(Prim.LINE, new Line2D.Double(-40,0,-10,0)));
+		Cone.add(new Instr(Prim.LINE, new Line2D.Double(10,0,40,0)));
+		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);
+    Cone.add(new Instr(Prim.PLIN, p));
+	}
+	
+	public static final ArrayList<Instr> Float = new ArrayList<Instr>();
+	static {
+		ArrayList<Instr> colours = new ArrayList<Instr>();
+		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);
+		p.lineTo(8.0, 0.0); p.curveTo(8.0,-11.0,-8.0,-11.0,-8.0,0.0); p.closePath();
+		colours.add(new Instr(Prim.P1, p));
+		p = new Path2D.Double(); p.moveTo(-36.0,0); p.lineTo(-43.0,-21.0); p.lineTo(43.0,-21.0); p.lineTo(36.0,0);
+		p.lineTo(8.0,0.0); p.curveTo(8.0,-11.0,-8.0,-11.0,-8.0,0.0); p.closePath();
+    colours.add(new Instr(Prim.H2, p));
+		p = new Path2D.Double(); p.moveTo(-40.8,-14.0); p.lineTo(-45.4,-28.0); p.lineTo(-35.5,-28.0); p.quadTo(-28.0,-25.0,-19.0,-23.0); p.lineTo(-17.2,-28.0);
+		p.lineTo(17.2,-28.0); p.lineTo(19.0,-23.0); p.quadTo(28.0,-25.0,35.5,-28.0); p.lineTo(45.4,-28.0); p.lineTo(40.8,-14.0); p.closePath();
+    colours.add(new Instr(Prim.H3, p));
+		p = new Path2D.Double(); p.moveTo(-43.0,-21.0); p.lineTo(-47.0,-33.0); p.quadTo(-29.7,-24.8,-19.0,-23.0); p.lineTo(-15.8,-31.5); p.lineTo(15.8,-31.5);
+		p.lineTo(19.0,-23.0); p.quadTo(28.4,-24.3,47.0,-33.0); p.lineTo(43.0,-21.0);	p.closePath();
+    colours.add(new Instr(Prim.H4, p));
+		p = new Path2D.Double(); p.moveTo(-39.8,-11.5); p.lineTo(-43.0,-21.0); p.lineTo(43.0,-21.0); p.lineTo(39.8,-11.5);	p.closePath();
+    colours.add(new Instr(Prim.H5, p));
+		p = new Path2D.Double(); p.moveTo(0.0,-42.0); p.lineTo(12.0,-42.0); p.lineTo(19.0,-23.0); p.quadTo(28.4,-24.3,47.0,-33.0); p.lineTo(36.0,0.0);
+		p.lineTo(8.0,0.0); p.quadTo(7.7,-7.7,0.0,-8.0); p.closePath();
+    colours.add(new Instr(Prim.V2, p));
+		Float.add(new Instr(Prim.COLR, colours));
+    Float.add(new Instr(Prim.STRK, new BasicStroke(4.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND)));
+		Float.add(new Instr(Prim.FILL, Color.black));
+		Float.add(new Instr(Prim.ELPS, new Ellipse2D.Double(-10,-10,20,20)));
+		Float.add(new Instr(Prim.LINE, new Line2D.Double(-54,0,-10,0)));
+		Float.add(new Instr(Prim.LINE, new Line2D.Double(10,0,54,0)));
+		p = new Path2D.Double(); p.moveTo(-36.0,0); p.lineTo(-47.0,-33.0); p.curveTo(-15.0, -17.0, 15.0, -17.0, 47.0,-33.0); p.lineTo(36.0,0);
+		p.moveTo(-19.0, -23.0); p.lineTo(-12.0,-42.0); p.lineTo(12.0,-42.0); p.lineTo(19.0,-23.0);
+    Float.add(new Instr(Prim.PLIN, p));
+	}
+
+	public static final ArrayList<Instr> Pillar = new ArrayList<Instr>();
+	static {
+		ArrayList<Instr> colours = new ArrayList<Instr>();
+		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();
+		colours.add(new Instr(Prim.P1, p));
+		p = new Path2D.Double(); p.moveTo(-32.0,0); p.lineTo(-2.8,-32.5); p.lineTo(5.3,-51.0); p.lineTo(26.3,-43.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();
+    colours.add(new Instr(Prim.H2, p));
+		p = new Path2D.Double(); p.moveTo(-0.9,-37.1); p.lineTo(11.3,-64.6); p.lineTo(29.6,-58.7); p.lineTo(23.1,-29.3);	p.closePath();
+    colours.add(new Instr(Prim.H3, p));
+		p = new Path2D.Double(); p.moveTo(5.3,-51.0); p.lineTo(14.5,-71.5); p.lineTo(31.2,-65.9); p.lineTo(26.3,-43.9);	p.closePath();
+    colours.add(new Instr(Prim.H4, p));
+		p = new Path2D.Double(); p.moveTo(-5.2,-29.7); p.lineTo(-2.8,-32.5); p.lineTo(5.3,-51.0); p.lineTo(26.3,-43.9); p.lineTo(21.8,-24.3); p.lineTo(22.2,-21.5);	p.closePath();
+    colours.add(new Instr(Prim.H5, p));
+		p = new Path2D.Double(); p.moveTo(12.7,-37.9); p.lineTo(31.3,-94.8); 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.quadTo(8.0,-6.0,2.5,-7.6); p.closePath();
+    colours.add(new Instr(Prim.V2, p));
+		Pillar.add(new Instr(Prim.COLR, colours));
+		Pillar.add(new Instr(Prim.STRK, new BasicStroke(4.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND)));
+		Pillar.add(new Instr(Prim.FILL, Color.black));
+		Pillar.add(new Instr(Prim.ELPS, new Ellipse2D.Double(-10,-10,20,20)));
+		Pillar.add(new Instr(Prim.LINE, new Line2D.Double(-42,0,-10,0)));
+		Pillar.add(new Instr(Prim.LINE, new Line2D.Double(10,0,36,0)));
+		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);
+		Pillar.add(new Instr(Prim.PLIN, p));
+	}
+	
+	public static final ArrayList<Instr> Spar = new ArrayList<Instr>();
+	static {
+		ArrayList<Instr> colours = new ArrayList<Instr>();
+		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));
+		p = new Path2D.Double(); p.moveTo(-3.2,-9.5); p.lineTo(11.2,-53.1); p.lineTo(22.6,-49.3); p.lineTo(8.2,-5.7); p.closePath();
+    colours.add(new Instr(Prim.H2, p));
+		p = new Path2D.Double(); p.moveTo(6.4,-38.6); p.lineTo(16.0,-67.6); p.lineTo(27.4,-63.8); p.lineTo(17.8,-34.8);	p.closePath();
+    colours.add(new Instr(Prim.H3, p));
+		p = new Path2D.Double(); p.moveTo(11.2,-53.1); p.lineTo(18.4,-74.9); p.lineTo(29.8,-71.1); p.lineTo(22.6,-49.3);	p.closePath();
+    colours.add(new Instr(Prim.H4, p));
+		p = new Path2D.Double(); p.moveTo(4.0,-31.3); p.lineTo(11.2,-53.1); p.lineTo(22.6,-49.3); p.lineTo(15.4,-27.5); p.closePath();
+    colours.add(new Instr(Prim.H5, p));
+		p = new Path2D.Double(); p.moveTo(2.5,-7.6); p.lineTo(31.3,-94.8); p.lineTo(37.0,-92.9); p.lineTo(8.2,-5.7); p.closePath();
+    colours.add(new Instr(Prim.V2, p));
+		Spar.add(new Instr(Prim.COLR, colours));
+		Spar.add(new Instr(Prim.STRK, new BasicStroke(4.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND)));
+		Spar.add(new Instr(Prim.FILL, Color.black));
+		Spar.add(new Instr(Prim.ELPS, new Ellipse2D.Double(-10,-10,20,20)));
+		Spar.add(new Instr(Prim.LINE, new Line2D.Double(-20,0,-10,0)));
+		Spar.add(new Instr(Prim.LINE, new Line2D.Double(10,0,20,0)));
+		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);
+		Spar.add(new Instr(Prim.PLIN, p));
+	}
+	
+	public static final ArrayList<Instr> Sphere = new ArrayList<Instr>();
+	static {
+		ArrayList<Instr> colours = new ArrayList<Instr>();
+		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();
+		colours.add(new Instr(Prim.P1, p));
+		p = new Path2D.Double(); p.moveTo(-25.0,0); p.quadTo(-30.0,-15.0,-20.5,-28.0); p.lineTo(33.8,-10.0); p.quadTo(33.7,-4.0,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();
+    colours.add(new Instr(Prim.H2, p));
+		p = new Path2D.Double(); p.moveTo(-24.2,-22.1); p.quadTo(-21.0,-28.5,-15.2,-33.3); p.lineTo(32.8,-17.2); p.quadTo(34.6,-10.0,33.0,-2.9); p.closePath();
+    colours.add(new Instr(Prim.H3, p));
+		p = new Path2D.Double(); p.moveTo(-20.5,-28.0); p.quadTo(-16.5,-33.0,-12.0,-35.5); p.lineTo(31.5,-21.0); p.quadTo(33.5,-17.0,34.0,-9.5); p.closePath();
+    colours.add(new Instr(Prim.H4, p));
+		p = new Path2D.Double(); p.moveTo(-25.2,-19.0); p.quadTo(-23.5,-24.0,-20.5,-28.0); p.lineTo(34.0,-9.5); p.quadTo(34.0,-3.0,32.0,0.0);	p.closePath();
+    colours.add(new Instr(Prim.H5, p));
+		p = new Path2D.Double(); p.moveTo(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.quadTo(8.0,-6.0,2.5,-7.6); p.closePath();
+    colours.add(new Instr(Prim.V2, p));
+    Sphere.add(new Instr(Prim.COLR, colours));
+    Sphere.add(new Instr(Prim.STRK, new BasicStroke(4.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND)));
+    Sphere.add(new Instr(Prim.FILL, Color.black));
+    Sphere.add(new Instr(Prim.ELPS, new Ellipse2D.Double(-10,-10,20,20)));
+    Sphere.add(new Instr(Prim.LINE, new Line2D.Double(-33,0,-10,0)));
+    Sphere.add(new Instr(Prim.LINE, new Line2D.Double(10,0,40,0)));
+    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> Super = new ArrayList<Instr>();
+	static {
+		ArrayList<Instr> colours = new ArrayList<Instr>();
+		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();
+		colours.add(new Instr(Prim.P1, p));
+		p = new Path2D.Double(); p.moveTo(-48.0,0); p.lineTo(-38.0,-21.0); p.lineTo(38.0,-21.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();
+    colours.add(new Instr(Prim.H2, p));
+		p = new Path2D.Double(); p.moveTo(-41.3,-14.0); p.lineTo(-34.7,-28.0); p.lineTo(34.7,-28.0); p.lineTo(41.3,-14.0);	p.closePath();
+    colours.add(new Instr(Prim.H3, p));
+		p = new Path2D.Double(); p.moveTo(-38.0,-21.0); p.lineTo(-33.0,-31.5); p.lineTo(33.0,-31.5); p.lineTo(38.0,-21.0);	p.closePath();
+    colours.add(new Instr(Prim.H4, p));
+		p = new Path2D.Double(); p.moveTo(-43.0,-11.5); p.lineTo(-38.0,-21.0); p.lineTo(38.0,-21.0); p.lineTo(43.0,-11.5);	p.closePath();
+    colours.add(new Instr(Prim.H5, p));
+		p = new Path2D.Double(); p.moveTo(0.0,-42.0); p.lineTo(28.0,-42.0); p.lineTo(48.0,0.0); p.lineTo(8.0,0.0); p.quadTo(7.7,-7.7,0.0,-8.0); p.closePath();
+    colours.add(new Instr(Prim.V2, p));
+		Super.add(new Instr(Prim.COLR, colours));
+    Super.add(new Instr(Prim.STRK, new BasicStroke(4.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND)));
+		Super.add(new Instr(Prim.FILL, Color.black));
+		Super.add(new Instr(Prim.ELPS, new Ellipse2D.Double(-10,-10,20,20)));
+		Super.add(new Instr(Prim.LINE, new Line2D.Double(-54,0,-10,0)));
+		Super.add(new Instr(Prim.LINE, new Line2D.Double(10,0,54,0)));
+		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);
+    Super.add(new Instr(Prim.PLIN, p));
+	}
+}
Index: /applications/editors/josm/plugins/smed2/src/symbols/Facilities.java
===================================================================
--- /applications/editors/josm/plugins/smed2/src/symbols/Facilities.java	(revision 29074)
+++ /applications/editors/josm/plugins/smed2/src/symbols/Facilities.java	(revision 29074)
@@ -0,0 +1,14 @@
+/* Copyright 2012 Malcolm Herring
+ *
+ * This is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 3 of the License.
+ *
+ * For a copy of the GNU General Public License, see <http://www.gnu.org/licenses/>.
+ */
+
+package symbols;
+
+public class Facilities {
+
+}
Index: /applications/editors/josm/plugins/smed2/src/symbols/Harbours.java
===================================================================
--- /applications/editors/josm/plugins/smed2/src/symbols/Harbours.java	(revision 29074)
+++ /applications/editors/josm/plugins/smed2/src/symbols/Harbours.java	(revision 29074)
@@ -0,0 +1,14 @@
+/* Copyright 2012 Malcolm Herring
+ *
+ * This is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 3 of the License.
+ *
+ * For a copy of the GNU General Public License, see <http://www.gnu.org/licenses/>.
+ */
+
+package symbols;
+
+public class Harbours {
+
+}
Index: /applications/editors/josm/plugins/smed2/src/symbols/Landmarks.java
===================================================================
--- /applications/editors/josm/plugins/smed2/src/symbols/Landmarks.java	(revision 29074)
+++ /applications/editors/josm/plugins/smed2/src/symbols/Landmarks.java	(revision 29074)
@@ -0,0 +1,14 @@
+/* Copyright 2012 Malcolm Herring
+ *
+ * This is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 3 of the License.
+ *
+ * For a copy of the GNU General Public License, see <http://www.gnu.org/licenses/>.
+ */
+
+package symbols;
+
+public class Landmarks {
+
+}
Index: /applications/editors/josm/plugins/smed2/src/symbols/Notices.java
===================================================================
--- /applications/editors/josm/plugins/smed2/src/symbols/Notices.java	(revision 29074)
+++ /applications/editors/josm/plugins/smed2/src/symbols/Notices.java	(revision 29074)
@@ -0,0 +1,14 @@
+/* Copyright 2012 Malcolm Herring
+ *
+ * This is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 3 of the License.
+ *
+ * For a copy of the GNU General Public License, see <http://www.gnu.org/licenses/>.
+ */
+
+package symbols;
+
+public class Notices {
+
+}
Index: /applications/editors/josm/plugins/smed2/src/symbols/Symbols.java
===================================================================
--- /applications/editors/josm/plugins/smed2/src/symbols/Symbols.java	(revision 29074)
+++ /applications/editors/josm/plugins/smed2/src/symbols/Symbols.java	(revision 29074)
@@ -0,0 +1,217 @@
+/* Copyright 2012 Malcolm Herring
+ *
+ * This is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 3 of the License.
+ *
+ * For a copy of the GNU General Public License, see <http://www.gnu.org/licenses/>.
+ */
+
+package symbols;
+
+import java.awt.BasicStroke;
+import java.awt.Color;
+import java.awt.Graphics2D;
+import java.awt.Rectangle;
+import java.awt.geom.*;
+import java.util.ArrayList;
+import java.util.EnumMap;
+
+import s57.S57val.*;
+
+public class Symbols {
+
+	public enum Prim {
+		BBOX, STRK, COLR, FILL, LINE, RECT, RRCT, ELPS, EARC, PLIN, PGON, SYMB,
+		P1, H2, H3, H4, H5, V2, D2, D3, D4, B2, S2, S3, S4, C2, X2
+	}
+
+	public enum Handle {
+		CC, TL, TR, TC, LC, RC, BL, BR, BC
+	}
+
+	public static final double symbolScale[] = { 256.0, 128.0, 64.0, 32.0, 16.0, 8.0, 4.0, 2.0, 1.0,
+		0.61, 0.372, 0.227, 0.138, 0.0843, 0.0514, 0.0313, 0.0191, 0.0117, 0.007, 0.138 };
+
+	public static final double textScale[] = { 256.0, 128.0, 64.0, 32.0, 16.0, 8.0, 4.0, 2.0, 1.0,
+		0.5556, 0.3086, 0.1714, 0.0953, 0.0529, 0.0294, 0.0163, 0.0091, 0.0050, 0.0028, 0.0163 };
+
+	private static final EnumMap<ColCOL, Color> bodyColours = new EnumMap<ColCOL, Color>(ColCOL.class);
+	static {
+		bodyColours.put(ColCOL.COL_UNK, new Color(0, true));
+		bodyColours.put(ColCOL.COL_WHT, new Color(0xffffff));
+		bodyColours.put(ColCOL.COL_BLK, new Color(0x000000));
+		bodyColours.put(ColCOL.COL_RED, new Color(0xd40000));
+		bodyColours.put(ColCOL.COL_GRN, new Color(0x00d400));
+		bodyColours.put(ColCOL.COL_BLU, Color.blue);
+		bodyColours.put(ColCOL.COL_YEL, new Color(0xffd400));
+		bodyColours.put(ColCOL.COL_GRY, Color.gray);
+		bodyColours.put(ColCOL.COL_BRN, new Color(0x8b4513));
+		bodyColours.put(ColCOL.COL_AMB, new Color(0xfbf00f));
+		bodyColours.put(ColCOL.COL_VIO, new Color(0xee82ee));
+		bodyColours.put(ColCOL.COL_ORG, Color.orange);
+		bodyColours.put(ColCOL.COL_MAG, new Color(0xf000f0));
+		bodyColours.put(ColCOL.COL_PNK, Color.pink);
+	}
+
+	public static class Instr {
+		Prim type;
+		Object params;
+
+		Instr(Prim itype, Object iparams) {
+			type = itype;
+			params = iparams;
+		}
+	}
+
+	public static class Delta {
+		Handle h;
+		AffineTransform t;
+
+		public Delta(Handle ih, AffineTransform it) {
+			h = ih;
+			t = it;
+		}
+	}
+
+	public static class Scheme {
+		ArrayList<ColPAT> pat;
+		ArrayList<ColCOL> col;
+
+		public Scheme(ArrayList<ColPAT> ipat, ArrayList<ColCOL> icol) {
+			pat = ipat;
+			col = icol;
+		}
+	}
+
+	public static void drawSymbol(Graphics2D g2, ArrayList<Instr> symbol, int zoom, double x, double y, Delta dd, Scheme cs) {
+		int pn = cs.pat.size();
+		int cn = cs.col.size() - pn + 1;
+		AffineTransform savetr = g2.getTransform();
+		g2.translate(x, y);
+		g2.scale(symbolScale[zoom], symbolScale[zoom]);
+		for (Instr item : symbol) {
+			switch (item.type) {
+			case BBOX:
+				Rectangle bbox = (Rectangle)item.params;
+				double dx = 0.0;
+				double dy = 0.0;
+				if (dd != null) {
+					switch (dd.h) {
+					case CC:
+						dx = bbox.x + (bbox.width/2.0);
+						dy = bbox.y - (bbox.height/2.0);
+						break;
+					case TL:
+						dx = bbox.x;
+						dy = bbox.y;
+						break;
+					case TR:
+						dx = bbox.x + bbox.width;
+						dy = bbox.y;
+						break;
+					case TC:
+						dx = bbox.x + (bbox.width/2.0);
+						dy = bbox.y;
+						break;
+					case LC:
+						dx = bbox.x;
+						dy = bbox.y - (bbox.height/2.0);
+						break;
+					case RC:
+						dx = bbox.x + bbox.width;
+						dy = bbox.y - (bbox.height/2.0);
+						break;
+					case BL:
+						dx = bbox.x;
+						dy = bbox.y - bbox.height;
+						break;
+					case BR:
+						dx = bbox.x + bbox.width;
+						dy = bbox.y - bbox.height;
+						break;
+					case BC:
+						dx = bbox.x + (bbox.width/2.0);
+						dy = bbox.y - bbox.height;
+						break;
+					}
+					g2.translate(dx, dy);
+					g2.transform(dd.t);
+				}
+				break;
+			case COLR:
+				if ((cs != null) && (cs.col != null)) {
+					for (Instr patch : (ArrayList<Instr>) item.params) {
+						switch (patch.type) {
+						case P1:
+							if (cn > 0) {
+								g2.setPaint(bodyColours.get(cs.col.get(0)));
+								g2.fill((Path2D.Double) patch.params);
+							}
+							break;
+						case H2:
+							if ((cn > 1) && (cs.pat.get(0) == ColPAT.PAT_HORI)) {
+								g2.setPaint(bodyColours.get(cs.col.get(cs.col.size() - pn)));
+								g2.fill((Path2D.Double) patch.params);
+							}
+							break;
+						case H3:
+							if ((cn == 3) && (cs.pat.get(0) == ColPAT.PAT_HORI)) {
+								g2.setPaint(bodyColours.get(cs.col.get(1)));
+								g2.fill((Path2D.Double) patch.params);
+							}
+							break;
+						case H4:
+							if ((cn == 4) && (cs.pat.get(0) == ColPAT.PAT_HORI)) {
+								g2.setPaint(bodyColours.get(cs.col.get(1)));
+								g2.fill((Path2D.Double) patch.params);
+							}
+							break;
+						case H5:
+							if ((cn == 4) && (cs.pat.get(0) == ColPAT.PAT_HORI)) {
+								g2.setPaint(bodyColours.get(cs.col.get(2)));
+								g2.fill((Path2D.Double) patch.params);
+							}
+							break;
+						case V2:
+							if ((cn > 1) && (cs.pat.get(0) == ColPAT.PAT_VERT)) {
+								g2.setPaint(bodyColours.get(cs.col.get(cs.col.size() - pn)));
+								g2.fill((Path2D.Double) patch.params);
+							}
+							break;
+						}
+					}
+				}
+				break;
+			case STRK:
+				g2.setStroke((BasicStroke) item.params);
+				break;
+			case FILL:
+				g2.setPaint((Color) item.params);
+				break;
+			case LINE:
+				g2.draw((Line2D.Double) item.params);
+				break;
+			case RECT:
+				g2.draw((Rectangle2D.Double) item.params);
+				break;
+			case RRCT:
+				g2.draw((RoundRectangle2D.Double) item.params);
+				break;
+			case ELPS:
+				g2.draw((Ellipse2D.Double) item.params);
+				break;
+			case EARC:
+				g2.draw((Arc2D.Double) item.params);
+				break;
+			case PLIN:
+				g2.draw((Path2D.Double) item.params);
+				break;
+			case PGON:
+				g2.fill((Path2D.Double) item.params);
+				break;
+			}
+		}
+		g2.setTransform(savetr);
+	}
+}
Index: /applications/editors/josm/plugins/smed2/src/symbols/Topmarks.java
===================================================================
--- /applications/editors/josm/plugins/smed2/src/symbols/Topmarks.java	(revision 29074)
+++ /applications/editors/josm/plugins/smed2/src/symbols/Topmarks.java	(revision 29074)
@@ -0,0 +1,36 @@
+/* Copyright 2012 Malcolm Herring
+ *
+ * This is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 3 of the License.
+ *
+ * For a copy of the GNU General Public License, see <http://www.gnu.org/licenses/>.
+ */
+
+package symbols;
+
+import java.awt.BasicStroke;
+import java.awt.Color;
+import java.awt.Rectangle;
+import java.awt.geom.Path2D;
+import java.util.ArrayList;
+
+import symbols.Symbols.Instr;
+import symbols.Symbols.Prim;
+
+public class Topmarks {
+
+	public static final ArrayList<Instr> TopCone = new ArrayList<Instr>();
+	static {
+		TopCone.add(new Instr(Prim.BBOX, new Rectangle(-20,80,40,80)));
+		ArrayList<Instr> colours = new ArrayList<Instr>();
+		Path2D.Double p = new Path2D.Double(); p.moveTo(0.0,0.0); p.lineTo(0.0,-15.0); 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));
+		TopCone.add(new Instr(Prim.COLR, colours));
+		TopCone.add(new Instr(Prim.STRK, new BasicStroke(4.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)));
+		TopCone.add(new Instr(Prim.FILL, Color.black));
+		p = new Path2D.Double(); p.moveTo(0.0,0.0); p.lineTo(0.0,-15.0); p.moveTo(-15.0,-15.0); p.lineTo(0.0,-45.0); p.lineTo(15.0,-15.0); p.closePath();
+		TopCone.add(new Instr(Prim.PLIN, p));
+	}
+
+}
