Index: applications/editors/josm/plugins/smed2/src/seamap/Renderer.java
===================================================================
--- applications/editors/josm/plugins/smed2/src/seamap/Renderer.java	(revision 29198)
+++ applications/editors/josm/plugins/smed2/src/seamap/Renderer.java	(revision 29199)
@@ -10,6 +10,9 @@
 package seamap;
 
+import java.awt.BasicStroke;
 import java.awt.Graphics2D;
 import java.awt.RenderingHints;
+import java.awt.geom.GeneralPath;
+import java.awt.geom.Path2D;
 import java.awt.geom.Point2D;
 import java.util.ArrayList;
@@ -20,4 +23,5 @@
 import s57.S57val.*;
 import s57.S57val;
+import seamap.SeaMap;
 import seamap.SeaMap.*;
 import symbols.Symbols;
@@ -31,7 +35,9 @@
 	static double tScale;
 	static Graphics2D g2;
+	static int zoom;
 	
-	public static void reRender(Graphics2D g, int zoom, double factor, SeaMap m, MapHelper h) {
+	public static void reRender(Graphics2D g, int z, double factor, SeaMap m, MapHelper h) {
 		g2 = g;
+		zoom = z;
 		helper = h;
 		map = m;
@@ -115,7 +121,11 @@
 	public static void symbol(Feature feature, Symbol symbol, Obj obj, Delta delta) {
 		Point2D point = helper.getPoint(findCentroid(feature));
-		ArrayList<ColCOL> colours = (ArrayList<ColCOL>) getAttVal(feature, obj, 0, Att.COLOUR);
-		ArrayList<ColPAT> pattern = (ArrayList<ColPAT>) getAttVal(feature, obj, 0, Att.COLPAT);
-		Symbols.drawSymbol(g2, symbol, sScale, point.getX(), point.getY(), delta, new Scheme(pattern, colours));
+		if (obj == null) {
+			Symbols.drawSymbol(g2, symbol, sScale, point.getX(), point.getY(), delta, null);
+		} else {
+			ArrayList<ColCOL> colours = (ArrayList<ColCOL>) getAttVal(feature, obj, 0, Att.COLOUR);
+			ArrayList<ColPAT> pattern = (ArrayList<ColPAT>) getAttVal(feature, obj, 0, Att.COLPAT);
+			Symbols.drawSymbol(g2, symbol, sScale, point.getX(), point.getY(), delta, new Scheme(pattern, colours));
+		}
 	}
 	
@@ -131,5 +141,37 @@
 	
 	public static void lineVector (Feature feature, LineStyle style) {
-		
+		if (feature.flag != Fflag.NODE) {
+			ArrayList<Long> nodes = map.ways.get(feature.refs);
+			Path2D.Double p = new Path2D.Double();
+			p.setWindingRule(GeneralPath.WIND_NON_ZERO);
+			boolean first = true;
+			for (long node : nodes) {
+				Point2D point = helper.getPoint(map.nodes.get(node));
+				if (first) {
+					p.moveTo(point.getX(), point.getY());
+					first = false;
+				} else {
+					p.lineTo(point.getX(), point.getY());
+				}
+			}
+			if (style.line != null) {
+				if (style.dash != null) {
+					float[] dash = new float[style.dash.length];
+					System.arraycopy(style.dash, 0, dash, 0, style.dash.length);
+					for (int i = 0; i < style.dash.length; i++) {
+						dash[i] *= (float) (sScale);
+					}
+					g2.setStroke(new BasicStroke((float) (style.width * sScale), BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND, 1, dash, 0));
+				} else {
+					g2.setStroke(new BasicStroke((float) (style.width * sScale), BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND));
+				}
+				g2.setPaint(style.line);
+				g2.draw(p);
+			}
+			if (style.fill != null) {
+				g2.setPaint(style.fill);
+				g2.fill(p);
+			}
+		}
 	}
 	
Index: applications/editors/josm/plugins/smed2/src/seamap/Rules.java
===================================================================
--- applications/editors/josm/plugins/smed2/src/seamap/Rules.java	(revision 29198)
+++ applications/editors/josm/plugins/smed2/src/seamap/Rules.java	(revision 29199)
@@ -109,9 +109,9 @@
 				WatLEV lev = (WatLEV) Renderer.getAttVal(feature, feature.type, 0, Att.WATLEV);
 				if (lev == WatLEV.LEV_CVRS) {
-					Renderer.lineVector(feature, new LineStyle(new BasicStroke(10, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND, 1, new float[] { 40, 40 }, 0), Color.black, null));
+					Renderer.lineVector(feature, new LineStyle(Color.black, 10, new float[] { 40, 40 }, null));
 					if (zoom >= 15)
 						Renderer.lineText(feature, "(covers)", new TextStyle(new Font("Arial", Font.PLAIN, 80)), 0.5, new Delta(Handle.TC, AffineTransform.getTranslateInstance(0, 20)));
 				} else {
-					Renderer.lineVector(feature, new LineStyle(new BasicStroke(10, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND), Color.black, null));
+					Renderer.lineVector(feature, new LineStyle(Color.black, 10, null, null));
 				}
 				if (zoom >= 15)
@@ -144,7 +144,7 @@
 		case TSSRON:
 			if (zoom <= 15)
-				Renderer.lineVector(feature, new LineStyle(null, null, new Color(0x80c480ff, true)));
+				Renderer.lineVector(feature, new LineStyle(null, 0, null, new Color(0x80c480ff, true)));
 			else
-				Renderer.lineVector(feature, new LineStyle(new BasicStroke(20, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND), new Color(0x80c480ff, true), null));
+				Renderer.lineVector(feature, new LineStyle(new Color(0x80c480ff, true), 20, null, null));
 			AttItem name = feature.atts.get(Att.OBJNAM);
 			if ((zoom >= 10) && (name != null))
@@ -152,5 +152,5 @@
 			break;
 		case TSELNE:
-			Renderer.lineVector(feature, new LineStyle(new BasicStroke(20, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND), new Color(0x80c480ff, true), null));
+			Renderer.lineVector(feature, new LineStyle(new Color(0x80c480ff, true), 20, null, null));
 			break;
 		case TSSLPT:
@@ -158,5 +158,5 @@
 			break;
 		case TSSBND:
-			Renderer.lineVector(feature, new LineStyle(new BasicStroke(20, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND, 1, new float[] { 40, 40 }, 0), new Color(0x80c480ff, true), null));
+			Renderer.lineVector(feature, new LineStyle(new Color(0x80c480ff, true), 20, new float[] { 40, 40 }, null));
 			break;
 		}
@@ -177,22 +177,22 @@
 				Renderer.symbol(feature, Areas.MarineFarm, Obj.MARCUL, null);
 			if (zoom >= 16)
-				Renderer.lineVector(feature, new LineStyle(new BasicStroke(4, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND, 1, new float[] { 10, 10 }, 0), Color.black, null));
+				Renderer.lineVector(feature, new LineStyle( Color.black, 4, new float[] { 10, 10 }, null));
 			break;
 		case FAIRWY:
 			if (Renderer.calcArea(feature) > 2.0) {
 				if (zoom < 16)
-					Renderer.lineVector(feature, new LineStyle(new BasicStroke(8, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND, 1, new float[] { 50, 50 }, 0), new Color(0xc480ff), new Color(0x40ffffff, true)));
+					Renderer.lineVector(feature, new LineStyle(new Color(0xc480ff), 8, new float[] { 50, 50 }, new Color(0x40ffffff, true)));
 				else
-					Renderer.lineVector(feature, new LineStyle(new BasicStroke(8, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND, 1, new float[] { 50, 50 }, 0), new Color(0xc480ff), null));
+					Renderer.lineVector(feature, new LineStyle(new Color(0xc480ff), 8, new float[] { 50, 50 }, null));
 			} else {
 				if (zoom >= 14)
-					Renderer.lineVector(feature, new LineStyle(null, null, new Color(0x40ffffff, true)));
+					Renderer.lineVector(feature, new LineStyle(new Color(0x40ffffff, true), 0, null, null));
 			}
 			break;
 		case DRGARE:
 			if (zoom < 16)
-				Renderer.lineVector(feature, new LineStyle(new BasicStroke(8, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND, 1, new float[] { 25, 25 }, 0), Color.black, new Color(0x40ffffff, true)));
+				Renderer.lineVector(feature, new LineStyle(Color.black, 8, new float[] { 25, 25 }, new Color(0x40ffffff, true)));
 			else
-				Renderer.lineVector(feature, new LineStyle(new BasicStroke(8, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND, 1, new float[] { 25, 25 }, 0), Color.black, null));
+				Renderer.lineVector(feature, new LineStyle(Color.black, 8, new float[] { 25, 25 }, null));
 			if ((zoom >= 12) && (name != null))
 				Renderer.labelText(feature, (String) name.val, new TextStyle(new Font("Arial", Font.PLAIN, 100)), new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, 0)));
