Index: /applications/editors/josm/plugins/smed2/src/s57/S57att.java
===================================================================
--- /applications/editors/josm/plugins/smed2/src/s57/S57att.java	(revision 30118)
+++ /applications/editors/josm/plugins/smed2/src/s57/S57att.java	(revision 30119)
@@ -118,5 +118,5 @@
 		AttStr.put(Att.ELEVAT, "elevation"); AttStr.put(Att.ESTRNG, "estimated_range"); AttStr.put(Att.EXCLIT, "exhibition"); AttStr.put(Att.EXPSOU, "exposition");
 		AttStr.put(Att.FUNCTN, "function"); AttStr.put(Att.HEIGHT, "height"); AttStr.put(Att.HUNITS, "units"); AttStr.put(Att.HORACC, "accuracy");
-		AttStr.put(Att.HORCLR, "clearance"); AttStr.put(Att.HORLEN, "length"); AttStr.put(Att.HORWID, "width"); AttStr.put(Att.ICEFAC, "factor");
+		AttStr.put(Att.HORCLR, "clearance_width"); AttStr.put(Att.HORLEN, "length"); AttStr.put(Att.HORWID, "width"); AttStr.put(Att.ICEFAC, "factor");
 		AttStr.put(Att.INFORM, "information"); AttStr.put(Att.JRSDTN, "jurisdiction"); AttStr.put(Att.LIFCAP, "maximum_load"); AttStr.put(Att.LITCHR, "character");
 		AttStr.put(Att.LITVIS, "visibility"); AttStr.put(Att.MARSYS, "system");	AttStr.put(Att.MLTYLT, "multiple"); AttStr.put(Att.NATION, "nationality");
@@ -144,5 +144,5 @@
 		AttStr.put(Att.BUNVES, "availability");	AttStr.put(Att.CATBRT, "category"); AttStr.put(Att.CATBUN, "category"); AttStr.put(Att.CATCCL, "category");
 		AttStr.put(Att.CATHBR, "category");	AttStr.put(Att.CATRFD, "category"); AttStr.put(Att.CATTML, "category"); AttStr.put(Att.COMCTN, "communication");
-		AttStr.put(Att.HORCLL, "clearance_length");	AttStr.put(Att.HORCLW, "clearance_width"); AttStr.put(Att.TRSHGD, "goods"); AttStr.put(Att.UNLOCD, "locode");
+		AttStr.put(Att.HORCLL, "horizontal_clearance_length");	AttStr.put(Att.HORCLW, "horizontal_clearance_width"); AttStr.put(Att.TRSHGD, "goods"); AttStr.put(Att.UNLOCD, "locode");
 		AttStr.put(Att.CATGAG, "category");	AttStr.put(Att.HIGWAT, "high_value"); AttStr.put(Att.HIGNAM, "high_name"); AttStr.put(Att.LOWWAT, "low_value");
 		AttStr.put(Att.LOWNAM, "low_name");	AttStr.put(Att.MEAWAT, "mean_value"); AttStr.put(Att.MEANAM, "mean_name"); AttStr.put(Att.OTHWAT, "local_value");
Index: /applications/editors/josm/plugins/smed2/src/seamap/Renderer.java
===================================================================
--- /applications/editors/josm/plugins/smed2/src/seamap/Renderer.java	(revision 30118)
+++ /applications/editors/josm/plugins/smed2/src/seamap/Renderer.java	(revision 30119)
@@ -28,5 +28,5 @@
 
 	public static final Color Yland = new Color(0x50b0ff);
-	public static final Color Mline = new Color(0x80c480);
+	public static final Color Mline = new Color(0xc480ff);
 	public static final Color Msymb = new Color(0xa30075);
 	
@@ -446,4 +446,23 @@
 			label.add(new Instr(Prim.PLIN, p));
 			break;
+		case HCLR:
+			width += height * 1.5;
+			height *= 1.5;
+	    if (width < height) width = height;
+	    lx = -width / 2;
+	    ly = -height / 2;
+	    tx = lx + (height * 0.5);
+	    ty = ly + (height * 0.17);
+			label.add(new Instr(Prim.BBOX, new Rectangle2D.Double(lx,ly,width,height)));
+			label.add(new Instr(Prim.FILL, bg));
+			label.add(new Instr(Prim.RSHP, new RoundRectangle2D.Double(lx,ly,width,height,height,height)));
+			label.add(new Instr(Prim.FILL, fg));
+			sw = 1 + (int)(height/10);
+			double vo = height / 4;
+			label.add(new Instr(Prim.STRK, new BasicStroke(sw, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)));
+			p = new Path2D.Double(); p.moveTo(-width*0.4-sw,-ly-vo); p.lineTo(-width*0.4-sw,ly+vo); p.moveTo(-width*0.4-sw,0); p.lineTo(-width*0.4+sw,0);
+			p.moveTo(width*0.4+sw,-ly-vo); p.lineTo(width*0.4+sw,ly+vo); p.moveTo(width*0.4-sw,0); p.lineTo(width*0.4+sw,0);
+			label.add(new Instr(Prim.PLIN, p));
+			break;
 		default:
 			lx = -width / 2;
