Index: /applications/editors/josm/plugins/smed2/src/seamap/Renderer.java
===================================================================
--- /applications/editors/josm/plugins/smed2/src/seamap/Renderer.java	(revision 29184)
+++ /applications/editors/josm/plugins/smed2/src/seamap/Renderer.java	(revision 29185)
@@ -54,5 +54,5 @@
 	public static Object getAttVal(Feature feature, Obj obj, int idx, Att att) {
 		AttMap atts = getAtts(feature, obj, idx);
-		if (atts == null) return  S57val.nullVal(att);
+		if (atts == null) return S57val.nullVal(att);
 		else {
 			AttItem item = atts.get(att);
@@ -62,30 +62,50 @@
 	}
 
+	public static double calcArea(Feature feature) {
+	  if (feature.flag == Fflag.AREA) {
+			ArrayList<Long> way = map.ways.get(feature.refs);
+			Coord coord = map.nodes.get(way.get(0));
+	    double llat = coord.lat;
+	    double llon = coord.lon;
+	    double area = 0.0;
+			for (long node : way) {
+				coord = map.nodes.get(node);
+	      area += ((llon * coord.lat) - (llat * coord.lon));
+	      llat = coord.lat;
+	      llon = coord.lon;
+	    }
+	    return Math.abs(area) / 2.0 * 60.0 * 60.0;
+	  }
+	  return 0.0;
+	}
+
 	public static Coord findCentroid(Feature feature) {
+		Coord coord;
+		ArrayList<Long> way = map.ways.get(feature.refs);
+		switch (feature.flag) {
+		case NODE:
+			return map.nodes.get(feature.refs);
+		case WAY:
+			coord = map.nodes.get(way.get(1));
+			break;
+		case AREA:
+		default:
+			coord = map.nodes.get(way.get(0));
+		}
+    double slat = 0.0;
     double slon = 0.0;
-    double slat = 0.0;
     double sarc = 0.0;
-    double llon = 0.0;
-    double llat = 0.0;
-		if (feature.flag == Fflag.NODE) {
-			return map.nodes.get(feature.refs);
-		}
-		ArrayList<Long> way = map.ways.get(feature.refs);
-		if (feature.flag == Fflag.WAY) {
-			llon = map.nodes.get(way.get(1)).lon;
-			llat = map.nodes.get(way.get(1)).lat;
-		} else {
-			llon = map.nodes.get(way.get(0)).lon;
-			llat = map.nodes.get(way.get(0)).lat;
-		}
+    double llat = coord.lat;
+    double llon = coord.lon;
 		for (long node : way) {
-      double lon = map.nodes.get(node).lon;
-      double lat = map.nodes.get(node).lat;
+			coord = map.nodes.get(node);
+      double lon = coord.lon;
+      double lat = coord.lat;
       double arc = Math.sqrt(Math.pow((lon-llon), 2) + Math.pow((lat-llat), 2));
+      slat += (lat * arc);
       slon += (lon * arc);
-      slat += (lat * arc);
       sarc += arc;
+      llat = lat;
       llon = lon;
-      llat = lat;
 		}
 		return map.new Coord((sarc > 0.0 ? slat/sarc : 0.0), (sarc > 0.0 ? slon/sarc : 0.0));
Index: /applications/editors/josm/plugins/smed2/src/seamap/Rules.java
===================================================================
--- /applications/editors/josm/plugins/smed2/src/seamap/Rules.java	(revision 29184)
+++ /applications/editors/josm/plugins/smed2/src/seamap/Rules.java	(revision 29185)
@@ -123,5 +123,6 @@
 			ArrayList<Instr> fncSym = Landmarks.Funcs.get(fncs.get(0));
 			if ((fncs.get(0) == FncFNC.FNC_CHCH) && (cats.get(0) == CatLMK.LMK_TOWR)) catSym = Landmarks.ChurchTower;
-			if ((cats.get(0) == CatLMK.LMK_UNKN) && (fncs.get(0) == FncFNC.FNC_UNKN)) catSym = Beacons.LightMajor;
+			if ((cats.get(0) == CatLMK.LMK_UNKN) && (fncs.get(0) == FncFNC.FNC_UNKN) && (feature.objs.get(Obj.LIGHTS) != null)) catSym = Beacons.LightMajor;
+			if (cats.get(0) == CatLMK.LMK_RADR) fncSym = Landmarks.RadioTV;
 			Renderer.symbol(feature, catSym, feature.type);
 			Renderer.symbol(feature, fncSym, feature.type);
Index: /applications/editors/josm/plugins/smed2/src/symbols/Beacons.java
===================================================================
--- /applications/editors/josm/plugins/smed2/src/symbols/Beacons.java	(revision 29184)
+++ /applications/editors/josm/plugins/smed2/src/symbols/Beacons.java	(revision 29185)
@@ -12,4 +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;
@@ -61,4 +62,23 @@
 		Cairn.add(new Instr(Prim.ELPS, new Ellipse2D.Double(-18,-70,36,36)));
 	}
+	public static final ArrayList<Instr> FogSignal = new ArrayList<Instr>();
+	static {
+		FogSignal.add(new Instr(Prim.STRK, new BasicStroke(3.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND)));
+		FogSignal.add(new Instr(Prim.FILL, Color.black));
+		FogSignal.add(new Instr(Prim.ELPS, new Ellipse2D.Double(-10,-10,20,20)));
+		FogSignal.add(new Instr(Prim.STRK, new BasicStroke(10.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND)));
+		FogSignal.add(new Instr(Prim.FILL, new Color(0xd400d4)));
+		FogSignal.add(new Instr(Prim.EARC, new Arc2D.Double(-120.0,-120.0,240.0,240.0,190.0,50.0,Arc2D.OPEN)));
+		FogSignal.add(new Instr(Prim.EARC, new Arc2D.Double(-92.5,-92.5,185.0,185.0,190.0,50.0,Arc2D.OPEN)));
+		FogSignal.add(new Instr(Prim.EARC, new Arc2D.Double(-65.0,-65.0,130.0,130.0,190.0,50.0,Arc2D.OPEN)));
+	}
+	public static final ArrayList<Instr> LightFlare = new ArrayList<Instr>();
+	static {
+		LightFlare.add(new Instr(Prim.RSHP, new Ellipse2D.Double(-3,-3,6,6)));
+		Path2D.Double p = new Path2D.Double();
+		p.moveTo(0.0,-25.0); p.lineTo(15.0,-95.0); p.curveTo(20.0,-123.0,-20.0,-123.0,-15.0,-95.0);
+		p.closePath();
+		LightFlare.add(new Instr(Prim.PGON, p));
+	}
 	public static final ArrayList<Instr> LightMajor = new ArrayList<Instr>();
 	static {
@@ -95,4 +115,10 @@
 		PerchStarboard.add(new Instr(Prim.LINE, new Line2D.Double(-25,-40,0,-68.7)));
 	}
+	public static final ArrayList<Instr> RadarStation = new ArrayList<Instr>();
+	static {
+		RadarStation.add(new Instr(Prim.STRK, new BasicStroke(2.5f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND)));
+		RadarStation.add(new Instr(Prim.FILL, new Color(0xd400d4)));
+		RadarStation.add(new Instr(Prim.ELPS, new Ellipse2D.Double(-125,-125,250,250)));
+	}
 	public static final ArrayList<Instr> Stake = new ArrayList<Instr>();
 	static {
@@ -111,5 +137,5 @@
 		p = new Path2D.Double(); p.moveTo(-2.0,-17.5); p.lineTo(-2.0,-35.0); p.lineTo(2.0,-35.0); p.lineTo(2.0,-17.5); p.closePath();
 		colours.add(new Instr(Prim.H5, p));
-    Stake.add(new Instr(Prim.COLR, colours));
+		Stake.add(new Instr(Prim.COLR, colours));
 		Stake.add(new Instr(Prim.FILL, Color.black));
 		Stake.add(new Instr(Prim.LINE, new Line2D.Double(-10,0,10,0)));
Index: /applications/editors/josm/plugins/smed2/src/symbols/Landmarks.java
===================================================================
--- /applications/editors/josm/plugins/smed2/src/symbols/Landmarks.java	(revision 29184)
+++ /applications/editors/josm/plugins/smed2/src/symbols/Landmarks.java	(revision 29185)
@@ -122,14 +122,4 @@
 		Mast.add(new Instr(Prim.PLIN, p));
 	}
-	public static final ArrayList<Instr> RadioMast = new ArrayList<Instr>();
-	static {
-		RadioMast.add(new Instr(Prim.SYMB, new Symbols.Symbol(Landmarks.Mast, 1.0, 0, 0, null, null)));
-		RadioMast.add(new Instr(Prim.STRK, new BasicStroke(4.0f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_BEVEL)));
-		RadioMast.add(new Instr(Prim.FILL, Color.black));
-		RadioMast.add(new Instr(Prim.EARC, new Arc2D.Double(-30.0,-180.0,60.0,60.0,45.0,-90.0,Arc2D.OPEN)));
-		RadioMast.add(new Instr(Prim.EARC, new Arc2D.Double(-45.0,-195.0,90.0,90.0,45.0,-90.0,Arc2D.OPEN)));
-		RadioMast.add(new Instr(Prim.EARC, new Arc2D.Double(-30.0,-180.0,60.0,60.0,225.0,-90.0,Arc2D.OPEN)));
-		RadioMast.add(new Instr(Prim.EARC, new Arc2D.Double(-45.0,-195.0,90.0,90.0,225.0,-90.0,Arc2D.OPEN)));
-	}
 	public static final ArrayList<Instr> Monument = new ArrayList<Instr>();
 	static {
@@ -147,4 +137,13 @@
 		Platform.add(new Instr(Prim.RECT, new Rectangle2D.Double(-48,-48,96,96)));
 		Platform.add(new Instr(Prim.RSHP, new Ellipse2D.Double(-4,-4,8,8)));
+	}
+	public static final ArrayList<Instr> RadioTV = new ArrayList<Instr>();
+	static {
+		RadioTV.add(new Instr(Prim.STRK, new BasicStroke(4.0f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_BEVEL)));
+		RadioTV.add(new Instr(Prim.FILL, Color.black));
+		RadioTV.add(new Instr(Prim.EARC, new Arc2D.Double(-30.0,-180.0,60.0,60.0,45.0,-90.0,Arc2D.OPEN)));
+		RadioTV.add(new Instr(Prim.EARC, new Arc2D.Double(-45.0,-195.0,90.0,90.0,45.0,-90.0,Arc2D.OPEN)));
+		RadioTV.add(new Instr(Prim.EARC, new Arc2D.Double(-30.0,-180.0,60.0,60.0,225.0,-90.0,Arc2D.OPEN)));
+		RadioTV.add(new Instr(Prim.EARC, new Arc2D.Double(-45.0,-195.0,90.0,90.0,225.0,-90.0,Arc2D.OPEN)));
 	}
 	public static final ArrayList<Instr> Spire = new ArrayList<Instr>();
@@ -220,5 +219,5 @@
 		Shapes.put(CatLMK.LMK_CLMN, Landmarks.Monument); Shapes.put(CatLMK.LMK_MEML, Landmarks.Monument); Shapes.put(CatLMK.LMK_OBLK, Landmarks.Monument);
 		Shapes.put(CatLMK.LMK_STAT, Landmarks.Monument); Shapes.put(CatLMK.LMK_CROS, Landmarks.Cross); Shapes.put(CatLMK.LMK_DOME, Landmarks.Dome);
-		Shapes.put(CatLMK.LMK_RADR, Landmarks.RadioMast); Shapes.put(CatLMK.LMK_TOWR, Landmarks.LandTower); Shapes.put(CatLMK.LMK_WNDM, Landmarks.Windmill);
+		Shapes.put(CatLMK.LMK_RADR, Landmarks.Mast); Shapes.put(CatLMK.LMK_TOWR, Landmarks.LandTower); Shapes.put(CatLMK.LMK_WNDM, Landmarks.Windmill);
 		Shapes.put(CatLMK.LMK_WNDG, Landmarks.WindMotor); Shapes.put(CatLMK.LMK_SPIR, Landmarks.Spire); Shapes.put(CatLMK.LMK_BLDR, Beacons.Cairn);
 		Shapes.put(CatLMK.LMK_MNRT, Landmarks.Minaret); Shapes.put(CatLMK.LMK_WTRT, Landmarks.WaterTower);
@@ -229,7 +228,7 @@
 		Funcs.put(FncFNC.FNC_CHCH, Landmarks.Church); Funcs.put(FncFNC.FNC_CHPL, Landmarks.Church); Funcs.put(FncFNC.FNC_TMPL, Landmarks.Temple);
 		Funcs.put(FncFNC.FNC_PGDA, Landmarks.Temple); Funcs.put(FncFNC.FNC_SHSH, Landmarks.Temple); Funcs.put(FncFNC.FNC_BTMP, Landmarks.Temple);
-		Funcs.put(FncFNC.FNC_MOSQ, Landmarks.Minaret); Funcs.put(FncFNC.FNC_MRBT, Landmarks.Spire); Funcs.put(FncFNC.FNC_COMM, Landmarks.RadioMast);
-		Funcs.put(FncFNC.FNC_TV, Landmarks.RadioMast); Funcs.put(FncFNC.FNC_RADO, Landmarks.RadioMast); Funcs.put(FncFNC.FNC_RADR, Landmarks.RadioMast);
-		Funcs.put(FncFNC.FNC_LGHT, Beacons.LightMajor); Funcs.put(FncFNC.FNC_MCWV, Landmarks.RadioMast);
+		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);
 	}
 }