@@ -208,5 +208,5 @@
 			if ((CatPRA)Renderer.getAttVal(feature, feature.type, 0, Att.CATPRA) == CatPRA.PRA_WFRM) {
 				Renderer.symbol(feature, Areas.WindFarm, Obj.OSPARE, null);
-				Renderer.lineVector(feature, new LineStyle(new BasicStroke(20, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND, 1, new float[] { 40, 40 }, 0), Color.black, null));
+				Renderer.lineVector(feature, new LineStyle(Color.black, 20, new float[] { 40, 40 }, null));
 				if ((zoom >= 15) && (name != null))
 					Renderer.labelText(feature, (String) name.val, new TextStyle(new Font("Arial", Font.BOLD, 80)), new Delta(Handle.TC, AffineTransform.getTranslateInstance(0, 10)));
@@ -261,14 +261,14 @@
 			switch (lvl) {
 			case LEV_CVRS:
-				Renderer.symbol(feature, Areas.RockC, feature.type, null);
+				Renderer.symbol(feature, Areas.RockC, null, null);
 				break;
 			case LEV_AWSH:
-				Renderer.symbol(feature, Areas.RockA, feature.type, null);
+				Renderer.symbol(feature, Areas.RockA, null, null);
 				break;
 			default:
-				Renderer.symbol(feature, Areas.Rock, feature.type, null);
+				Renderer.symbol(feature, Areas.Rock, null, null);
 			}
 		} else {
-			Renderer.symbol(feature, Areas.Rock, feature.type, null);
+			Renderer.symbol(feature, Areas.Rock, null, null);
 		}
 	}
