Index: /applications/editors/josm/plugins/smed2/src/panels/PanelMain.java
===================================================================
--- /applications/editors/josm/plugins/smed2/src/panels/PanelMain.java	(revision 30032)
+++ /applications/editors/josm/plugins/smed2/src/panels/PanelMain.java	(revision 30033)
@@ -19,5 +19,4 @@
 
 import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.actions.search.SearchCompiler.Parent;
 
 import s57.S57att.Att;
@@ -28,6 +27,5 @@
 
 public class PanelMain extends JPanel {
-	private static final long serialVersionUID = 1L;
-	
+
 	Smed2Action dlg;
 	BufferedImage img;
Index: /applications/editors/josm/plugins/smed2/src/panels/ShowFrame.java
===================================================================
--- /applications/editors/josm/plugins/smed2/src/panels/ShowFrame.java	(revision 30032)
+++ /applications/editors/josm/plugins/smed2/src/panels/ShowFrame.java	(revision 30033)
@@ -23,5 +23,5 @@
 
 	class Picture extends JPanel implements MapContext {
-		
+
 		public void drawPicture(OsmPrimitive osm, SeaMap map) {
 			long id;
Index: /applications/editors/josm/plugins/smed2/src/seamap/Renderer.java
===================================================================
--- /applications/editors/josm/plugins/smed2/src/seamap/Renderer.java	(revision 30032)
+++ /applications/editors/josm/plugins/smed2/src/seamap/Renderer.java	(revision 30033)
@@ -103,8 +103,8 @@
 	}
 
-	public static void symbol(Feature feature, Symbol symbol, Obj obj, Delta delta, Scheme scheme) {
+	public static void symbol(Feature feature, Symbol symbol, Obj obj, Scheme scheme, Delta delta) {
 		Point2D point = context.getPoint(feature.centre);
 		if (obj == null) {
-			Symbols.drawSymbol(g2, symbol, sScale, point.getX(), point.getY(), delta, scheme);
+			Symbols.drawSymbol(g2, symbol, sScale, point.getX(), point.getY(), scheme, delta);
 		} else {
 			ArrayList<Color> colours = new ArrayList<Color>();
@@ -116,14 +116,92 @@
 				patterns.add(pattMap.get(pat));
 			}
-			Symbols.drawSymbol(g2, symbol, sScale, point.getX(), point.getY(), delta, new Scheme(patterns, colours));
-		}
-	}
-
-	private static Rectangle symbolSize(Symbol symbol) {
+			Symbols.drawSymbol(g2, symbol, sScale, point.getX(), point.getY(), new Scheme(patterns, colours), delta);
+		}
+	}
+	
+	public static void cluster(Feature feature, ArrayList<Symbol> symbols) {
+		Rectangle2D.Double bbox = null;
+		if (symbols.size() > 4) {
+			for (Instr instr : symbols.get(0)) {
+				if (instr.type == Prim.BBOX) {
+					bbox = (Rectangle2D.Double) instr.params;
+					break;
+				}
+			}
+			if (bbox == null) return;
+		}
+		switch (symbols.size()) {
+		case 1:
+			symbol(feature, symbols.get(0), null, null, new Delta(Handle.CC, new AffineTransform()));
+			break;
+		case 2:
+			symbol(feature, symbols.get(0), null, null, new Delta(Handle.RC, new AffineTransform()));
+			symbol(feature, symbols.get(1), null, null, new Delta(Handle.LC, new AffineTransform()));
+			break;
+		case 3:
+			symbol(feature, symbols.get(0), null, null, new Delta(Handle.BC, new AffineTransform()));
+			symbol(feature, symbols.get(1), null, null, new Delta(Handle.TR, new AffineTransform()));
+			symbol(feature, symbols.get(2), null, null, new Delta(Handle.TL, new AffineTransform()));
+			break;
+		case 4:
+			symbol(feature, symbols.get(0), null, null, new Delta(Handle.BR, new AffineTransform()));
+			symbol(feature, symbols.get(1), null, null, new Delta(Handle.BL, new AffineTransform()));
+			symbol(feature, symbols.get(2), null, null, new Delta(Handle.TR, new AffineTransform()));
+			symbol(feature, symbols.get(3), null, null, new Delta(Handle.TL, new AffineTransform()));
+			break;
+		case 5:
+			symbol(feature, symbols.get(0), null, null, new Delta(Handle.BR, new AffineTransform()));
+			symbol(feature, symbols.get(1), null, null, new Delta(Handle.BL, new AffineTransform()));
+			symbol(feature, symbols.get(2), null, null, new Delta(Handle.TR, AffineTransform.getTranslateInstance(-bbox.width/2, 0)));
+			symbol(feature, symbols.get(3), null, null, new Delta(Handle.TC, new AffineTransform()));
+			symbol(feature, symbols.get(4), null, null, new Delta(Handle.TL, AffineTransform.getTranslateInstance(bbox.width/2, 0)));
+			break;
+		case 6:
+			symbol(feature, symbols.get(0), null, null, new Delta(Handle.BR, AffineTransform.getTranslateInstance(-bbox.width/2, 0)));
+			symbol(feature, symbols.get(1), null, null, new Delta(Handle.BC, new AffineTransform()));
+			symbol(feature, symbols.get(2), null, null, new Delta(Handle.BL, AffineTransform.getTranslateInstance(bbox.width/2, 0)));
+			symbol(feature, symbols.get(3), null, null, new Delta(Handle.TR, AffineTransform.getTranslateInstance(-bbox.width/2, 0)));
+			symbol(feature, symbols.get(4), null, null, new Delta(Handle.TC, new AffineTransform()));
+			symbol(feature, symbols.get(5), null, null, new Delta(Handle.TL, AffineTransform.getTranslateInstance(bbox.width/2, 0)));
+			break;
+		case 7:
+			symbol(feature, symbols.get(0), null, null, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, -bbox.height/2)));
+			symbol(feature, symbols.get(1), null, null, new Delta(Handle.RC, AffineTransform.getTranslateInstance(-bbox.width/2, 0)));
+			symbol(feature, symbols.get(2), null, null, new Delta(Handle.CC, new AffineTransform()));
+			symbol(feature, symbols.get(3), null, null, new Delta(Handle.LC, AffineTransform.getTranslateInstance(bbox.width/2, 0)));
+			symbol(feature, symbols.get(4), null, null, new Delta(Handle.TR, AffineTransform.getTranslateInstance(-bbox.width/2, bbox.height/2)));
+			symbol(feature, symbols.get(5), null, null, new Delta(Handle.TC, AffineTransform.getTranslateInstance(0, bbox.height/2)));
+			symbol(feature, symbols.get(6), null, null, new Delta(Handle.TL, AffineTransform.getTranslateInstance(bbox.width/2, bbox.height/2)));
+			break;
+		case 8:
+			symbol(feature, symbols.get(0), null, null, new Delta(Handle.BR, AffineTransform.getTranslateInstance(0, -bbox.height/2)));
+			symbol(feature, symbols.get(1), null, null, new Delta(Handle.BL, AffineTransform.getTranslateInstance(0, -bbox.height/2)));
+			symbol(feature, symbols.get(2), null, null, new Delta(Handle.RC, AffineTransform.getTranslateInstance(-bbox.width/2, 0)));
+			symbol(feature, symbols.get(3), null, null, new Delta(Handle.CC, new AffineTransform()));
+			symbol(feature, symbols.get(4), null, null, new Delta(Handle.LC, AffineTransform.getTranslateInstance(bbox.width/2, 0)));
+			symbol(feature, symbols.get(5), null, null, new Delta(Handle.TR, AffineTransform.getTranslateInstance(-bbox.width/2, bbox.height/2)));
+			symbol(feature, symbols.get(6), null, null, new Delta(Handle.TC, AffineTransform.getTranslateInstance(0, bbox.height/2)));
+			symbol(feature, symbols.get(7), null, null, new Delta(Handle.TL, AffineTransform.getTranslateInstance(bbox.width/2, bbox.height/2)));
+			break;
+		case 9:
+			symbol(feature, symbols.get(0), null, null, new Delta(Handle.BR, AffineTransform.getTranslateInstance(-bbox.width/2, -bbox.height/2)));
+			symbol(feature, symbols.get(1), null, null, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, -bbox.height/2)));
+			symbol(feature, symbols.get(2), null, null, new Delta(Handle.BL, AffineTransform.getTranslateInstance(bbox.width/2, -bbox.height/2)));
+			symbol(feature, symbols.get(3), null, null, new Delta(Handle.RC, AffineTransform.getTranslateInstance(-bbox.width/2, 0)));
+			symbol(feature, symbols.get(4), null, null, new Delta(Handle.CC, new AffineTransform()));
+			symbol(feature, symbols.get(5), null, null, new Delta(Handle.LC, AffineTransform.getTranslateInstance(bbox.width/2, 0)));
+			symbol(feature, symbols.get(6), null, null, new Delta(Handle.TR, AffineTransform.getTranslateInstance(-bbox.width/2, bbox.height/2)));
+			symbol(feature, symbols.get(7), null, null, new Delta(Handle.TC, AffineTransform.getTranslateInstance(0, bbox.height/2)));
+			symbol(feature, symbols.get(8), null, null, new Delta(Handle.TL, AffineTransform.getTranslateInstance(bbox.width/2, bbox.height/2)));
+			break;
+		}
+	}
+
+	private static Rectangle2D.Double symbolSize(Symbol symbol) {
 		Symbol ssymb = symbol;
 		while (ssymb != null) {
 			for (Instr item : symbol) {
 				if (item.type == Prim.BBOX) {
-					return (Rectangle) item.params;
+					return (Rectangle2D.Double) item.params;
 				}
 				if (item.type == Prim.SYMB) {
@@ -138,5 +216,5 @@
 	}
 
-	public static void lineSymbols(Feature feature, Symbol prisymb, double space, Symbol secsymb, int ratio, Color col) {
+	public static void lineSymbols(Feature feature, Symbol prisymb, double space, Symbol secsymb, Symbol tersymb, int ratio, Color col) {
 		Area area;
 		switch (feature.flag) {
@@ -152,6 +230,7 @@
 			return;
 		}
-		Rectangle prect = symbolSize(prisymb);
-		Rectangle srect = symbolSize(secsymb);
+		Rectangle2D.Double prect = symbolSize(prisymb);
+		Rectangle2D.Double srect = symbolSize(secsymb);
+		Rectangle2D.Double trect = symbolSize(tersymb);
 		if (srect == null)
 			ratio = 0;
@@ -159,4 +238,5 @@
 			double psize = Math.abs(prect.getY()) * sScale;
 			double ssize = (srect != null) ? Math.abs(srect.getY()) * sScale : 0;
+			double tsize = (trect != null) ? Math.abs(srect.getY()) * sScale : 0;
 			Point2D prev = new Point2D.Double();
 			Point2D next = new Point2D.Double();
@@ -167,5 +247,6 @@
 			double len = 0;
 			double angle = 0;
-			int scount = ratio;
+			int stcount = ratio;
+			boolean stflag = false;
 			Symbol symbol = prisymb;
 			for (Bound bound : area) {
@@ -180,5 +261,5 @@
 						curr = succ = next;
 						gap = (space > 0);
-						scount = ratio;
+						stcount = ratio - 1;
 						symbol = prisymb;
 						len = gap ? psize * space * 0.5 : psize;
@@ -202,15 +283,15 @@
 							}
 							if (!gap) {
-								Symbols.drawSymbol(g2, symbol, sScale, curr.getX(), curr.getY(),
-										new Delta(Handle.BC, AffineTransform.getRotateInstance(Math.atan2((succ.getY() - curr.getY()), (succ.getX() - curr.getX())) + Math.toRadians(90))),
-										new Scheme(col));
+								Symbols.drawSymbol(g2, symbol, sScale, curr.getX(), curr.getY(), new Scheme(col),
+										new Delta(Handle.BC, AffineTransform.getRotateInstance(Math.atan2((succ.getY() - curr.getY()), (succ.getX() - curr.getX())) + Math.toRadians(90))));
 							}
 							if (space > 0)
 								gap = !gap;
 							curr = succ;
-							len = gap ? (psize * space) : (--scount == 0) ? ssize : psize;
-							if (scount == 0) {
-								symbol = secsymb;
-								scount = ratio;
+							len = gap ? (psize * space) : (--stcount == 0) ? (stflag ? tsize : ssize) : psize;
+							if (stcount == 0) {
+								symbol = stflag ? tersymb : secsymb;
+								if (trect != null) stflag = !stflag;
+								stcount = ratio;
 							} else {
 								symbol = prisymb;
@@ -330,5 +411,5 @@
 
 	public static void labelText(Feature feature, String str, Font font, LabelStyle style, Color fg, Color bg, Delta delta) {
-		if (delta == null) delta = new Delta(Handle.CC, AffineTransform.getTranslateInstance(0, 0));
+		if (delta == null) delta = new Delta(Handle.CC);
 		if (bg == null) bg = new Color(0x00000000, true);
 		if ((str == null) || (str.isEmpty())) str = " ";
@@ -339,8 +420,5 @@
     double height = bounds.getHeight();
 		Symbol label = new Symbol();
-		double lx = 0;
-		double ly = 0;
-		double tx = 0;
-		double ty = 0;
+		double lx, ly, tx, ty;
 		switch (style) {
 		case RRCT:
@@ -378,8 +456,15 @@
 			label.add(new Instr(Prim.PLIN, p));
 			break;
+		default:
+			lx = -width / 2;
+			ly = -height / 2;
+			tx = lx;
+			ty = ly;
+			label.add(new Instr(Prim.BBOX, new Rectangle2D.Double(lx,ly,width,height)));
+			break;
 		}
 		label.add(new Instr(Prim.TEXT, new Caption(str, font, fg, new Delta(Handle.TL, AffineTransform.getTranslateInstance(tx, ty)))));
 		Point2D point = context.getPoint(feature.centre);
-		Symbols.drawSymbol(g2, label, sScale, point.getX(), point.getY(), delta, null);
+		Symbols.drawSymbol(g2, label, sScale, point.getX(), point.getY(), null, delta);
 	}
 
Index: /applications/editors/josm/plugins/smed2/src/seamap/Rules.java
===================================================================
--- /applications/editors/josm/plugins/smed2/src/seamap/Rules.java	(revision 30032)
+++ /applications/editors/josm/plugins/smed2/src/seamap/Rules.java	(revision 30033)
@@ -18,8 +18,4 @@
 import s57.S57att.*;
 import s57.S57obj.*;
-
-import seamap.SeaMap.AttItem;
-import seamap.SeaMap.AttMap;
-import seamap.SeaMap.ObjTab;
 import seamap.Renderer.*;
 import seamap.SeaMap.*;
@@ -33,5 +29,5 @@
 	
 	public static final Color Yland = new Color(0x50b0ff);
-	public static final Color Mline = new Color(0xc480ff);
+	public static final Color Mline = new Color(0x80c480);
 	public static final Color Msymb = new Color(0xa30075);
 	
@@ -149,5 +145,5 @@
 		case RESARE:
 			if (zoom >= 12) {
-				Renderer.lineSymbols(feature, Areas.Restricted, 1.0, null, 0, new Color(0x80c480));
+				Renderer.lineSymbols(feature, Areas.Restricted, 1.0, null, null, 0, Mline);
 //				if ((CatREA)Renderer.getAttVal(feature, feature.type, 0, Att.CATREA) == CatREA.REA_NWAK)
 //					Renderer.symbol(feature, Areas.NoWake, Obj.RESARE, null);
@@ -208,8 +204,10 @@
 			if (zoom >= 12) {
 				Renderer.symbol(feature, Areas.Plane, Obj.SPLARE, null, null);
-				Renderer.lineSymbols(feature, Areas.Restricted, 0.5, Areas.LinePlane, 10, new Color(0x80c480));
+				Renderer.lineSymbols(feature, Areas.Restricted, 0.5, Areas.LinePlane, null, 10, Mline);
 			}
 			if ((zoom >= 15) && (name != null))
 				Renderer.labelText(feature, (String) name.val, new Font("Arial", Font.BOLD, 80), LabelStyle.NONE, Color.black, null, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, -90)));
+			break;
+		default:
 			break;
 		}
@@ -239,5 +237,5 @@
 			Renderer.symbol(feature, Beacons.Shapes.get(shape), feature.type, null, 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, null);
+				Renderer.symbol(feature, Topmarks.Shapes.get(feature.objs.get(Obj.TOPMAR).get(0).get(Att.TOPSHP).val), Obj.TOPMAR, null, Topmarks.Beacons);
 		}
 		Signals.addSignals(feature);
@@ -248,5 +246,5 @@
 		Renderer.symbol(feature, Buoys.Shapes.get(shape), feature.type, null, 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), null);
+			Renderer.symbol(feature, Topmarks.Shapes.get(feature.objs.get(Obj.TOPMAR).get(0).get(Att.TOPSHP).val), Obj.TOPMAR, null, Topmarks.Buoys.get(shape));
 		}
 		Signals.addSignals(feature);
@@ -258,22 +256,24 @@
 			AttMap atts = feature.objs.get(Obj.BRIDGE).get(0);
 			String str = "";
-			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;
-			}
-			verccl = atts.containsKey(Att.VERCCL) ? (Double)atts.get(Att.VERCCL).val : 0;
-			vercop = atts.containsKey(Att.VERCOP) ? (Double)atts.get(Att.VERCOP).val : 0;
-			if (verclr > 0) {
-				str += String.valueOf(verclr);
-			} else if (verccl > 0) {
-				if (vercop == 0) {
-					str += String.valueOf(verccl) + "/-";
+			if (atts != null) {
+				if (atts.containsKey(Att.VERCLR)) {
+					verclr = (Double) atts.get(Att.VERCLR).val;
 				} else {
-					str += String.valueOf(verccl) + "/" + String.valueOf(vercop);
+					verclr = atts.containsKey(Att.VERCSA) ? (Double) atts.get(Att.VERCSA).val : 0;
 				}
-			}
-			if (!str.isEmpty())
-				Renderer.labelText(feature, str, new Font("Arial", Font.PLAIN, 30), LabelStyle.VCLR, Color.black, Color.white, new Delta(Handle.CC, AffineTransform.getTranslateInstance(0, 0)));
+				verccl = atts.containsKey(Att.VERCCL) ? (Double) atts.get(Att.VERCCL).val : 0;
+				vercop = atts.containsKey(Att.VERCOP) ? (Double) atts.get(Att.VERCOP).val : 0;
+				if (verclr > 0) {
+					str += String.valueOf(verclr);
+				} else if (verccl > 0) {
+					if (vercop == 0) {
+						str += String.valueOf(verccl) + "/-";
+					} else {
+						str += 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));
+			}
 		}
 	}