Index: /applications/editors/josm/plugins/smed2/src/seamap/Rules.java
===================================================================
--- /applications/editors/josm/plugins/smed2/src/seamap/Rules.java	(revision 30118)
+++ /applications/editors/josm/plugins/smed2/src/seamap/Rules.java	(revision 30119)
@@ -33,8 +33,10 @@
 		AttItem name = feature.atts.get(Att.OBJNAM);
 		if (name == null) {
-			name = feature.objs.get(feature.type).get(0).get(Att.OBJNAM);
-		}
-		if (name != null) return (String)name.val;
-		return null;
+			AttMap atts = feature.objs.get(feature.type).get(0);
+			if (atts != null) {
+				name = atts.get(Att.OBJNAM);
+			}
+		}
+		return (name != null) ? (String)name.val: null;
 	}
 
@@ -203,8 +205,12 @@
 			break;
 		case MARCUL:
-			if (zoom >= 14)
-				Renderer.symbol(feature, Areas.MarineFarm);
-			if (zoom >= 16)
-				Renderer.lineVector(feature, new LineStyle(Color.black, 4, new float[] { 10, 10 }));
+			if (zoom >= 12) {
+				if (zoom >= 14) {
+					Renderer.symbol(feature, Areas.MarineFarm);
+				}
+				if ((feature.area > 0.2) || ((feature.area > 0.05) && (zoom >= 14)) || ((feature.area > 0.005) && (zoom >= 16))) {
+					Renderer.lineVector(feature, new LineStyle(Color.black, 4, new float[] { 10, 10 }));
+				}
+			}
 			break;
 		case OSPARE:
