Index: /applications/editors/josm/plugins/smed2/src/seamap/Renderer.java
===================================================================
--- /applications/editors/josm/plugins/smed2/src/seamap/Renderer.java	(revision 30122)
+++ /applications/editors/josm/plugins/smed2/src/seamap/Renderer.java	(revision 30123)
@@ -20,4 +20,6 @@
 import seamap.SeaMap.*;
 import seamap.SeaMap.Area;
+import symbols.Areas;
+import symbols.Harbours;
 import symbols.Symbols;
 import symbols.Symbols.*;
@@ -62,5 +64,5 @@
 	}
 	
-	public enum LabelStyle { NONE, RRCT, RECT, ELPS, CIRC, VCLR, HCLR }
+	public enum LabelStyle { NONE, RRCT, RECT, ELPS, CIRC, VCLR, PCLR, HCLR }
 
 	static MapContext context;
@@ -446,4 +448,25 @@
 			label.add(new Instr(Prim.PLIN, p));
 			break;
+		case PCLR:
+			width += height * 1.0;
+			height *= 2.0;
+	    if (width < height) width = height;
+	    lx = -width / 2;
+	    ly = -height / 2;
+	    tx = lx + (height * 0.27);
+	    ty = ly + (height * 0.25);
+			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);
+			po = sw / 2;
+			label.add(new Instr(Prim.STRK, new BasicStroke(sw, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)));
+			p = new Path2D.Double(); p.moveTo(-height*0.2,-ly-po); p.lineTo(height*0.2,-ly-po); p.moveTo(0,-ly-po); p.lineTo(0,-ly-po-(height*0.15));
+			p.moveTo(-height*0.2,ly+po); p.lineTo((height*0.2),ly+po); p.moveTo(0,ly+po); p.lineTo(0,ly+po+(height*0.15));
+			label.add(new Instr(Prim.PLIN, p));
+			label.add(new Instr(Prim.SYMB, new Symbols.SubSymbol(Areas.CableFlash, 1, 0, 0, null, new Delta(Handle.CC, new AffineTransform(0,-1,1,0,-width/2,0)))));
+			label.add(new Instr(Prim.SYMB, new Symbols.SubSymbol(Areas.CableFlash, 1, 0, 0, null, new Delta(Handle.CC, new AffineTransform(0,-1,1,0,width/2,0)))));
+			break;
 		case HCLR:
 			width += height * 1.5;
Index: /applications/editors/josm/plugins/smed2/src/seamap/Rules.java
===================================================================
--- /applications/editors/josm/plugins/smed2/src/seamap/Rules.java	(revision 30122)
+++ /applications/editors/josm/plugins/smed2/src/seamap/Rules.java	(revision 30123)
@@ -381,4 +381,11 @@
 					Renderer.lineSymbols(feature, Areas.CableDash, 0, Areas.CableDot, null, 2, Color.black);
 				}
+				if (atts != null) {
+					if (atts.containsKey(Att.VERCLR)) {
+						Renderer.labelText(feature, String.valueOf((Double) atts.get(Att.VERCLR).val), new Font("Arial", Font.PLAIN, 50), LabelStyle.VCLR, Color.black, new Delta(Handle.TC, AffineTransform.getTranslateInstance(0,25)));
+					} else if (atts.containsKey(Att.VERCSA)) {
+						Renderer.labelText(feature, String.valueOf((Double) atts.get(Att.VERCSA).val), new Font("Arial", Font.PLAIN, 50), LabelStyle.PCLR, Color.black, new Delta(Handle.TC, AffineTransform.getTranslateInstance(0,25)));
+					}
+				}
 			}
 		}