@@ -282,7 +282,12 @@
 		if ((zoom >= 16) && (feature.length < 2)) {
 			if (feature.type == Obj.CBLSUB) {
-				Renderer.lineSymbols(feature, Areas.Cable, 0.0, null, 0, new Color(0x80c480));
+				Renderer.lineSymbols(feature, Areas.Cable, 0.0, null, null, 0, Mline);
 			} else if (feature.type == Obj.CBLOHD) {
-
+				AttMap atts = feature.objs.get(Obj.CBLOHD).get(0);
+				if ((atts != null) && (atts.containsKey(Att.CATCBL)) && (atts.get(Att.CATCBL).val == CatCBL.CBL_POWR)) {
+					Renderer.lineSymbols(feature, Areas.CableDash, 0, Areas.CableDot, Areas.CableFlash, 2, Color.black);
+				} else {
+					Renderer.lineSymbols(feature, Areas.CableDash, 0, Areas.CableDot, null, 2, Color.black);
+				}
 			}
 		}
@@ -290,13 +295,40 @@
 	
 	private static void distances(Feature feature) {
-/*object_rules(distances) {
-  if ((zoom>=16) && (has_attribute("category"))) {
-    attribute_switch("category")
-    attribute_case("installed") symbol("distance_i");
-    attribute_default symbol("distance_u");
-    end_switch
-  }
-}
-*/
+		if (zoom >= 14) {
+			if (!((CatDIS)Renderer.getAttVal(feature, Obj.DISMAR, 0, Att.CATDIS) == CatDIS.DIS_NONI)) {
+				Renderer.symbol(feature, Harbours.DistanceI, null, null, null);
+			} else {
+				Renderer.symbol(feature, Harbours.DistanceU, null, null, null);
+			}
+			AttMap atts = feature.objs.get(Obj.DISMAR).get(0);
+			if ((atts != null) && (atts.containsKey(Att.WTWDIS)) && (zoom >=15)) {
+			Double dist = (Double)atts.get(Att.WTWDIS).val;
+			String str = "";
+			if (atts.containsKey(Att.HUNITS)) {
+				switch ((UniHLU)atts.get(Att.HUNITS).val) {
+				case HLU_METR:
+					str += "m ";
+					break;
+				case HLU_FEET:
+					str += "ft ";
+					break;
+				case HLU_HMTR:
+					str += "hm ";
+					break;
+				case HLU_KMTR:
+					str += "km ";
+					break;
+				case HLU_SMIL:
+					str += "M ";
+					break;
+				case HLU_NMIL:
+					str += "NM ";
+					break;
+				}
+			}
+			str += String.format("%1.0f", dist);
+			Renderer.labelText(feature, str, new Font("Arial", Font.PLAIN, 40), LabelStyle.NONE, Color.black, null, new Delta(Handle.CC, AffineTransform.getTranslateInstance(0, 45)));
+			}
+		}
 	}
 	
