Index: applications/editors/josm/plugins/smed2/src/seamap/Renderer.java
===================================================================
--- applications/editors/josm/plugins/smed2/src/seamap/Renderer.java	(revision 30026)
+++ applications/editors/josm/plugins/smed2/src/seamap/Renderer.java	(revision 30027)
@@ -63,5 +63,5 @@
 //	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 };
 	
-	public enum LabelStyle { NONE, RRCT, RECT, ELPS, CIRC }
+	public enum LabelStyle { NONE, RRCT, RECT, ELPS, CIRC, VCLR, HCLR }
 
 	static MapContext context;
@@ -342,6 +342,7 @@
     double width = bounds.getWidth();
     double height = bounds.getHeight();
-    double dx = 0.25 * width;
-    double dy = 0.25 * height;
+		if (width < height) width = height;
+    double dx = 0;
+    double dy = 0;
 		switch (delta.h) {
 		case CC:
@@ -349,18 +350,11 @@
 			dy += height / 2.0;
 			break;
-		case TL:
-			dx += 0;
-			dy += 0;
-			break;
 		case TR:
 			dx += width;
-			dy += 0;
 			break;
 		case TC:
 			dx += width / 2.0;
-			dy += 0;
 			break;
 		case LC:
-			dx += 0;
 			dy += height / 2.0;
 			break;
@@ -370,5 +364,4 @@
 			break;
 		case BL:
-			dx += 0;
 			dy += height;
 			break;
@@ -382,10 +375,11 @@
 			break;
 		}
+		width += (height * 0.8);
+		dx += (height * 0.4);
+		height *= 1.5;
+		dy += (height * 0.15);
 		Symbol label = new Symbol();
 		switch (style) {
 		case RRCT:
-			if (width < height) width = height;
-			width *= 1.5;
-			height *= 1.5;
 			label.add(new Instr(Prim.FILL, bg));
 			label.add(new Instr(Prim.RSHP, new RoundRectangle2D.Double(-dx,-dy,width,height,height,height)));
@@ -393,4 +387,17 @@
 			label.add(new Instr(Prim.STRK, new BasicStroke(1 + (int)(height/10), BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)));
 			label.add(new Instr(Prim.RRCT, new RoundRectangle2D.Double(-dx,-dy,width,height,height,height)));
+			break;
+		case VCLR:
+			height += 20;
+			dy += 10;
+			label.add(new Instr(Prim.FILL, bg));
+			label.add(new Instr(Prim.RSHP, new RoundRectangle2D.Double(-dx,-dy,width,height,height,height)));
+			label.add(new Instr(Prim.FILL, fg));
+			int sw = 1 + (int)(height/10);
+			double po = dy - (sw / 2);
+			label.add(new Instr(Prim.STRK, new BasicStroke(sw, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)));
+			Path2D.Double p = new Path2D.Double(); p.moveTo(-(height*0.2),po); p.lineTo((height*0.2),po); p.moveTo(0,po); p.lineTo(0,po-10);
+			p.moveTo(-(height*0.2),-po); p.lineTo((height*0.2),-po); p.moveTo(0,-po); p.lineTo(0,-po+10);
+			label.add(new Instr(Prim.PLIN, p));
 			break;
 		}
Index: applications/editors/josm/plugins/smed2/src/seamap/Rules.java
===================================================================
--- applications/editors/josm/plugins/smed2/src/seamap/Rules.java	(revision 30026)
+++ applications/editors/josm/plugins/smed2/src/seamap/Rules.java	(revision 30027)
@@ -19,4 +19,7 @@
 import s57.S57obj.*;
 
+import seamap.SeaMap.AttItem;
+import seamap.SeaMap.AttMap;
+import seamap.SeaMap.ObjTab;
 import seamap.Renderer.*;
 import seamap.SeaMap.*;
@@ -69,4 +72,5 @@
 		if ((objects = map.features.get(Obj.CRANES)) != null) for (Feature feature : objects) ports(feature);
 		if ((objects = map.features.get(Obj.LNDMRK)) != null) for (Feature feature : objects) landmarks(feature);