Index: /applications/editors/josm/plugins/smed2/src/symbols/Topmarks.java
===================================================================
--- /applications/editors/josm/plugins/smed2/src/symbols/Topmarks.java	(revision 29184)
+++ /applications/editors/josm/plugins/smed2/src/symbols/Topmarks.java	(revision 29185)
@@ -13,11 +13,13 @@
 import java.awt.Color;
 import java.awt.Rectangle;
+import java.awt.geom.AffineTransform;
 import java.awt.geom.Ellipse2D;
 import java.awt.geom.Line2D;
 import java.awt.geom.Path2D;
 import java.util.ArrayList;
-
-import symbols.Symbols.Instr;
-import symbols.Symbols.Prim;
+import java.util.EnumMap;
+
+import s57.S57val.*;
+import symbols.Symbols.*;
 
 public class Topmarks {
@@ -226,3 +228,17 @@
 		TopX.add(new Instr(Prim.PLIN, p));
 	}
+	
+	public static final EnumMap<BoySHP, Delta> Buoys = new EnumMap<BoySHP, Delta>(BoySHP.class);
+	static {
+		Buoys.put(BoySHP.BOY_PILR, new Delta(Handle.BC, new AffineTransform(0.948324, 0.317305, -0.3173047, 0.948324, 31.5, -95.0))); 
+		Buoys.put(BoySHP.BOY_SPAR, new Delta(Handle.BC, new AffineTransform(0.948324, 0.317305, -0.3173047, 0.948324, 31.5, -95.0))); 
+		Buoys.put(BoySHP.BOY_CAN, new Delta(Handle.BC, new AffineTransform(0.948324, 0.317305, -0.3173047, 0.948324, 12.7, -37.9))); 
+		Buoys.put(BoySHP.BOY_CONE, new Delta(Handle.BC, new AffineTransform(0.948324, 0.317305, -0.3173047, 0.948324, 12.7, -37.9))); 
+		Buoys.put(BoySHP.BOY_SPHR, new Delta(Handle.BC, new AffineTransform(0.948324, 0.317305, -0.3173047, 0.948324, 12.7, -37.9))); 
+		Buoys.put(BoySHP.BOY_BARL, new Delta(Handle.BC, new AffineTransform(0.948324, 0.317305, -0.3173047, 0.948324, 12.7, -37.9))); 
+		Buoys.put(BoySHP.BOY_SUPR, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0.0, -42.0))); 
+		Buoys.put(BoySHP.BOY_ICE, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0.0, -25.0))); 
+	}
+	public static final Delta Floats = new Delta(Handle.BC, AffineTransform.getTranslateInstance(0.0, -70.0));
+
 }