@@ -219,5 +225,5 @@
 			if (zoom >= 12) {
 				Renderer.lineSymbols(feature, Areas.Restricted, 1.0, null, null, 0, Renderer.Mline);
-				if (testAttribute(feature, feature.type, Att.CATPRA, CatREA.REA_NWAK)) {
+				if (testAttribute(feature, feature.type, Att.CATREA, CatREA.REA_NWAK)) {
 					Renderer.symbol(feature, Areas.NoWake);
 				}
@@ -277,5 +283,5 @@
 		case SPLARE:
 			if (zoom >= 12) {
-				Renderer.symbol(feature, Areas.Plane);
+				Renderer.symbol(feature, Areas.Plane, new Scheme(Renderer.Msymb));
 				Renderer.lineSymbols(feature, Areas.Restricted, 0.5, Areas.LinePlane, null, 10, Renderer.Mline);
 			}
@@ -327,10 +333,15 @@
 	private static void bridges(Feature feature) {
 		if (zoom >= 16) {
-			double verclr, verccl, vercop;
+			double verclr, verccl, vercop, horclr;
 			AttMap atts = feature.objs.get(Obj.BRIDGE).get(0);
-			String str = "";
+			String vstr = "";
+			String hstr = "";
 			if (atts != null) {
-				if (atts.containsKey(Att.VERCLR)) {
-					verclr = (Double) atts.get(Att.VERCLR).val;
+				if (atts.containsKey(Att.HORCLR)) {
+					horclr = (Double) atts.get(Att.HORCLR).val;
+					hstr = String.valueOf(horclr);
+				}
+					if (atts.containsKey(Att.VERCLR)) {
+						verclr = (Double) atts.get(Att.VERCLR).val;
 				} else {
 					verclr = atts.containsKey(Att.VERCSA) ? (Double) atts.get(Att.VERCSA).val : 0;
@@ -339,14 +350,20 @@
 				vercop = atts.containsKey(Att.VERCOP) ? (Double) atts.get(Att.VERCOP).val : 0;
 				if (verclr > 0) {
-					str += String.valueOf(verclr);
+					vstr += String.valueOf(verclr);
 				} else if (verccl > 0) {
 					if (vercop == 0) {
-						str += String.valueOf(verccl) + "/-";
+						vstr += String.valueOf(verccl) + "/-";
 					} else {
-						str += String.valueOf(verccl) + "/" + String.valueOf(vercop);
+						vstr += String.valueOf(verccl) + "/" + String.valueOf(vercop);
 					}
 				}
-				if (!str.isEmpty())
-					Renderer.labelText(feature, str, new Font("Arial", Font.PLAIN, 30), LabelStyle.VCLR, Color.black, Color.white, new Delta(Handle.CC));
+				if (hstr.isEmpty() && !vstr.isEmpty()) {
+					Renderer.labelText(feature, vstr, new Font("Arial", Font.PLAIN, 30), LabelStyle.VCLR, Color.black, Color.white, new Delta(Handle.CC));
+				} else if (!hstr.isEmpty() && !vstr.isEmpty()) {
+					Renderer.labelText(feature, vstr, new Font("Arial", Font.PLAIN, 30), LabelStyle.VCLR, Color.black, Color.white, new Delta(Handle.BC));
+					Renderer.labelText(feature, hstr, new Font("Arial", Font.PLAIN, 30), LabelStyle.HCLR, Color.black, Color.white, new Delta(Handle.TC));
+				} else if (!hstr.isEmpty() && vstr.isEmpty()) {
+					Renderer.labelText(feature, hstr, new Font("Arial", Font.PLAIN, 30), LabelStyle.HCLR, Color.black, Color.white, new Delta(Handle.CC));
+				}
 			}
 		}
Index: /applications/editors/josm/plugins/smed2/src/seamap/SeaMap.java
===================================================================
--- /applications/editors/josm/plugins/smed2/src/seamap/SeaMap.java	(revision 30118)
+++ /applications/editors/josm/plugins/smed2/src/seamap/SeaMap.java	(revision 30119)
@@ -22,11 +22,13 @@
 
 	public enum Nflag {
-		ANON, ISOL, CONN
-	}
-
-	public class Snode {
-		public double lat;
-		public double lon;
-		public Nflag flg;
+		ANON,	// Edge inner nodes
+		ISOL,	// Node not part of Edge
+		CONN	// Edge first and last nodes
+	}
+
+	public class Snode {	// All coordinates in map
+		public double lat;	// Latitude
+		public double lon;	// Longitude
+		public Nflag flg;		// Role of node
 
 		public Snode() {
@@ -35,5 +37,4 @@
 			lon = 0;
 		}
-
 		public Snode(double ilat, double ilon) {
 			flg = Nflag.ANON;
@@ -41,5 +42,4 @@
 			lon = ilon;
 		}
-
 		public Snode(double ilat, double ilon, Nflag iflg) {
 			lat = ilat;
@@ -49,12 +49,10 @@
 	}
 
-	public class Edge {
-		public boolean forward;
-		public long first;
-		public long last;
-		public ArrayList<Long> nodes;
+	public class Edge {		// A polyline segment
+		public long first;	// First CONN node
+		public long last;		// Last CONN node
+		public ArrayList<Long> nodes; // Inner ANON nodes
 
 		public Edge() {
-			forward = true;
 			first = 0;
 			last = 0;
@@ -63,7 +61,7 @@
 	}
 
-	public class Side {
-		Edge edge;
-		boolean forward;
+	public class Side {	// An edge as used in a line or area feature
+		Edge edge;				// Side is formed by this Edge...
+		boolean forward;	// ... in this direction
 
 		public Side(Edge iedge, boolean ifwd) {
@@ -73,7 +71,7 @@
 	}
 
-	public class Bound {
-		public boolean outer;
-		ArrayList<Side> sides;
+	public class Bound { // A single closed area
+		public boolean outer;		// Role
+		ArrayList<Side> sides;	// Sides that make up this area
 
 		public Bound() {
@@ -81,5 +79,4 @@
 			sides = new ArrayList<Side>();
 		}
-
 		public Bound(Side iside, boolean irole) {
 			outer = irole;
@@ -89,5 +86,5 @@
 	}
 
-	public class Area extends ArrayList<Bound> {
+	public class Area extends ArrayList<Bound> {	// The collection of bounds for an area.
 		public Area() {
 			super();
@@ -389,5 +386,5 @@
 			nodes.get(edge.first).flg = Nflag.CONN;
 			nodes.get(edge.last).flg = Nflag.CONN;
-			Bound ebound = (new Bound(new Side(edge, edge.forward), true));
+			Bound ebound = (new Bound(new Side(edge, true), true));
 			feature.length = calcLength(ebound);
 			if (edge.first == edge.last) {
@@ -410,5 +407,5 @@
 					long node1 = edge.first;
 					long node2 = edge.last;
-					bound = new Bound(new Side(edge, edge.forward), (role == outers));
+					bound = new Bound(new Side(edge, true), (role == outers));
 					if (node1 != node2) {
 						for (ListIterator<Long> it = role.listIterator(0); it.hasNext();) {
@@ -551,6 +548,6 @@
 				} else {
 					double arc = (Math.acos(Math.cos(lon - llon) * Math.cos(lat - llat)));
-					slat += (lat * arc);
-					slon += (lon * arc);
+					slat += ((lat + llat) / 2 * arc);
+					slon += ((lon + llon) / 2 * arc);
 					sarc += arc;
 				}
Index: /applications/editors/josm/plugins/smed2/src/symbols/Areas.java
===================================================================
--- /applications/editors/josm/plugins/smed2/src/symbols/Areas.java	(revision 30118)
+++ /applications/editors/josm/plugins/smed2/src/symbols/Areas.java	(revision 30119)
@@ -65,4 +65,5 @@
 	public static final Symbol LinePlane = new Symbol();
 	static {
+		LinePlane.add(new Instr(Prim.BBOX, new Rectangle2D.Double(-30,-60,60,90)));
 		LinePlane.add(new Instr(Prim.FILL, new Color(0xc480ff)));
 		LinePlane.add(new Instr(Prim.SYMB, new Symbols.SubSymbol(Areas.Plane, 0.5, 0, 0, null, new Delta(Handle.CC, AffineTransform.getRotateInstance(Math.toRadians(-90.0))))));
