Index: /applications/editors/josm/plugins/smed2/src/seamap/Renderer.java
===================================================================
--- /applications/editors/josm/plugins/smed2/src/seamap/Renderer.java	(revision 29788)
+++ /applications/editors/josm/plugins/smed2/src/seamap/Renderer.java	(revision 29789)
@@ -228,5 +228,5 @@
 	}
 	
-	public static void lineText (Feature feature, String str, Font font, double offset, double dy) {
+	public static void lineText (Feature feature, String str, Font font, Color colour, double offset, double dy) {
 		
 	}
Index: /applications/editors/josm/plugins/smed2/src/seamap/Rules.java
===================================================================
--- /applications/editors/josm/plugins/smed2/src/seamap/Rules.java	(revision 29788)
+++ /applications/editors/josm/plugins/smed2/src/seamap/Rules.java	(revision 29789)
@@ -293,5 +293,5 @@
 			break;
 		case BOYINB:
-			Renderer.symbol(feature, Buoys.Storage, feature.type, null);
+			Renderer.symbol(feature, Buoys.Super, feature.type, null);
 			break;
 		}
@@ -710,16 +710,13 @@
 	}
 	private static void platforms(Feature feature) {
-		Renderer.symbol(feature, Landmarks.Platform, null, null);
+		ArrayList<CatOFP> cats = (ArrayList<CatOFP>)Renderer.getAttVal(feature, Obj.OFSPLF, 0, Att.CATOFP);
+		if ((CatOFP) cats.get(0) == CatOFP.OFP_FPSO)
+			Renderer.symbol(feature, Buoys.Storage, null, null);
+		else
+			Renderer.symbol(feature, Landmarks.Platform, null, null);
+		AttItem name = feature.atts.get(Att.OBJNAM);
+		if ((zoom >= 15) && (name != null))
+			Renderer.labelText(feature, (String) name.val, new Font("Arial", Font.BOLD, 80), Color.black, new Delta(Handle.BC, AffineTransform.getTranslateInstance(60, -50)));
 /*object_rules(platforms) {
-  if (has_attribute("category")) {
-    attribute_switch("category")
-    attribute_case("fpso") symbol("storage");
-    attribute_default symbol("platform");
-    end_switch
-  } else {
-    symbol("platform");
-  }
-  if ((zoom >= 15) && has_item_attribute("name"))
-    text(item_attribute("name"), "font-family:Arial; font-weight:bold; font-size:80; text-anchor:start", 60, -50);
   if (has_object("fog_signal")) object(fogs);
   if (has_object("radar_transponder")) object(rtbs);
@@ -729,18 +726,17 @@
 	}
 	private static void ports(Feature feature) {
-/*object_rules(ports) {
-  if (zoom>=14) {
-    if (is_type("crane")) {
-      if (attribute_test("category", "container_crane")) symbol("container_crane");
-      else symbol("port_crane");
-    }
-    if (is_type("hulk")) {
-      area("fill:#ffe000;fill-opacity:1;stroke:#000000;stroke-width:2;stroke-opacity:1");
-      if ((zoom >= 15) && (has_item_attribute("name")))
-        text(item_attribute("name"), "font-family:Arial; font-weight:bold; font-size:70; text-anchor:middle", 0, 0);
-    }
-  }
-}
-*/
+		if (zoom >= 14) {
+			if (feature.type == Obj.CRANES) {
+				if ((CatCRN) Renderer.getAttVal(feature, feature.type, 0, Att.CATCRN) == CatCRN.CRN_CONT)
+					Renderer.symbol(feature, Harbours.ContainerCrane, null, null);
+				else
+					Renderer.symbol(feature, Harbours.PortCrane, null, null);
+			} else if (feature.type == Obj.HULKES) {
+				Renderer.lineVector(feature, new LineStyle(Color.black, 4, null, new Color(0xffe000)));
+				AttItem name = feature.atts.get(Att.OBJNAM);
+				if ((zoom >= 15) && (name != null))
+					Renderer.labelText(feature, (String) name.val, new Font("Arial", Font.BOLD, 80), Color.black, null);
+			}
+		}
 	}
 	private static void separation(Feature feature) {
@@ -779,10 +775,10 @@
 					Renderer.lineVector(feature, new LineStyle(Color.black, 10, new float[] { 40, 40 }, null));
 					if (zoom >= 15)
-						Renderer.lineText(feature, "(covers)", new Font("Arial", Font.PLAIN, 80), 0.5, 20);
+						Renderer.lineText(feature, "(covers)", new Font("Arial", Font.PLAIN, 80), Color.black, 0.5, 20);
 				} else {
 					Renderer.lineVector(feature, new LineStyle(Color.black, 10, null, null));
 				}
 				if (zoom >= 15)