@@ -299,6 +299,6 @@
 		if (cats.get(0) == CatLMK.LMK_RADR)
 			fncSym = Landmarks.RadioTV;
-		Renderer.symbol(feature, catSym, feature.type, null);
-		Renderer.symbol(feature, fncSym, feature.type, null);
+		Renderer.symbol(feature, catSym, null, null);
+		Renderer.symbol(feature, fncSym, null, null);
 	}
 	private static void moorings(Feature feature) {
@@ -306,12 +306,12 @@
 		switch (cat) {
 		case MOR_DLPN:
-			Renderer.symbol(feature, Harbours.Dolphin, feature.type, null);
+			Renderer.symbol(feature, Harbours.Dolphin, null, null);
 			break;
 		case MOR_DDPN:
-			Renderer.symbol(feature, Harbours.DeviationDolphin, feature.type, null);
+			Renderer.symbol(feature, Harbours.DeviationDolphin, null, null);
 			break;
 		case MOR_BLRD:
 		case MOR_POST:
-			Renderer.symbol(feature, Harbours.Bollard, feature.type, null);
+			Renderer.symbol(feature, Harbours.Bollard, null, null);
 			break;
 		case MOR_BUOY:
@@ -335,14 +335,14 @@
 			case WRK_DNGR:
 			case WRK_MSTS:
-				Renderer.symbol(feature, Areas.WreckD, feature.type, null);
+				Renderer.symbol(feature, Areas.WreckD, null, null);
 				break;
 			case WRK_HULS:
-				Renderer.symbol(feature, Areas.WreckS, feature.type, null);
+				Renderer.symbol(feature, Areas.WreckS, null, null);
 				break;
 			default:
-				Renderer.symbol(feature, Areas.WreckND, feature.type, null);
+				Renderer.symbol(feature, Areas.WreckND, null, null);
 			}
 		} else {
-			Renderer.symbol(feature, Areas.WreckND, feature.type, null);
+			Renderer.symbol(feature, Areas.WreckND, null, null);
 		}
 	}