@@ -876,9 +883,21 @@
 
 	private static void pipelines(Feature feature) {
-		if (zoom >= 14) {
+		if ((zoom >= 16) && (feature.length < 2)) {
 			if (feature.type == Obj.PIPSOL) {
 				Renderer.lineSymbols(feature, Areas.Pipeline, 1.0, null, null, 0, Renderer.Mline);
 			} else if (feature.type == Obj.PIPOHD) {
-
+				Renderer.lineVector(feature, new LineStyle(Color.black, 8));
+				AttMap atts = feature.objs.get(Obj.PIPOHD).get(0);
+				double verclr = 0;
+				if (atts != null) {
+					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;
+					}
+					if (verclr > 0) {
+						Renderer.labelText(feature, String.valueOf(verclr), new Font("Arial", Font.PLAIN, 50), LabelStyle.VCLR, Color.black, new Delta(Handle.TC, AffineTransform.getTranslateInstance(0,25)));
+					}
+				}
 			}
 		}
@@ -961,11 +980,11 @@
 	private static void stations(Feature feature) {
 		if (zoom >= 14) {
+			String str = "";
 			switch (feature.type) {
 			case SISTAT:
 			case SISTAW:
 				Renderer.symbol(feature, Harbours.SignalStation);
-				String str = "SS";
+				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:
@@ -982,9 +1001,12 @@
 			case CGUSTA:
 				Renderer.symbol(feature, Harbours.SignalStation);
-				Renderer.labelText(feature, "CG", new Font("Arial", Font.PLAIN, 40), LabelStyle.NONE, Color.black, null, new Delta(Handle.LC, AffineTransform.getTranslateInstance(30, 0)));
+				str = "CG";
 				break;
 			case RSCSTA:
 				Renderer.symbol(feature, Harbours.Rescue);
 				break;
+			}
+			if ((zoom >= 15) && !str.isEmpty()) {
+				Renderer.labelText(feature, str, new Font("Arial", Font.PLAIN, 40), LabelStyle.NONE, Color.black, null, new Delta(Handle.LC, AffineTransform.getTranslateInstance(30, 0)));
 			}
 		}
Index: /applications/editors/josm/plugins/smed2/src/seamap/Signals.java
===================================================================
--- /applications/editors/josm/plugins/smed2/src/seamap/Signals.java	(revision 30122)
+++ /applications/editors/josm/plugins/smed2/src/seamap/Signals.java	(revision 30123)
@@ -15,22 +15,21 @@
 import java.util.ArrayList;
 
-import s57.S57att.Att;
-import s57.S57obj.Obj;
-import s57.S57val.CatROS;
-import seamap.Renderer.LabelStyle;
+import s57.S57att.*;
+import s57.S57obj.*;
+import s57.S57val.*;
+import seamap.Renderer.*;
 import seamap.SeaMap.*;
 import symbols.Beacons;
 import symbols.Topmarks;
-import symbols.Symbols.Delta;
-import symbols.Symbols.Handle;
+import symbols.Symbols.*;
 
 public class Signals {
 
 	public static void addSignals(Feature feature) {
-	  if (feature.objs.containsKey(Obj.FOGSIG)) Signals.fogSignals(feature);
-	  if (feature.objs.containsKey(Obj.RTPBCN)) Signals.radarStations(feature);
-	  if (feature.objs.containsKey(Obj.RADSTA)) Signals.radarStations(feature);
-	  if (feature.objs.containsKey(Obj.RDOSTA)) Signals.radioStations(feature);
-	  if (feature.objs.containsKey(Obj.LIGHTS)) Signals.lights(feature);
+	  if (feature.objs.containsKey(Obj.FOGSIG)) fogSignals(feature);
+	  if (feature.objs.containsKey(Obj.RTPBCN)) radarStations(feature);
+	  if (feature.objs.containsKey(Obj.RADSTA)) radarStations(feature);
+	  if (feature.objs.containsKey(Obj.RDOSTA)) radioStations(feature);
+	  if (feature.objs.containsKey(Obj.LIGHTS)) lights(feature);
 	}
 	
@@ -41,49 +40,80 @@
 	public static void radarStations(Feature feature) {
 		Renderer.symbol(feature, Beacons.RadarStation);
+		String bstr = "";
+		CatRTB cat = (CatRTB) Rules.getAttVal(feature, Obj.RTPBCN, 0, Att.CATRTB);
+		switch (cat) {
+		case RTB_RAMK:
+			bstr += " Ramark";
+			break;
+		case RTB_RACN:
+			bstr += " Racon";
+			String astr = (String) Rules.getAttVal(feature, Obj.RTPBCN, 0, Att.SIGGRP);
+			if (!astr.isEmpty()) {
+				bstr += "(" + astr + ")";
+			}
+			Double per = (Double) Rules.getAttVal(feature, Obj.RTPBCN, 0, Att.SIGPER);
+			Double mxr = (Double) Rules.getAttVal(feature, Obj.RTPBCN, 0, Att.VALMXR);
+			if ((per != 0) || (mxr != 0)) {
+				bstr += (astr.isEmpty() ? " " : "");
+				bstr += (per != 0) ? per.toString() + "s" : "";
+				bstr += (mxr != 0) ? mxr.toString() + "M" : "";
+			}
+			break;
+		default:
+			break;
+		}
+		if ((Renderer.zoom >= 15) && !bstr.isEmpty()) {
+			Renderer.labelText(feature, bstr, new Font("Arial", Font.PLAIN, 40), LabelStyle.NONE, Color.black, null, new Delta(Handle.BR, AffineTransform.getTranslateInstance(-30, -30)));
+		}
+	}
+
+	public static void radioStations(Feature feature) {
+		Renderer.symbol(feature, Beacons.RadarStation);
 		ArrayList<CatROS> cats = (ArrayList<CatROS>)Rules.getAttVal(feature, Obj.RDOSTA, 0, Att.CATROS);
-		String str = "";
+		boolean vais = false;
+		String bstr = "";
 		for (CatROS ros : cats) {
 			switch (ros) {
 			case ROS_OMNI:
-				str += " RC";
+				bstr += " RC";
 				break;
 			case ROS_DIRL:
-				str += " RD";
+				bstr += " RD";
 				break;
 			case ROS_ROTP:
-				str += " RW";
+				bstr += " RW";
 				break;
 			case ROS_CNSL:
-				str += " Consol";
+				bstr += " Consol";
 				break;
 			case ROS_RDF:
-				str += " RG";
+				bstr += " RG";
 				break;
 			case ROS_QTA:
-				str += " R";
+				bstr += " R";
 				break;
 			case ROS_AERO:
-				str += " AeroRC";
+				bstr += " AeroRC";
 				break;
 			case ROS_DECA:
-				str += " Decca";
+				bstr += " Decca";
 				break;
 			case ROS_LORN:
-				str += " Loran";
+				bstr += " Loran";
 				break;
 			case ROS_DGPS:
-				str += " DGPS";
+				bstr += " DGPS";
 				break;
 			case ROS_TORN:
-				str += " Toran";
+				bstr += " Toran";
 				break;
 			case ROS_OMGA:
-				str += " Omega";
+				bstr += " Omega";
 				break;
 			case ROS_SYLD:
-				str += " Syledis";
+				bstr += " Syledis";
 				break;
 			case ROS_CHKA:
-				str += " Chiaka";
+				bstr += " Chiaka";
 				break;
 			case ROS_PCOM:
@@ -94,47 +124,47 @@
 			case ROS_PAIS:
 			case ROS_SAIS:
-				str += " AIS";
+				bstr += " AIS";
 				break;
 			case ROS_VAIS:
-				Renderer.labelText(feature, " V-AIS", new Font("Arial", Font.PLAIN, 40), LabelStyle.NONE, Color.black, null, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, 70)));
+				vais = true;
 				break;
 			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)));
+				vais = true;
 				Renderer.symbol(feature, Topmarks.TopNorth, 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)));