-					Renderer.lineText(feature, "Training Wall", new Font("Arial", Font.PLAIN, 80), 0.5, -20);
+					Renderer.lineText(feature, "Training Wall", new Font("Arial", Font.PLAIN, 80), Color.black, 0.5, -20);
 			}
 		}
@@ -799,47 +795,48 @@
 				Renderer.symbol(feature, Beacons.RadarStation, null, null);
 				ArrayList<CatROS> cats = (ArrayList<CatROS>)Renderer.getAttVal(feature, Obj.RDOSTA, 0, Att.CATROS);
+				String str = "";
 				for (CatROS ros : cats) {
 					switch (ros) {
 					case ROS_OMNI:
-						Renderer.labelText(feature, " RC", new Font("Arial", Font.PLAIN, 70), Color.black, new Delta(Handle.BR, AffineTransform.getTranslateInstance(-30, -180)));
+						str += " RC";
 						break;
 					case ROS_DIRL:
-						Renderer.labelText(feature, " RD", new Font("Arial", Font.PLAIN, 70), Color.black, new Delta(Handle.BR, AffineTransform.getTranslateInstance(-30, -180)));
+						str += " RD";
 						break;
 					case ROS_ROTP:
-						Renderer.labelText(feature, " RW", new Font("Arial", Font.PLAIN, 70), Color.black, new Delta(Handle.BR, AffineTransform.getTranslateInstance(-30, -180)));
+						str += " RW";
 						break;
 					case ROS_CNSL:
-						Renderer.labelText(feature, " Consol", new Font("Arial", Font.PLAIN, 70), Color.black, new Delta(Handle.BR, AffineTransform.getTranslateInstance(-30, -180)));
+						str += " Consol";
 						break;
 					case ROS_RDF:
-						Renderer.labelText(feature, " RG", new Font("Arial", Font.PLAIN, 70), Color.black, new Delta(Handle.BR, AffineTransform.getTranslateInstance(-30, -180)));
+						str += " RG";
 						break;
 					case ROS_QTA:
-						Renderer.labelText(feature, " R", new Font("Arial", Font.PLAIN, 70), Color.black, new Delta(Handle.BR, AffineTransform.getTranslateInstance(-30, -180)));
+						str += " R";
 						break;
 					case ROS_AERO:
-						Renderer.labelText(feature, " AeroRC", new Font("Arial", Font.PLAIN, 70), Color.black, new Delta(Handle.BR, AffineTransform.getTranslateInstance(-30, -180)));
+						str += " AeroRC";
 						break;
 					case ROS_DECA:
-						Renderer.labelText(feature, " Decca", new Font("Arial", Font.PLAIN, 70), Color.black, new Delta(Handle.BR, AffineTransform.getTranslateInstance(-30, -180)));
+						str += " Decca";
 						break;
 					case ROS_LORN:
-						Renderer.labelText(feature, " Loran", new Font("Arial", Font.PLAIN, 70), Color.black, new Delta(Handle.BR, AffineTransform.getTranslateInstance(-30, -180)));
+						str += " Loran";
 						break;
 					case ROS_DGPS:
-						Renderer.labelText(feature, " DGPS", new Font("Arial", Font.PLAIN, 70), Color.black, new Delta(Handle.BR, AffineTransform.getTranslateInstance(-30, -180)));
+						str += " DGPS";
 						break;
 					case ROS_TORN:
-						Renderer.labelText(feature, " Toran", new Font("Arial", Font.PLAIN, 70), Color.black, new Delta(Handle.BR, AffineTransform.getTranslateInstance(-30, -180)));
+						str += " Toran";
 						break;
 					case ROS_OMGA:
-						Renderer.labelText(feature, " Omega", new Font("Arial", Font.PLAIN, 70), Color.black, new Delta(Handle.BR, AffineTransform.getTranslateInstance(-30, -180)));
+						str += " Omega";
 						break;
 					case ROS_SYLD:
-						Renderer.labelText(feature, " Syledis", new Font("Arial", Font.PLAIN, 70), Color.black, new Delta(Handle.BR, AffineTransform.getTranslateInstance(-30, -180)));
+						str += " Syledis";
 						break;
 					case ROS_CHKA:
-						Renderer.labelText(feature, " Chiaka", new Font("Arial", Font.PLAIN, 70), Color.black, new Delta(Handle.BR, AffineTransform.getTranslateInstance(-30, -180)));
+						str += " Chiaka";
 						break;
 					case ROS_PCOM:
@@ -850,5 +847,5 @@
 					case ROS_PAIS:
 					case ROS_SAIS:
-						Renderer.labelText(feature, " AIS", new Font("Arial", Font.PLAIN, 70), Color.black, new Delta(Handle.BR, AffineTransform.getTranslateInstance(-30, -180)));
+						str += " AIS";
 						break;
 					case ROS_VAIS:
@@ -897,4 +894,5 @@
 					}
 				}