@@ -314,5 +346,5 @@
 		}
 		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, null);
+			Renderer.symbol(feature, Topmarks.Shapes.get(feature.objs.get(Obj.TOPMAR).get(0).get(Att.TOPSHP).val), Obj.TOPMAR, null, Topmarks.Floats);
 		Signals.addSignals(feature);
 	}
@@ -331,6 +363,6 @@
 		case ACHBRT:
 			if (zoom >= 14) {
-				Renderer.symbol(feature, Harbours.Anchorage, null, null, new Scheme(Mline));
-			Renderer.labelText(feature, name == null ? "" : (String) name.val, new Font("Arial", Font.PLAIN, 30), LabelStyle.RRCT, Mline, Color.white, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, 0)));
+				Renderer.symbol(feature, Harbours.Anchorage, null, new Scheme(Mline), null);
+			Renderer.labelText(feature, name == null ? "" : (String) name.val, new Font("Arial", Font.PLAIN, 30), LabelStyle.RRCT, Mline, Color.white, new Delta(Handle.BC));
 			}
 			double radius = (Double)Renderer.getAttVal(feature, Obj.ACHBRT, 0, Att.RADIUS);
@@ -343,8 +375,8 @@
 			if (zoom >= 12) {
 				if (feature.flag != Fflag.AREA) {
-					Renderer.symbol(feature, Harbours.Anchorage, null, null, new Scheme(Color.black));
+					Renderer.symbol(feature, Harbours.Anchorage, null, new Scheme(Color.black), null);
 				} else {
-					Renderer.symbol(feature, Harbours.Anchorage, null, null, new Scheme(Mline));
-					Renderer.lineSymbols(feature, Areas.Restricted, 1.0, Areas.LineAnchor, 10, Mline);
+					Renderer.symbol(feature, Harbours.Anchorage, null, new Scheme(Mline), null);
+					Renderer.lineSymbols(feature, Areas.Restricted, 1.0, Areas.LineAnchor, null, 10, Mline);
 				}
 				if ((zoom >= 15) && ((name) != null)) {
@@ -373,13 +405,13 @@
 					break;
 				case ACH_EXPL:
-					Renderer.symbol(feature, Harbours.Explosives, null, new Delta(Handle.RC, AffineTransform.getTranslateInstance(-60, dy)), new Scheme(Mline));
+					Renderer.symbol(feature, Harbours.Explosives, null, new Scheme(Mline), new Delta(Handle.RC, AffineTransform.getTranslateInstance(-60, dy)));
 					dy += 60;
 					break;
 				case ACH_QUAR:
-					Renderer.symbol(feature, Harbours.Hospital, null, new Delta(Handle.RC, AffineTransform.getTranslateInstance(-60, dy)), new Scheme(Mline));
+					Renderer.symbol(feature, Harbours.Hospital, null, new Scheme(Mline), new Delta(Handle.RC, AffineTransform.getTranslateInstance(-60, dy)));
 					dy += 60;
 					break;
 				case ACH_SEAP:
-					Renderer.symbol(feature, Areas.Seaplane, null, new Delta(Handle.RC, AffineTransform.getTranslateInstance(-60, dy)), new Scheme(Mline));
+					Renderer.symbol(feature, Areas.Seaplane, null, new Scheme(Mline), new Delta(Handle.RC, AffineTransform.getTranslateInstance(-60, dy)));
 					dy += 60;
 					break;
@@ -394,6 +426,16 @@
 		case BUISGL:
 		  if (zoom >= 16) {
+		  	ArrayList<Symbol> symbols = new ArrayList();
 		  	ArrayList<FncFNC> fncs = (ArrayList<FncFNC>) Renderer.getAttVal(feature, Obj.BUISGL, 0, Att.FUNCTN);
-		  	Renderer.symbol(feature, Landmarks.Funcs.get(fncs.get(0)), null, null, null);
+		  	for (FncFNC fnc : fncs) {
+		  		symbols.add(Landmarks.Funcs.get(fnc));
+		  	}
+			  if (feature.objs.containsKey(Obj.SMCFAC))  {
+			  	ArrayList<CatSCF> scfs = (ArrayList<CatSCF>) Renderer.getAttVal(feature, Obj.SMCFAC, 0, Att.CATSCF);
+			  	for (CatSCF scf : scfs) {
+			  		symbols.add(Facilities.Cats.get(scf));
+			  	}
+			  }
+			  Renderer.cluster(feature, symbols);
 		  }
 			break;
@@ -401,5 +443,4 @@
 	}
 /*
-  if ((zoom >= 16) && is_type("anchor_berth")) symbol("anchor_berth");
   if ((zoom >= 12) && is_type("harbour")) {
     if (has_attribute("category")) {
@@ -779,5 +820,5 @@
 		if (zoom >= 14) {
 			if (feature.type == Obj.PIPSOL) {
-				Renderer.lineSymbols(feature, Areas.Pipeline, 1.0, null, 0, new Color(0x80c480));
+				Renderer.lineSymbols(feature, Areas.Pipeline, 1.0, null, null, 0, Mline);
 			} else if (feature.type == Obj.PIPOHD) {
 
@@ -793,5 +834,5 @@
 		AttItem name = feature.atts.get(Att.OBJNAM);
 		if ((zoom >= 15) && (name != null))
-			Renderer.labelText(feature, (String) name.val, new Font("Arial", Font.BOLD, 80), LabelStyle.NONE, Color.black, null, new Delta(Handle.BC, AffineTransform.getTranslateInstance(60, -50)));
+			Renderer.labelText(feature, (String) name.val, new Font("Arial", Font.BOLD, 40), LabelStyle.NONE, Color.black, null, new Delta(Handle.BL, AffineTransform.getTranslateInstance(20, -50)));
 /*object_rules(platforms) {
   if (has_object("fog_signal")) object(fogs);
@@ -827,5 +868,5 @@
 			AttItem name = feature.atts.get(Att.OBJNAM);
 			if ((zoom >= 10) && (name != null))
-				Renderer.labelText(feature, (String) name.val, new Font("Arial", Font.BOLD, 150), LabelStyle.NONE, new Color(0x80c48080), null, null);
+				Renderer.labelText(feature, (String) name.val, new Font("Arial", Font.BOLD, 150), LabelStyle.NONE, new Color(0x80c48080, true), null, null);
 			break;
 		case TSELNE:
@@ -833,5 +874,5 @@
 			break;
 		case TSSLPT:
-			Renderer.lineSymbols(feature, Areas.LaneArrow, 0.5, null, 0, new Color(0x80c48080, true));
+			Renderer.lineSymbols(feature, Areas.LaneArrow, 0.5, null, null, 0, new Color(0x80c48080, true));
 			break;
 		case TSSBND:
@@ -839,5 +880,5 @@
 			break;
 		case ISTZNE:
-			Renderer.lineSymbols(feature, Areas.Restricted, 1.0, null, 0, new Color(0x80c48080, true));
+			Renderer.lineSymbols(feature, Areas.Restricted, 1.0, null, null, 0, new Color(0x80c48080, true));
 			break;
 		}
@@ -867,4 +908,7 @@
 			case SISTAW:
 				Renderer.symbol(feature, Harbours.SignalStation, null, null, null);
+				String str = "SS";
+				//  Append (cat) to str
+				Renderer.labelText(feature, str, new Font("Arial", Font.PLAIN, 40), LabelStyle.NONE, Color.black, null, new Delta(Handle.LC, AffineTransform.getTranslateInstance(30, 0)));
 				break;
 			case RDOSTA:
@@ -881,4 +925,5 @@
 			case CGUSTA:
 				Renderer.symbol(feature, Harbours.SignalStation, null, null, null);
+				Renderer.labelText(feature, "CG", new Font("Arial", Font.PLAIN, 40), LabelStyle.NONE, Color.black, null, new Delta(Handle.LC, AffineTransform.getTranslateInstance(30, 0)));
 				break;
 			case RSCSTA:
Index: /applications/editors/josm/plugins/smed2/src/seamap/Signals.java
===================================================================
--- /applications/editors/josm/plugins/smed2/src/seamap/Signals.java	(revision 30032)
+++ /applications/editors/josm/plugins/smed2/src/seamap/Signals.java	(revision 30033)
@@ -101,41 +101,43 @@
 			case ROS_VANC:
 				Renderer.labelText(feature, " V-AIS", new Font("Arial", Font.PLAIN, 40), LabelStyle.NONE, Color.black, null, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, 70)));
-				Renderer.symbol(feature, Topmarks.TopNorth, null, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, -25)), null);
+				Renderer.symbol(feature, Topmarks.TopNorth, null, null, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, -25)));
 				break;
 			case ROS_VASC:
 				Renderer.labelText(feature, " V-AIS", new Font("Arial", Font.PLAIN, 40), LabelStyle.NONE, Color.black, null, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, 70)));
-				Renderer.symbol(feature, Topmarks.TopSouth, null, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, -25)), null);
+				Renderer.symbol(feature, Topmarks.TopSouth, null, null, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, -25)));
 				break;
 			case ROS_VAEC:
 				Renderer.labelText(feature, " V-AIS", new Font("Arial", Font.PLAIN, 40), LabelStyle.NONE, Color.black, null, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, 70)));
-				Renderer.symbol(feature, Topmarks.TopEast, null, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, -25)), null);
+				Renderer.symbol(feature, Topmarks.TopEast, null, null, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, -25)));
 				break;
 			case ROS_VAWC:
 				Renderer.labelText(feature, " V-AIS", new Font("Arial", Font.PLAIN, 40), LabelStyle.NONE, Color.black, null, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, 70)));
-				Renderer.symbol(feature, Topmarks.TopWest, null, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, -25)), null);
+				Renderer.symbol(feature, Topmarks.TopWest, null, null, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, -25)));
 				break;
 			case ROS_VAPL:
 				Renderer.labelText(feature, " V-AIS", new Font("Arial", Font.PLAIN, 40), LabelStyle.NONE, Color.black, null, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, 70)));
-				Renderer.symbol(feature, Topmarks.TopCan, null, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, -25)), null);
+				Renderer.symbol(feature, Topmarks.TopCan, null, null, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, -25)));
 				break;
 			case ROS_VASL:
 				Renderer.labelText(feature, " V-AIS", new Font("Arial", Font.PLAIN, 40), LabelStyle.NONE, Color.black, null, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, 70)));
-				Renderer.symbol(feature, Topmarks.TopCone, null, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, -25)), null);
+				Renderer.symbol(feature, Topmarks.TopCone, null, null, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, -25)));
 				break;
 			case ROS_VAID:
 				Renderer.labelText(feature, " V-AIS", new Font("Arial", Font.PLAIN, 40), LabelStyle.NONE, Color.black, null, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, 70)));
-				Renderer.symbol(feature, Topmarks.TopIsol, null, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, -25)), null);
+				Renderer.symbol(feature, Topmarks.TopIsol, null, null, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, -25)));
 				break;
 			case ROS_VASW:
 				Renderer.labelText(feature, " V-AIS", new Font("Arial", Font.PLAIN, 40), LabelStyle.NONE, Color.black, null, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, 70)));
-				Renderer.symbol(feature, Topmarks.TopSphere, null, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, -25)), null);
+				Renderer.symbol(feature, Topmarks.TopSphere, null, null, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, -25)));
 				break;
 			case ROS_VASP:
 				Renderer.labelText(feature, " V-AIS", new Font("Arial", Font.PLAIN, 40), LabelStyle.NONE, Color.black, null, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, 70)));
-				Renderer.symbol(feature, Topmarks.TopX, null, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, -25)), null);
+				Renderer.symbol(feature, Topmarks.TopX, null, null, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, -25)));
 				break;
 			case ROS_VAWK:
 				Renderer.labelText(feature, " V-AIS", new Font("Arial", Font.PLAIN, 40), LabelStyle.NONE, Color.black, null, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, 70)));
-				Renderer.symbol(feature, Topmarks.TopCross, null, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, -25)), null);
+				Renderer.symbol(feature, Topmarks.TopCross, null, null, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, -25)));
+				break;
+			default:
 				break;
 			}
Index: /applications/editors/josm/plugins/smed2/src/smed2/MapImage.java
===================================================================
--- /applications/editors/josm/plugins/smed2/src/smed2/MapImage.java	(revision 30032)
+++ /applications/editors/josm/plugins/smed2/src/smed2/MapImage.java	(revision 30033)
@@ -10,5 +10,4 @@
 package smed2;
 
-import java.awt.BasicStroke;
 import java.awt.Color;
 import java.awt.Font;
Index: /applications/editors/josm/plugins/smed2/src/smed2/Smed2Action.java
===================================================================
--- /applications/editors/josm/plugins/smed2/src/smed2/Smed2Action.java	(revision 30032)
+++ /applications/editors/josm/plugins/smed2/src/smed2/Smed2Action.java	(revision 30033)
@@ -30,5 +30,4 @@
 
 import s57.S57dat;
-import seamap.Renderer;
 import seamap.SeaMap;
 import seamap.SeaMap.*;
@@ -38,6 +37,4 @@
 
 public class Smed2Action extends JosmAction implements EditLayerChangeListener, SelectionChangedListener {
-	private static final long serialVersionUID = 1L;
-	
 	private static String editor = tr("SeaMap Editor");
 	public static JFrame editFrame = null;
Index: /applications/editors/josm/plugins/smed2/src/symbols/Areas.java
===================================================================
--- /applications/editors/josm/plugins/smed2/src/symbols/Areas.java	(revision 30032)
+++ /applications/editors/josm/plugins/smed2/src/symbols/Areas.java	(revision 30033)
@@ -32,4 +32,21 @@
 		Cable.add(new Instr(Prim.PLIN, p));
 	}
+	public static final Symbol CableDot = new Symbol();
+	static {
+		CableDot.add(new Instr(Prim.BBOX, new Rectangle2D.Double(-30,-60,60,60)));
+		CableDot.add(new Instr(Prim.RSHP, new Ellipse2D.Double(-10,-40,20,20)));
+	}
+	public static final Symbol CableDash = new Symbol();
+	static {
+		CableDash.add(new Instr(Prim.BBOX, new Rectangle2D.Double(-30,-60,60,60)));
+		CableDash.add(new Instr(Prim.STRK, new BasicStroke(8, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND)));
+		CableDash.add(new Instr(Prim.LINE, new Line2D.Double(0,-15,0,-45)));
+	}
+	public static final Symbol CableFlash = new Symbol();
+	static {
+		CableFlash.add(new Instr(Prim.BBOX, new Rectangle2D.Double(-30,-60,60,60)));
+		Path2D.Double p = new Path2D.Double(); p.moveTo(-30,-25); p.lineTo(-10,-40); p.lineTo(10,-26); p.lineTo(30,-35); p.lineTo(10,-20); p.lineTo(-10,-34); p.closePath();
+		CableFlash.add(new Instr(Prim.PGON, p));
+	}
 	public static final Symbol LaneArrow = new Symbol();
 	static {
@@ -44,10 +61,10 @@
 	static {
 		LineAnchor.add(new Instr(Prim.BBOX, new Rectangle2D.Double(-30,-60,60,90)));
-		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)));
+		LineAnchor.add(new Instr(Prim.SYMB, new Symbols.SubSymbol(Harbours.Anchor, 0.5, 0, 0, null, new Delta(Handle.CC, AffineTransform.getRotateInstance(Math.toRadians(-90.0))))));
 	}
 	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.SubSymbol(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, null, new Delta(Handle.CC, AffineTransform.getRotateInstance(Math.toRadians(-90.0))))));
 	}
 	public static final Symbol MarineFarm = new Symbol();
Index: /applications/editors/josm/plugins/smed2/src/symbols/Beacons.java
===================================================================
--- /applications/editors/josm/plugins/smed2/src/symbols/Beacons.java	(revision 30032)
+++ /applications/editors/josm/plugins/smed2/src/symbols/Beacons.java	(revision 30033)
@@ -12,9 +12,5 @@
 import java.awt.BasicStroke;
 import java.awt.Color;
-import java.awt.geom.Arc2D;
-import java.awt.geom.Ellipse2D;
-import java.awt.geom.GeneralPath;
-import java.awt.geom.Line2D;
-import java.awt.geom.Path2D;
+import java.awt.geom.*;
 import java.util.EnumMap;
 
Index: /applications/editors/josm/plugins/smed2/src/symbols/Facilities.java
===================================================================
--- /applications/editors/josm/plugins/smed2/src/symbols/Facilities.java	(revision 30032)
+++ /applications/editors/josm/plugins/smed2/src/symbols/Facilities.java	(revision 30033)
@@ -13,5 +13,8 @@
 import java.awt.Color;
 import java.awt.geom.*;
-
+import java.util.EnumMap;
+
+import s57.S57val.CatLMK;
+import s57.S57val.CatSCF;
 import symbols.Symbols.*;
 
@@ -28,4 +31,5 @@
 	public static final Symbol Boatlift = new Symbol();//was Crane
 	static {
+		Boatlift.add(new Instr(Prim.BBOX, new Rectangle2D.Double(-30,-30,60,60)));
 		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, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND)));
@@ -36,4 +40,5 @@
 	public static final Symbol Boatyard = new Symbol();
 	static {
+		Boatyard.add(new Instr(Prim.BBOX, new Rectangle2D.Double(-30,-30,60,60)));
 		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, BasicStroke.CAP_ROUND, BasicStroke.JOIN_MITER)));
@@ -45,4 +50,5 @@
 	public static final Symbol Chandler = new Symbol();
 	static {
+		Chandler.add(new Instr(Prim.BBOX, new Rectangle2D.Double(-30,-30,60,60)));
 		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, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND)));
@@ -55,4 +61,5 @@
 	public static final Symbol Fuel = new Symbol();
 	static {
+		Fuel.add(new Instr(Prim.BBOX, new Rectangle2D.Double(-30,-30,60,60)));
 		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)));
@@ -69,4 +76,5 @@
 	public static final Symbol Laundrette = new Symbol();
 	static {
+		Laundrette.add(new Instr(Prim.BBOX, new Rectangle2D.Double(-30,-30,60,60)));
 		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)));
@@ -80,4 +88,5 @@
 	public static final Symbol PumpOut = new Symbol();
 	static {
+		PumpOut.add(new Instr(Prim.BBOX, new Rectangle2D.Double(-30,-30,60,60)));
 		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)));
@@ -96,4 +105,5 @@
 	public static final Symbol SailingClub = new Symbol();
 	static {
+		SailingClub.add(new Instr(Prim.BBOX, new Rectangle2D.Double(-30,-30,60,60)));
 		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, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND)));
@@ -105,4 +115,5 @@
 	public static final Symbol Shower = new Symbol();
 	static {
+		Shower.add(new Instr(Prim.BBOX, new Rectangle2D.Double(-30,-30,60,60)));
 		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, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND)));
@@ -119,4 +130,5 @@
 	public static final Symbol Slipway = new Symbol();
 	static {
+		Slipway.add(new Instr(Prim.BBOX, new Rectangle2D.Double(-30,-30,60,60)));
 		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, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND)));
@@ -136,4 +148,5 @@
 	public static final Symbol Toilet = new Symbol();
 	static {
+		Toilet.add(new Instr(Prim.BBOX, new Rectangle2D.Double(-30,-30,60,60)));
 		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, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND)));
@@ -153,4 +166,5 @@
 	public static final Symbol VisitorBerth = new Symbol();
 	static {
+		VisitorBerth.add(new Instr(Prim.BBOX, new Rectangle2D.Double(-30,-30,60,60)));
 		VisitorBerth.add(new Instr(Prim.FILL, new Color(0xa30075)));
 		VisitorBerth.add(new Instr(Prim.RSHP, new Ellipse2D.Double(-25,-25,50,50)));
@@ -177,3 +191,10 @@
 		VisitorMooring.add(new Instr(Prim.PGON, p));
 	}
+
+	public static final EnumMap<CatSCF, Symbol> Cats = new EnumMap<CatSCF, Symbol>(CatSCF.class);
+	static {
+		Cats.put(CatSCF.SCF_BHST, Boatlift); Cats.put(CatSCF.SCF_BTYD, Boatyard); Cats.put(CatSCF.SCF_CHDR, Chandler); Cats.put(CatSCF.SCF_FUEL, Fuel); Cats.put(CatSCF.SCF_LAUN, Laundrette);
+		Cats.put(CatSCF.SCF_PMPO, PumpOut); Cats.put(CatSCF.SCF_CLUB, SailingClub); Cats.put(CatSCF.SCF_SHWR, Shower); Cats.put(CatSCF.SCF_SLPW, Slipway); Cats.put(CatSCF.SCF_WC, Toilet);
+		Cats.put(CatSCF.SCF_VBTH, VisitorBerth); Cats.put(CatSCF.SCF_VMOR, VisitorMooring);
+	}
 }
Index: /applications/editors/josm/plugins/smed2/src/symbols/Harbours.java
===================================================================
--- /applications/editors/josm/plugins/smed2/src/symbols/Harbours.java	(revision 30032)
+++ /applications/editors/josm/plugins/smed2/src/symbols/Harbours.java	(revision 30033)
@@ -40,15 +40,4 @@
 		Bollard.add(new Instr(Prim.FILL, Color.black));
 		Bollard.add(new Instr(Prim.ELPS, s));
-	}
-	public static final Symbol ClearV = new Symbol();
-	static {
-		ClearV.add(new Instr(Prim.STRK, new BasicStroke(4, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)));
-		ClearV.add(new Instr(Prim.FILL, Color.white));
-		ClearV.add(new Instr(Prim.RSHP, new Ellipse2D.Double(-30,-30,60,60)));
-		ClearV.add(new Instr(Prim.FILL, Color.black));
-		ClearV.add(new Instr(Prim.LINE, new Line2D.Double(-10,-25,10,-25)));
-		ClearV.add(new Instr(Prim.LINE, new Line2D.Double(0,-25,0,-15)));
-		ClearV.add(new Instr(Prim.LINE, new Line2D.Double(-10,25,10,25)));
-		ClearV.add(new Instr(Prim.LINE, new Line2D.Double(0,25,0,15)));
 	}
 	public static final Symbol ContainerCrane = new Symbol();
@@ -113,7 +102,8 @@
 	public static final Symbol HarbourMaster = new Symbol();
 	static {
+		HarbourMaster.add(new Instr(Prim.BBOX, new Rectangle2D.Double(-30,-30,60,60)));
 		HarbourMaster.add(new Instr(Prim.STRK, new BasicStroke(4, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)));
-		HarbourMaster.add(new Instr(Prim.ELPS, new Ellipse2D.Double(-35,-50,70,100)));
-		HarbourMaster.add(new Instr(Prim.SYMB, new Symbols.SubSymbol(Harbours.Anchor, 0.6, 0, 0, null, null)));
+		HarbourMaster.add(new Instr(Prim.ELPS, new Ellipse2D.Double(-24,-28,48,56)));
+		HarbourMaster.add(new Instr(Prim.SYMB, new Symbols.SubSymbol(Harbours.Anchor, 0.4, 0, 0, null, null)));
 	}
 	public static final Symbol Hospital = new Symbol();
Index: /applications/editors/josm/plugins/smed2/src/symbols/Landmarks.java
===================================================================
--- /applications/editors/josm/plugins/smed2/src/symbols/Landmarks.java	(revision 30032)
+++ /applications/editors/josm/plugins/smed2/src/symbols/Landmarks.java	(revision 30033)
@@ -11,10 +11,5 @@
 
 import java.awt.BasicStroke;
-import java.awt.Color;
-import java.awt.geom.Arc2D;
-import java.awt.geom.Ellipse2D;
-import java.awt.geom.Line2D;
-import java.awt.geom.Path2D;
-import java.awt.geom.Rectangle2D;
+import java.awt.geom.*;
 import java.util.EnumMap;
 
Index: /applications/editors/josm/plugins/smed2/src/symbols/Notices.java
===================================================================
--- /applications/editors/josm/plugins/smed2/src/symbols/Notices.java	(revision 30032)
+++ /applications/editors/josm/plugins/smed2/src/symbols/Notices.java	(revision 30033)
@@ -240,5 +240,5 @@
 	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)));
+		NoticeA6.add(new Instr(Prim.SYMB, new Symbols.SubSymbol(Harbours.Anchor, 0.4, 0, 0, null, new Delta(Handle.CC, AffineTransform.getRotateInstance(Math.toRadians(180.0))))));
 	}
 	public static final Symbol NoticeA7 = new Symbol();
@@ -277,5 +277,5 @@
 	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)));
+		NoticeA10b.add(new Instr(Prim.SYMB, new Symbols.SubSymbol(Notices.NoticeA10a, 1.0, 0, 0, null, new Delta(Handle.CC, AffineTransform.getRotateInstance(Math.toRadians(180.0))))));
 	}
 	public static final Symbol NoticeA12 = new Symbol();
@@ -512,5 +512,5 @@
 	public static final Symbol NoticeD2b = new Symbol();
 	static {
-		NoticeD2b.add(new Instr(Prim.SYMB, new Symbols.SubSymbol(Notices.NoticeD2a, 1.0, 0, 0, new Delta(Handle.CC, AffineTransform.getRotateInstance(Math.toRadians(180.0))), null)));
+		NoticeD2b.add(new Instr(Prim.SYMB, new Symbols.SubSymbol(Notices.NoticeD2a, 1.0, 0, 0, null, new Delta(Handle.CC, AffineTransform.getRotateInstance(Math.toRadians(180.0))))));
 	}
 	public static final Symbol NoticeD3a = new Symbol();
@@ -1039,4 +1039,6 @@
 			}
 			break;
+		default:
+			break;
 		}
 		return scheme;
@@ -1055,4 +1057,6 @@
 			symbol = NmkPpwbc.get(cat);
 			break;
+		default:
+			break;
 		}
 		return symbol;
Index: /applications/editors/josm/plugins/smed2/src/symbols/Symbols.java
===================================================================
--- /applications/editors/josm/plugins/smed2/src/symbols/Symbols.java	(revision 30032)
+++ /applications/editors/josm/plugins/smed2/src/symbols/Symbols.java	(revision 30033)
@@ -50,4 +50,8 @@
 			t = it;
 		}
+		public Delta(Handle ih) {
+			h = ih;
+			t = new AffineTransform();
+		}
 	}
 
@@ -110,5 +114,5 @@
 		public Scheme scheme;
 
-		public SubSymbol(Symbol iinstr, double iscale, double ix, double iy, Delta idelta, Scheme ischeme) {
+		public SubSymbol(Symbol iinstr, double iscale, double ix, double iy, Scheme ischeme, Delta idelta) {
 			instr = iinstr;
 			scale = iscale;
@@ -120,5 +124,5 @@
 	}
 
-	public static void drawSymbol(Graphics2D g2, Symbol 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, Scheme cs, Delta dd) {
 		int pn = 0;
 		int cn = 0;
@@ -234,4 +238,6 @@
 								}
 								break;
+							default:
+								break;
 							}
 						}
@@ -270,5 +276,5 @@
 				case SYMB:
 					SubSymbol s = (SubSymbol) item.params;
-					drawSymbol(g2, s.instr, s.scale, s.x, s.y, s.delta, (s.scheme != null ? s.scheme : cs));
+					drawSymbol(g2, s.instr, s.scale, s.x, s.y, (s.scheme != null ? s.scheme : cs), s.delta);
 					break;
 				case TEXT:
@@ -322,4 +328,6 @@
 					layout.draw(g2, (float)dx, (float)dy);
 					break;
+				default:
+					break;
 				}
 			}