+				vais = true;
 				Renderer.symbol(feature, Topmarks.TopSouth, 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)));
+				vais = true;
 				Renderer.symbol(feature, Topmarks.TopEast, 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)));
+				vais = true;
 				Renderer.symbol(feature, Topmarks.TopWest, 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)));
+				vais = true;
 				Renderer.symbol(feature, Topmarks.TopCan, 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)));
+				vais = true;
 				Renderer.symbol(feature, Topmarks.TopCone, 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)));
+				vais = true;
 				Renderer.symbol(feature, Topmarks.TopIsol, 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)));
+				vais = true;
 				Renderer.symbol(feature, Topmarks.TopSphere, 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)));
+				vais = true;
 				Renderer.symbol(feature, Topmarks.TopX, 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)));
+				vais = true;
 				Renderer.symbol(feature, Topmarks.TopCross, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, -25)));
 				break;
@@ -143,9 +173,12 @@
 			}
 		}
-		if (!str.isEmpty()) Renderer.labelText(feature, str, new Font("Arial", Font.PLAIN, 40), LabelStyle.NONE, Color.black, null, new Delta(Handle.BR, AffineTransform.getTranslateInstance(-30, -70)));
-	}
-
-	public static void radioStations(Feature feature) {
-		
+		if (Renderer.zoom >= 15) {
+			if (vais) {
+				Renderer.labelText(feature, "V-AIS", new Font("Arial", Font.PLAIN, 40), LabelStyle.NONE, Color.black, null, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, 70)));
+			}
+			if (!bstr.isEmpty()) {
+				Renderer.labelText(feature, bstr, new Font("Arial", Font.PLAIN, 40), LabelStyle.NONE, Color.black, null, new Delta(Handle.BR, AffineTransform.getTranslateInstance(-30, -70)));
+			}
+		}
 	}
 
@@ -334,18 +367,4 @@
         if ((att = getAtt(obj, CATFOG)) != NULL)
           strcat(string1, fog_signals[att->val.val.e]);
-        if ((att = getAtt(obj, SIGGRP)) != NULL)
-          sprintf(strchr(string1, 0), "(%s)", stringValue(att->val));
-        else 
-          strcat(string1, " ");
-        if ((att = getAtt(obj, SIGPER)) != NULL)
-          sprintf(strchr(string1, 0), "%ss ", stringValue(att->val));
-        if ((att = getAtt(obj, VALMXR)) != NULL)
-          sprintf(strchr(string1, 0), "%sM", stringValue(att->val));
-      }
-      break;
-    case RTPBCN:
-      if (obj != NULL) {
-        if ((att = getAtt(obj, CATRTB)) != NULL)
-          strcat(string1, rtb_map[att->val.val.e]);
         if ((att = getAtt(obj, SIGGRP)) != NULL)
           sprintf(strchr(string1, 0), "(%s)", stringValue(att->val));
Index: /applications/editors/josm/plugins/smed2/src/smed2/MapImage.java
===================================================================
--- /applications/editors/josm/plugins/smed2/src/smed2/MapImage.java	(revision 30122)
+++ /applications/editors/josm/plugins/smed2/src/smed2/MapImage.java	(revision 30123)
@@ -92,5 +92,5 @@
 			width = Main.map.mapView.getBounds().getWidth();
 			height = Main.map.mapView.getBounds().getHeight();
-			zoom = ((int) Math.min(18, Math.max(9, Math.round(Math.floor(Math.log(4096 / bounds.asRect().width) / Math.log(2))))));
+			zoom = ((int) Math.min(18, Math.max(9, Math.round(Math.floor(Math.log(1024 / bounds.asRect().height) / Math.log(2))))));
 		}
 	}