+				if (!str.isEmpty()) Renderer.labelText(feature, str, new Font("Arial", Font.PLAIN, 70), Color.black, new Delta(Handle.BR, AffineTransform.getTranslateInstance(-30, -180)));
 				break;
 			case RADSTA:
@@ -920,35 +918,18 @@
 	}
 	private static void transits(Feature feature) {
-/*object_rules(transits) {
-  int ref;
-  if (zoom >= 12) {
-    if (is_type("recommended_track")) ref = line("stroke-width:8; stroke:#000000; stroke-linecap:butt; fill:none");
-    else if (is_type("navigation_line")) ref = line("stroke-width:8; stroke-dasharray:20,20; stroke:#000000; stroke-linecap:butt; fill:none");
-  }
-  if (zoom >= 15) {
-    make_string("");
-    if (has_object("name")) {
-      add_string(item_attribute("name"));
-      add_string(" ");
-    }
-    if (has_attribute("orientation")) {
-      add_string(attribute("orientation"));
-      add_string("\u00A1");
-    }
-    if (has_attribute("category")) {
-      add_string(" (");
-      add_string(attribute("category"));
-      add_string(")");
-    }
-    line_text(string, "font-family:Arial; font-weight:normal; font-size:80; text-anchor:middle", 0.5, -20, ref);
-    free_string
-  }
-}
-*/
+	  if (zoom >= 12) {
+	  	if (feature.type == Obj.RECTRC) Renderer.lineVector (feature, new LineStyle(Color.black, 10, null, null));
+	  	else if (feature.type == Obj.NAVLNE) Renderer.lineVector (feature, new LineStyle(Color.black, 10, new float[] { 25, 25 }, null));
+	  }
+	  if (zoom >= 15) {
+	  	String str = "";
+			AttItem name = feature.atts.get(Att.OBJNAM);
+			if (name != null) str += (String)name.val + " ";
+			Double ort = (Double) Renderer.getAttVal(feature, feature.type, 0, Att.ORIENT);
+			if (ort != null) str += ort.toString() + "¼";
+			if (!str.isEmpty()) Renderer.lineText(feature, str, new Font("Arial", Font.PLAIN, 80), Color.black, 0.5, -20);
+	  }
 	}
 	private static void waterways(Feature feature) {
-		if ((zoom >= 14) && (feature.atts.get(Att.OBJNAM) != null)) {
-			// lineText(item_attribute("name"), "font-family:Arial;font-weight:bold;font-size:80;text-anchor:middle", 0.5, 15, line("stroke:none;fill:none"));
-		}
 	}
 	private static void wrecks(Feature feature) {
@@ -966,6 +947,4 @@
 				Renderer.symbol(feature, Areas.WreckND, null, null);
 			}