@@ -352,9 +352,9 @@
 		switch (feature.type) {
 		case LITMAJ:
-			Renderer.symbol(feature, Beacons.LightMajor, feature.type, null);
+			Renderer.symbol(feature, Beacons.LightMajor, null, null);
 			break;
 		case LITMIN:
 		case LIGHTS:
-			Renderer.symbol(feature, Beacons.LightMinor, feature.type, null);
+			Renderer.symbol(feature, Beacons.LightMinor, null, null);
 			break;
 		}
@@ -364,20 +364,21 @@
 		case SISTAT:
 		case SISTAW:
-			Renderer.symbol(feature, Harbours.SignalStation, feature.type, null);
+			Renderer.symbol(feature, Harbours.SignalStation, null, null);
 			break;
 		case RDOSTA:
-			Renderer.symbol(feature, Harbours.SignalStation, feature.type, null);
+			Renderer.symbol(feature, Harbours.SignalStation, null, null);
 			break;
 		case RADSTA:
-			Renderer.symbol(feature, Harbours.SignalStation, feature.type, null);
+			Renderer.symbol(feature, Harbours.SignalStation, null, null);
+			Renderer.symbol(feature, Beacons.RadarStation, null, null);
 			break;
 		case PILBOP:
-			Renderer.symbol(feature, Harbours.SignalStation, feature.type, null);
+			Renderer.symbol(feature, Harbours.Pilot, null, null);
 			break;
 		case CGUSTA:
-			Renderer.symbol(feature, Harbours.CoastGStation, feature.type, null);
+			Renderer.symbol(feature, Harbours.SignalStation, null, null);
 			break;
 		case RSCSTA:
-			Renderer.symbol(feature, Harbours.RescueStation, feature.type, null);
+			Renderer.symbol(feature, Harbours.Rescue, null, null);
 			break;
 		}
@@ -399,5 +400,5 @@
 	}
 	private static void platforms(Feature feature) {
-		Renderer.symbol(feature, Landmarks.Platform, feature.type, null);
+		Renderer.symbol(feature, Landmarks.Platform, null, null);
 	}
 	private static void buoys(Feature feature) {
@@ -415,13 +416,13 @@
 			case LAM_PORT:
 				if (shape == BcnSHP.BCN_PRCH)
-					Renderer.symbol(feature, Beacons.PerchPort, feature.type, null);
+					Renderer.symbol(feature, Beacons.PerchPort, null, null);
 				else
-					Renderer.symbol(feature, Beacons.WithyPort, feature.type, null);
+					Renderer.symbol(feature, Beacons.WithyPort, null, null);
 				break;
 			case LAM_STBD:
 				if (shape == BcnSHP.BCN_PRCH)
-					Renderer.symbol(feature, Beacons.PerchStarboard, feature.type, null);
+					Renderer.symbol(feature, Beacons.PerchStarboard, null, null);
 				else
-					Renderer.symbol(feature, Beacons.WithyStarboard, feature.type, null);
+					Renderer.symbol(feature, Beacons.WithyStarboard, null, null);
 				break;
 			default:
Index: applications/editors/josm/plugins/smed2/src/seamap/SeaMap.java
===================================================================
--- applications/editors/josm/plugins/smed2/src/seamap/SeaMap.java	(revision 29198)
+++ applications/editors/josm/plugins/smed2/src/seamap/SeaMap.java	(revision 29199)
@@ -67,4 +67,10 @@
 	}
 	