+		if ((objects = map.features.get(Obj.BUISGL)) != null) for (Feature feature : objects) harbours(feature);
 		if ((objects = map.features.get(Obj.MORFAC)) != null) for (Feature feature : objects) moorings(feature);
 		if ((objects = map.features.get(Obj.NOTMRK)) != null) for (Feature feature : objects) notices(feature);
@@ -247,33 +251,28 @@
 	private static void bridges(Feature feature) {
 		if (zoom >= 16) {
-			
-		}
-/*    case BRIDGE: {
-      Att_t *attv = getAtt(getObj(item, BRIDGE, 0), VERCLR);
-      if (attv == NULL) attv = getAtt(getObj(item, BRIDGE, 0), VERCSA);
-      Att_t *attc = getAtt(getObj(item, BRIDGE, 0), VERCCL);
-      Att_t *atto = getAtt(getObj(item, BRIDGE, 0), VERCOP);
-      if (attv != NULL) {
-        renderSymbol(item, obja, "clear_v", "", "", CC, 0, 0, 0);
-        drawText(item, stringValue(attv->val), "font-family:Arial; font-weight:normal; font-size:70; text-anchor:middle", 0, 12);
-      }
-      else if ((attc != NULL) && (atto == NULL)) {
-        char *string=strdup(stringValue(attc->val));
-        string = realloc(string, strlen(string) + 3); strcat(string, "/-");
-        renderSymbol(item, obja, "clear_v", "", "", CC, 0, 0, 0);
-        drawText(item, string, "font-family:Arial; font-weight:normal; font-size:70; text-anchor:middle", 0, 12);
-        free(string);
-      }
-      else if ((attc != NULL) && (atto != NULL)) {
-        char *string=strdup(stringValue(attc->val));
-        string = realloc(string, strlen(string) + 2); strcat(string, "/");
-        string = realloc(string, strlen(string) + strlen(stringValue(atto->val)) + 1); strcat(string, stringValue(atto->val));
-        renderSymbol(item, obja, "clear_v", "", "", CC, 0, 0, 0);
-        drawText(item, string, "font-family:Arial; font-weight:normal; font-size:60; text-anchor:middle", 0, 10);
-        free(string);
-      }
-    }
-*/
-	}
+			double verclr, verccl, vercop;
+			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) + "/-";
+				} 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, AffineTransform.getTranslateInstance(0, 0)));
+		}
+	}
+	
 	private static void cables(Feature feature) {
 		if (zoom >= 14) {
@@ -389,4 +388,10 @@
 			}
 			break;
+		case BUISGL:
+		  if (zoom >= 16) {
+		  	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);
+		  }
+			break;
 		}
 	}
@@ -430,4 +435,7 @@
 */
 		Signals.addSignals(feature);
+	}
+	
+	private static void buildings(Feature feature) {
 	}
 	
Index: applications/editors/josm/plugins/smed2/src/symbols/Landmarks.java
===================================================================
--- applications/editors/josm/plugins/smed2/src/symbols/Landmarks.java	(revision 30026)
+++ applications/editors/josm/plugins/smed2/src/symbols/Landmarks.java	(revision 30027)
@@ -210,5 +210,6 @@
 		Funcs.put(FncFNC.FNC_MOSQ, Landmarks.Minaret); Funcs.put(FncFNC.FNC_MRBT, Landmarks.Spire); Funcs.put(FncFNC.FNC_COMM, Landmarks.RadioTV);
 		Funcs.put(FncFNC.FNC_TV, Landmarks.RadioTV); Funcs.put(FncFNC.FNC_RADO, Landmarks.RadioTV); Funcs.put(FncFNC.FNC_RADR, Landmarks.RadioTV);
-		Funcs.put(FncFNC.FNC_LGHT, Beacons.LightMajor); Funcs.put(FncFNC.FNC_MCWV, Landmarks.RadioTV);
+		Funcs.put(FncFNC.FNC_LGHT, Beacons.LightMajor); Funcs.put(FncFNC.FNC_MCWV, Landmarks.RadioTV); Funcs.put(FncFNC.FNC_HBRM, Harbours.HarbourMaster);
+		Funcs.put(FncFNC.FNC_CSTM, Harbours.Customs); Funcs.put(FncFNC.FNC_HLTH, Harbours.Hospital); Funcs.put(FncFNC.FNC_HOSP, Harbours.Hospital);
 	}
 }