-		} else {
-			Renderer.symbol(feature, Areas.WreckND, null, null);
 		}
 	}
Index: /applications/editors/josm/plugins/smed2/src/symbols/Harbours.java
===================================================================
--- /applications/editors/josm/plugins/smed2/src/symbols/Harbours.java	(revision 29788)
+++ /applications/editors/josm/plugins/smed2/src/symbols/Harbours.java	(revision 29789)
@@ -28,12 +28,4 @@
 		p.lineTo(-31.0,22.0); p.quadTo(-21.0,29.0,-7.0,31.0); p.lineTo(-6.0,-30.0); p.lineTo(-23.0,-30.0); p.lineTo(-23.0,-40.0); p.closePath();
 		Anchor.add(new Instr(Prim.PGON, p));
-	}
-	public static final Symbol Yacht = new Symbol();
-	static {
-		Yacht.add(new Instr(Prim.STRK, new BasicStroke(4, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)));
-		Path2D.Double p = new Path2D.Double(); p.moveTo(-65.0,50.0); p.curveTo(-36.0,97.0,36.0,97.0,65.0,50.0); p.lineTo(3.0,50.0); p.lineTo(3.0,40.0); p.lineTo(55.0,30.0);
-		p.curveTo(32.0,4.0,25.0,-15.0,26.0,-52.0); p.lineTo(1.5,-40.0); p.lineTo(1.0,-64.0); p.lineTo(-2.0,-64.0); p.lineTo(-4.0,50.0); p.closePath();
-		p.moveTo(-50.0,45.0); p.curveTo(-55.0,3.0,-37.0,-28.5,-7.0,-46.0); p.curveTo(-28.0,-15.0,-26.0,11.0,-20.5,30.0); p.closePath();
-		Yacht.add(new Instr(Prim.PGON, p));
 	}
 	public static final Symbol Anchorage = new Symbol();
@@ -193,3 +185,11 @@
 		TideGauge.add(new Instr(Prim.LINE, new Line2D.Double(-15,-65,15,-65)));
 	}
+	public static final Symbol Yacht = new Symbol();
+	static {
+		Yacht.add(new Instr(Prim.STRK, new BasicStroke(4, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)));
+		Path2D.Double p = new Path2D.Double(); p.moveTo(-65.0,50.0); p.curveTo(-36.0,97.0,36.0,97.0,65.0,50.0); p.lineTo(3.0,50.0); p.lineTo(3.0,40.0); p.lineTo(55.0,30.0);
+		p.curveTo(32.0,4.0,25.0,-15.0,26.0,-52.0); p.lineTo(1.5,-40.0); p.lineTo(1.0,-64.0); p.lineTo(-2.0,-64.0); p.lineTo(-4.0,50.0); p.closePath();
+		p.moveTo(-50.0,45.0); p.curveTo(-55.0,3.0,-37.0,-28.5,-7.0,-46.0); p.curveTo(-28.0,-15.0,-26.0,11.0,-20.5,30.0); p.closePath();
+		Yacht.add(new Instr(Prim.PGON, p));
+	}
 }