+	public class MpolyTab extends HashMap<Long, Long> {
+		public MpolyTab() {
+			super();
+		}
+	}
+	
 	public class FtrMap extends EnumMap<Obj, ArrayList<Feature>> {
 		public FtrMap() {
@@ -108,4 +114,5 @@
 	public WayTab ways;
 	public WayTab mpolys;
+	public MpolyTab outers;
 	public FtrMap features;
 	public FtrTab index;
@@ -113,4 +120,5 @@
 	private Feature feature;
 	private ArrayList<Long> list;
+	private long mpid;
 
 	public SeaMap() {
@@ -145,4 +153,5 @@
 		list = new ArrayList<Long>();
 		mpolys.put(id, list);
+		mpid = id;
 	}
 
@@ -152,8 +161,10 @@
 
 	public void addToMpoly(long way, boolean outer) {
-		if (outer)
+		if (outer) {
 			list.add(0, way);
-		else
+			outers.put(way, mpid);
+		} else {
 			list.add(way);
+		}
 	}
 
Index: applications/editors/josm/plugins/smed2/src/symbols/Harbours.java
===================================================================
--- applications/editors/josm/plugins/smed2/src/symbols/Harbours.java	(revision 29198)
+++ applications/editors/josm/plugins/smed2/src/symbols/Harbours.java	(revision 29199)
@@ -71,8 +71,4 @@
 		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 CoastGStation = new Symbol();
-	static{
-		
 	}
 	public static final Symbol ContainerCrane = new Symbol();
@@ -149,4 +145,12 @@
 		MarinaNF.add(new Instr(Prim.SYMB, new Symbols.SubSymbol(Harbours.Yacht, 1.0, 0, 0, null, null)));
 	}
+	public static final Symbol Pilot = new Symbol();
+	static{
+		Pilot.add(new Instr(Prim.STRK, new BasicStroke(4, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)));
+		Pilot.add(new Instr(Prim.FILL, new Color(0xd400d4)));
+		Path2D.Double p = new Path2D.Double(); p.moveTo(-15,0); p.lineTo(0,-56); p.lineTo(15,0); p.lineTo(0,56); p.closePath();
+		Pilot.add(new Instr(Prim.PGON, p));
+		Pilot.add(new Instr(Prim.ELPS, new Ellipse2D.Double(-58,-58,116,116)));
+	}
 	public static final Symbol PortCrane = new Symbol();
 	static {
@@ -161,7 +165,11 @@
 		Post.add(new Instr(Prim.RSHP, new Ellipse2D.Double(-10,-10,20,20)));
 	}
-	public static final Symbol RescueStation = new Symbol();
+	public static final Symbol Rescue = new Symbol();
 	static{
-		
+		Rescue.add(new Instr(Prim.STRK, new BasicStroke(4, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)));
+		Rescue.add(new Instr(Prim.FILL, Color.black));
+		Path2D.Double p = new Path2D.Double(); p.moveTo(-11,0); p.lineTo(0,-43); p.lineTo(11,0); p.lineTo(0,43); p.closePath();
+		Rescue.add(new Instr(Prim.PGON, p));
+		Rescue.add(new Instr(Prim.LINE, new Line2D.Double(-15,0,15,0)));
 	}
 	public static final Symbol SignalStation = new Symbol();
Index: applications/editors/josm/plugins/smed2/src/symbols/Symbols.java
===================================================================
--- applications/editors/josm/plugins/smed2/src/symbols/Symbols.java	(revision 29198)
+++ applications/editors/josm/plugins/smed2/src/symbols/Symbols.java	(revision 29199)
@@ -108,11 +108,13 @@
 
 	public static class LineStyle {
-		BasicStroke stroke;
-		Color line;
-		Color fill;
-
-		public LineStyle(BasicStroke istroke, Color iline, Color ifill) {
-			stroke = istroke;
+		public Color line;
+		public float width;
+		public float[] dash;
+		public Color fill;
+
+		public LineStyle(Color iline, float iwidth, float[] idash, Color ifill) {
 			line = iline;
+			width = iwidth;
+			dash = idash;
 			fill = ifill;
 		}
