Index: /applications/editors/josm/plugins/seachart/build.xml
===================================================================
--- /applications/editors/josm/plugins/seachart/build.xml	(revision 31043)
+++ /applications/editors/josm/plugins/seachart/build.xml	(revision 31044)
@@ -2,5 +2,5 @@
 <project name="SeaChart" default="dist" basedir=".">
     <!-- enter the SVN commit message -->
-    <property name="commit.message" value="New release"/>
+    <property name="commit.message" value="[Seachart] Publish new release"/>
     <!-- enter the *lowest* JOSM version this plugin is currently compatible with -->
     <property name="plugin.main.version" value="7001"/>
Index: /applications/editors/josm/plugins/seachart/jicons/src/jicons/Jicons.java
===================================================================
--- /applications/editors/josm/plugins/seachart/jicons/src/jicons/Jicons.java	(revision 31043)
+++ /applications/editors/josm/plugins/seachart/jicons/src/jicons/Jicons.java	(revision 31044)
@@ -19,4 +19,5 @@
 import java.awt.Dimension;
 import java.awt.Graphics2D;
+import java.awt.Rectangle;
 import java.awt.geom.Point2D;
 import java.awt.image.BufferedImage;
@@ -31,7 +32,7 @@
 
 import s57.S57map;
-import s57.S57map.Feature;
-import s57.S57map.Snode;
+import s57.S57map.*;
 import render.*;
+import render.Rules.RuleSet;
 
 public class Jicons {
@@ -78,5 +79,5 @@
 							img = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
 							g2 = img.createGraphics();
-							Renderer.reRender(g2, 16, s / Renderer.symbolScale[16], map, context);
+							Renderer.reRender(g2, RuleSet.SEAMARK, new Rectangle(x, y, w, h), 16, s / Renderer.symbolScale[16], map, context);
 							try {
 								ImageIO.write(img, "png", new File(args[1] + file + ".png"));
@@ -92,5 +93,5 @@
 							SVGGraphics2D svgGenerator = new SVGGraphics2D(document);
 							svgGenerator.setSVGCanvasSize(new Dimension(w, h));
-							Renderer.reRender(svgGenerator, 16, s / Renderer.symbolScale[16], map, context);
+							Renderer.reRender(svgGenerator, RuleSet.SEAMARK, new Rectangle(x, y, w, h), 16, s / Renderer.symbolScale[16], map, context);
 							boolean useCSS = true;
 							Writer out = null;
Index: /applications/editors/josm/plugins/seachart/jrender/src/jrender/Jrender.java
===================================================================
--- /applications/editors/josm/plugins/seachart/jrender/src/jrender/Jrender.java	(revision 31043)
+++ /applications/editors/josm/plugins/seachart/jrender/src/jrender/Jrender.java	(revision 31044)
@@ -10,5 +10,4 @@
 package jrender;
 
-import java.awt.Dimension;
 import java.awt.Graphics2D;
 import java.awt.Rectangle;
@@ -32,10 +31,10 @@
 import org.w3c.dom.Document;
 
-import render.ChartContext;
-import render.Renderer;
-import render.Rules;
 import s57.S57map;
 import s57.S57map.Feature;
 import s57.S57map.Snode;
+import symbols.*;
+import render.*;
+import render.Rules.RuleSet;
 
 public class Jrender {
@@ -214,5 +213,5 @@
 		Rectangle rect = new Rectangle(size, size);
 		img = new BufferedImage(rect.width, rect.height, BufferedImage.TYPE_INT_ARGB);
-		Renderer.reRender(img.createGraphics(), rect, zoom, 0.05, map, context);
+		Renderer.reRender(img.createGraphics(), RuleSet.BASE, rect, zoom, 0.05, map, context);
 		ByteArrayOutputStream bos = new ByteArrayOutputStream();
 		ImageIO.write(img, "png", bos);
@@ -227,10 +226,10 @@
 			Document document = domImpl.createDocument("http://www.w3.org/2000/svg", "svg", null);
 			SVGGraphics2D svgGenerator = new SVGGraphics2D(document);
-			svgGenerator.setBackground(Rules.Bwater);
+			svgGenerator.setBackground(Symbols.Bwater);
 			svgGenerator.clearRect(rect.x, rect.y, rect.width, rect.height);
 			svgGenerator.setSVGCanvasSize(rect.getSize());
 			svgGenerator.setClip(rect.x, rect.y, rect.width, rect.height);
 //			svgGenerator.translate(-256, -256);
-			Renderer.reRender(svgGenerator, rect, zoom, 0.05, map, context);
+			Renderer.reRender(svgGenerator, RuleSet.BASE, rect, zoom, 0.05, map, context);
 			svgGenerator.stream(dstdir + "tst_" + zoom + "-" + xtile + "-" + ytile + ".svg");
 //		}
@@ -245,5 +244,5 @@
 		g2.scale(s, s);
 		g2.translate(-(256 + (xn * 256 / s)), -(256 + (yn * 256 / s)));
-		Renderer.reRender(g2, new Rectangle(256, 256), zoom, 1, map, context);
+		Renderer.reRender(g2, RuleSet.BASE, new Rectangle(256, 256), zoom, 1, map, context);
 		ByteArrayOutputStream bos = new ByteArrayOutputStream();
 		ImageIO.write(img, "png", bos);
Index: /applications/editors/josm/plugins/seachart/js57toosm/src/js57toosm/Js57toosm.java
===================================================================
--- /applications/editors/josm/plugins/seachart/js57toosm/src/js57toosm/Js57toosm.java	(revision 31043)
+++ /applications/editors/josm/plugins/seachart/js57toosm/src/js57toosm/Js57toosm.java	(revision 31044)
@@ -146,5 +146,5 @@
 							out.format("  </way>%n");
 						}
-						out.format("  <relation id='%d' version='1'>%n", -map.ref++);
+						out.format("  <relation id='%d' version='1'>%n", -map.xref++);
 						out.format("    <tag k='type' v='multipolygon'/>%n");
 						git = map.new GeomIterator(feature.geom);
Index: /applications/editors/josm/plugins/seachart/src/render/Renderer.java
===================================================================
--- /applications/editors/josm/plugins/seachart/src/render/Renderer.java	(revision 31043)
+++ /applications/editors/josm/plugins/seachart/src/render/Renderer.java	(revision 31044)
@@ -36,5 +36,5 @@
 	static int zoom;
 
-	public static void reRender(Graphics2D g, Rectangle rect, int z, double factor, S57map m, ChartContext c) {
+	public static void reRender(Graphics2D g, RuleSet set, Rectangle rect, int z, double factor, S57map m, ChartContext c) {
 		g2 = g;
 		zoom = z;
@@ -43,10 +43,10 @@
 		sScale = symbolScale[zoom] * factor;
 		if (map != null) {
-			g2.setBackground(Rules.Bwater);
+			g2.setBackground(Symbols.Bwater);
 			g2.clearRect(rect.x, rect.y, rect.width, rect.height);
 			g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
 			g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_GASP);
 			g2.setStroke(new BasicStroke(0, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER));
-			Rules.rules(RuleSet.BASE);
+			Rules.rules(set);
 		}
 	}
@@ -327,5 +327,4 @@
 	}
 
-	
 	public static void fillPattern(Feature feature, BufferedImage image) {
 		Path2D.Double p = new Path2D.Double();
Index: /applications/editors/josm/plugins/seachart/src/render/Rules.java
===================================================================
--- /applications/editors/josm/plugins/seachart/src/render/Rules.java	(revision 31043)
+++ /applications/editors/josm/plugins/seachart/src/render/Rules.java	(revision 31044)
@@ -30,10 +30,4 @@
 	public enum RuleSet { ALL, BASE, SEAMARK }
 
-	public static final Color Yland = new Color(0xdcb820);
-	public static final Color Bwater = new Color(0x3ea8c8);
-	public static final Color Gdries = new Color(0x50b050);
-	public static final Color Mline = new Color(0xc480ff);
-	public static final Color Msymb = new Color(0xa30075);
-	
 	static final EnumMap<ColCOL, Color> bodyColours = new EnumMap<ColCOL, Color>(ColCOL.class);
 	static {
@@ -129,5 +123,5 @@
 		ArrayList<?> list = (ArrayList<?>)getAttVal(feature, obj, idx, att);
 		if (list != null) {
-			return ((ArrayList<Enum>)list).get(0);
+			return ((ArrayList<Enum<?>>)list).get(0);
 		}
 		return S57val.unknAtt(att);
@@ -179,5 +173,6 @@
 	static Feature feature;
 	static ArrayList<Feature> objects;
-	static RuleSet ruleset;	
+	static RuleSet ruleset;
+	
 	static boolean testObject(Obj obj) {
 		return ((objects = Renderer.map.features.get(obj)) != null);
@@ -290,10 +285,10 @@
 			Double depmax = 0.0;
 			if (((depmax = (Double) getAttVal(feature, Obj.DEPARE, 0, Att.DRVAL2)) != null) && (depmax <= 0.0)) {
-				Renderer.lineVector(feature, new LineStyle(Gdries));
+				Renderer.lineVector(feature, new LineStyle(Symbols.Gdries));
 			}
 			break;
 		case LAKARE:
 		case RIVBNK:
-			Renderer.lineVector(feature, new LineStyle(Bwater, 10, Bwater));
+			Renderer.lineVector(feature, new LineStyle(Symbols.Bwater, 10, Symbols.Bwater));
 			break;
 		case DRGARE:
@@ -307,7 +302,7 @@
 			if (feature.geom.area > 2.0) {
 				if (Renderer.zoom < 16)
-					Renderer.lineVector(feature, new LineStyle(Mline, 8, new float[] { 50, 50 }, new Color(0x40ffffff, true)));
+					Renderer.lineVector(feature, new LineStyle(Symbols.Mline, 8, new float[] { 50, 50 }, new Color(0x40ffffff, true)));
 				else
-					Renderer.lineVector(feature, new LineStyle(Mline, 8, new float[] { 50, 50 }));
+					Renderer.lineVector(feature, new LineStyle(Symbols.Mline, 8, new float[] { 50, 50 }));
 			} else {
 				if (Renderer.zoom >= 14)
@@ -318,13 +313,13 @@
 		case LOKBSN:
 		case HRBBSN:
-			Renderer.lineVector(feature, new LineStyle(Color.black, 10, Bwater));
+			Renderer.lineVector(feature, new LineStyle(Color.black, 10, Symbols.Bwater));
 			break;
 		case HRBFAC:
 			if (feature.objs.get(Obj.HRBBSN) != null) {
-				Renderer.lineVector(feature, new LineStyle(Color.black, 10, Bwater));
+				Renderer.lineVector(feature, new LineStyle(Color.black, 10, Symbols.Bwater));
 			}
 			break;
 		case LNDARE:
-			Renderer.lineVector(feature, new LineStyle(Yland));
+			Renderer.lineVector(feature, new LineStyle(Symbols.Yland));
 			break;
 		case MARCUL:
@@ -348,5 +343,5 @@
 		case MIPARE:
 			if (Renderer.zoom >= 12) {
-				Renderer.lineSymbols(feature, Areas.Restricted, 1.0, null, null, 0, Mline);
+				Renderer.lineSymbols(feature, Areas.Restricted, 1.0, null, null, 0, Symbols.Mline);
 				if (testAttribute(feature, feature.type, 0, Att.CATREA, CatREA.REA_NWAK)) {
 					Renderer.symbol(feature, Areas.NoWake);
@@ -406,6 +401,6 @@
 		case SPLARE:
 			if (Renderer.zoom >= 12) {
-				Renderer.symbol(feature, Areas.Plane, new Scheme(Msymb));
-				Renderer.lineSymbols(feature, Areas.Restricted, 0.5, Areas.LinePlane, null, 10, Mline);
+				Renderer.symbol(feature, Areas.Plane, new Scheme(Symbols.Msymb));
+				Renderer.lineSymbols(feature, Areas.Restricted, 0.5, Areas.LinePlane, null, 10, Symbols.Mline);
 			}
 			addName(feature, 15, new Font("Arial", Font.BOLD, 80), new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, -90)));
@@ -525,5 +520,5 @@
 		if ((Renderer.zoom >= 16) && (feature.geom.length < 2)) {
 			if (feature.type == Obj.CBLSUB) {
-				Renderer.lineSymbols(feature, Areas.Cable, 0.0, null, null, 0, Mline);
+				Renderer.lineSymbols(feature, Areas.Cable, 0.0, null, null, 0, Symbols.Mline);
 			} else if (feature.type == Obj.CBLOHD) {
 				AttMap atts = feature.objs.get(Obj.CBLOHD).get(0);
@@ -637,7 +632,7 @@
 		case ACHBRT:
 			if (Renderer.zoom >= 14) {
-				Renderer.symbol(feature, Harbours.Anchorage, new Scheme(Mline));
+				Renderer.symbol(feature, Harbours.Anchorage, new Scheme(Symbols.Mline));
 				if (Renderer.zoom >= 15) {
-					Renderer.labelText(feature, name == null ? "" : name, new Font("Arial", Font.PLAIN, 30), Msymb, LabelStyle.RRCT, Mline, Color.white, new Delta(Handle.BC));
+					Renderer.labelText(feature, name == null ? "" : name, new Font("Arial", Font.PLAIN, 30), Symbols.Msymb, LabelStyle.RRCT, Symbols.Mline, Color.white, new Delta(Handle.BC));
 				}
 			}
@@ -649,5 +644,5 @@
 						units = UniHLU.HLU_METR;
 					}
-					Renderer.lineCircle(feature, new LineStyle(Mline, 4, new float[] { 10, 10 }, null), radius, units);
+					Renderer.lineCircle(feature, new LineStyle(Symbols.Mline, 4, new float[] { 10, 10 }, null), radius, units);
 				}
 			}
@@ -658,11 +653,11 @@
 					Renderer.symbol(feature, Harbours.Anchorage, new Scheme(Color.black));
 				} else {
-					Renderer.symbol(feature, Harbours.Anchorage, new Scheme(Mline));
-					Renderer.lineSymbols(feature, Areas.Restricted, 1.0, Areas.LineAnchor, null, 10, Mline);
-				}
-				addName(feature, 15, new Font("Arial", Font.BOLD, 60), Mline, new Delta(Handle.LC, AffineTransform.getTranslateInstance(70, 0)));
+					Renderer.symbol(feature, Harbours.Anchorage, new Scheme(Symbols.Mline));
+					Renderer.lineSymbols(feature, Areas.Restricted, 1.0, Areas.LineAnchor, null, 10, Symbols.Mline);
+				}
+				addName(feature, 15, new Font("Arial", Font.BOLD, 60), Symbols.Mline, new Delta(Handle.LC, AffineTransform.getTranslateInstance(70, 0)));
 				ArrayList<StsSTS> sts = (ArrayList<StsSTS>)getAttList(feature, Obj.ACHARE, 0, Att.STATUS);
 				if ((Renderer.zoom >= 15) && (sts.contains(StsSTS.STS_RESV))) {
-					Renderer.labelText(feature, "Reserved", new Font("Arial", Font.PLAIN, 50), Mline, new Delta(Handle.TC, AffineTransform.getTranslateInstance(0, 60)));
+					Renderer.labelText(feature, "Reserved", new Font("Arial", Font.PLAIN, 50), Symbols.Mline, new Delta(Handle.TC, AffineTransform.getTranslateInstance(0, 60)));
 				}
 			}
@@ -672,25 +667,25 @@
 				switch (cat) {
 				case ACH_DEEP:
-					Renderer.labelText(feature, "DW", new Font("Arial", Font.BOLD, 50), Msymb, new Delta(Handle.RC, AffineTransform.getTranslateInstance(-60, dy)));
+					Renderer.labelText(feature, "DW", new Font("Arial", Font.BOLD, 50), Symbols.Msymb, new Delta(Handle.RC, AffineTransform.getTranslateInstance(-60, dy)));
 					dy += 60;
 					break;
 				case ACH_TANK:
-					Renderer.labelText(feature, "Tanker", new Font("Arial", Font.BOLD, 50), Msymb, new Delta(Handle.RC, AffineTransform.getTranslateInstance(-60, dy)));
+					Renderer.labelText(feature, "Tanker", new Font("Arial", Font.BOLD, 50), Symbols.Msymb, new Delta(Handle.RC, AffineTransform.getTranslateInstance(-60, dy)));
 					dy += 60;
 					break;
 				case ACH_H24P:
-					Renderer.labelText(feature, "24h", new Font("Arial", Font.BOLD, 50), Msymb, new Delta(Handle.RC, AffineTransform.getTranslateInstance(-60, dy)));
+					Renderer.labelText(feature, "24h", new Font("Arial", Font.BOLD, 50), Symbols.Msymb, new Delta(Handle.RC, AffineTransform.getTranslateInstance(-60, dy)));
 					dy += 60;
 					break;
 				case ACH_EXPL:
-					Renderer.symbol(feature, Harbours.Explosives, new Scheme(Msymb), new Delta(Handle.RC, AffineTransform.getTranslateInstance(-60, dy)));
+					Renderer.symbol(feature, Harbours.Explosives, new Scheme(Symbols.Msymb), new Delta(Handle.RC, AffineTransform.getTranslateInstance(-60, dy)));
 					dy += 60;
 					break;
 				case ACH_QUAR:
-					Renderer.symbol(feature, Harbours.Hospital, new Scheme(Msymb), new Delta(Handle.RC, AffineTransform.getTranslateInstance(-60, dy)));
+					Renderer.symbol(feature, Harbours.Hospital, new Scheme(Symbols.Msymb), new Delta(Handle.RC, AffineTransform.getTranslateInstance(-60, dy)));
 					dy += 60;
 					break;
 				case ACH_SEAP:
-					Renderer.symbol(feature, Areas.Seaplane, new Scheme(Msymb), new Delta(Handle.RC, AffineTransform.getTranslateInstance(-60, dy)));
+					Renderer.symbol(feature, Areas.Seaplane, new Scheme(Symbols.Msymb), new Delta(Handle.RC, AffineTransform.getTranslateInstance(-60, dy)));
 					dy += 60;
 					break;
@@ -701,6 +696,6 @@
 		case BERTHS:
 			if (Renderer.zoom >= 14) {
-				Renderer.lineVector(feature, new LineStyle(Mline, 6, new float[] { 20, 20 }));
-				Renderer.labelText(feature, name == null ? " " : name, new Font("Arial", Font.PLAIN, 40), Msymb, LabelStyle.RRCT, Mline, Color.white);
+				Renderer.lineVector(feature, new LineStyle(Symbols.Mline, 6, new float[] { 20, 20 }));
+				Renderer.labelText(feature, name == null ? " " : name, new Font("Arial", Font.PLAIN, 40), Symbols.Msymb, LabelStyle.RRCT, Symbols.Mline, Color.white);
 			}
 			break;
@@ -961,5 +956,5 @@
 		if ((Renderer.zoom >= 16) && (feature.geom.length < 2)) {
 			if (feature.type == Obj.PIPSOL) {
-				Renderer.lineSymbols(feature, Areas.Pipeline, 1.0, null, null, 0, Mline);
+				Renderer.lineSymbols(feature, Areas.Pipeline, 1.0, null, null, 0, Symbols.Mline);
 			} else if (feature.type == Obj.PIPOHD) {
 				Renderer.lineVector(feature, new LineStyle(Color.black, 8));
@@ -1010,20 +1005,20 @@
 		case TSSRON:
 			if (Renderer.zoom <= 15)
-				Renderer.lineVector(feature, new LineStyle(new Color(0x80c48080, true)));
+				Renderer.lineVector(feature, new LineStyle(Symbols.Mline));
 			else
-				Renderer.lineVector(feature, new LineStyle(new Color(0x80c48080, true), 20, null, null));
-			addName(feature, 10, new Font("Arial", Font.BOLD, 150), new Color(0x80c48080, true));
+				Renderer.lineVector(feature, new LineStyle(Symbols.Mline, 20, null, null));
+			addName(feature, 10, new Font("Arial", Font.BOLD, 150), Symbols.Mline);
 			break;
 		case TSELNE:
-			Renderer.lineVector(feature, new LineStyle(new Color(0x80c48080, true), 20, null, null));
+			Renderer.lineVector(feature, new LineStyle(Symbols.Mline, 20, null, null));
 			break;
 		case TSSLPT:
-			Renderer.lineSymbols(feature, Areas.LaneArrow, 0.5, null, null, 0, new Color(0x80c48080, true));
+			Renderer.lineSymbols(feature, Areas.LaneArrow, 0.5, null, null, 0, Symbols.Mline);
 			break;
 		case TSSBND:
-			Renderer.lineVector(feature, new LineStyle(new Color(0x80c48080, true), 20, new float[] { 40, 40 }, null));
+			Renderer.lineVector(feature, new LineStyle(Symbols.Mline, 20, new float[] { 40, 40 }, null));
 			break;
 		case ISTZNE:
-			Renderer.lineSymbols(feature, Areas.Restricted, 1.0, null, null, 0, new Color(0x80c48080, true));
+			Renderer.lineSymbols(feature, Areas.Restricted, 1.0, null, null, 0, Symbols.Mline);
 			break;
 		default:
@@ -1033,10 +1028,13 @@
 
 	private static void shoreline() {
+		CatSLC cat = (CatSLC) getAttEnum(feature, feature.type, 0, Att.CATSLC);
 		if ((ruleset == RuleSet.ALL) || (ruleset == RuleSet.BASE)) {
-			Renderer.lineVector(feature, new LineStyle(Color.black, 10, Yland));
+			if ((cat != CatSLC.SLC_SWAY) && (cat != CatSLC.SLC_TWAL)) {
+				Renderer.lineVector(feature, new LineStyle(Color.black, 10, Symbols.Yland));
+			}
 		}
 		if ((ruleset == RuleSet.ALL) || (ruleset == RuleSet.SEAMARK)) {
 			if (Renderer.zoom >= 12) {
-				switch ((CatSLC) getAttEnum(feature, feature.type, 0, Att.CATSLC)) {
+				switch (cat) {
 				case SLC_TWAL:
 					WatLEV lev = (WatLEV) getAttEnum(feature, feature.type, 0, Att.WATLEV);
@@ -1145,12 +1143,12 @@
 				Renderer.symbol(feature, Harbours.SignalStation);
 				Renderer.symbol(feature, Beacons.RadarStation);
-				Renderer.labelText(feature, "Ra", new Font("Arial", Font.PLAIN, 40), Msymb, new Delta(Handle.TR, AffineTransform.getTranslateInstance(-30, -70)));
+				Renderer.labelText(feature, "Ra", new Font("Arial", Font.PLAIN, 40), Symbols.Msymb, new Delta(Handle.TR, AffineTransform.getTranslateInstance(-30, -70)));
 				break;
 			case PILBOP:
 				Renderer.symbol(feature, Harbours.Pilot);
-				addName(feature, 15, new Font("Arial", Font.BOLD, 50), Msymb , new Delta(Handle.LC, AffineTransform.getTranslateInstance(70, -40)));
+				addName(feature, 15, new Font("Arial", Font.BOLD, 50), Symbols.Msymb , new Delta(Handle.LC, AffineTransform.getTranslateInstance(70, -40)));
 				CatPIL cat = (CatPIL) getAttEnum(feature, feature.type, 0, Att.CATPIL);
 				if (cat == CatPIL.PIL_HELI) {
-					Renderer.labelText(feature, "H", new Font("Arial", Font.PLAIN, 40), Msymb, new Delta(Handle.LC, AffineTransform.getTranslateInstance(70, 0)));
+					Renderer.labelText(feature, "H", new Font("Arial", Font.PLAIN, 40), Symbols.Msymb, new Delta(Handle.LC, AffineTransform.getTranslateInstance(70, 0)));
 				}
 				break;
@@ -1193,5 +1191,5 @@
 
 	private static void waterways() {
-		Renderer.lineVector(feature, new LineStyle(Bwater, 20));
+		Renderer.lineVector(feature, new LineStyle(Symbols.Bwater, 20));
 	}
 
Index: /applications/editors/josm/plugins/seachart/src/render/Signals.java
===================================================================
--- /applications/editors/josm/plugins/seachart/src/render/Signals.java	(revision 31043)
+++ /applications/editors/josm/plugins/seachart/src/render/Signals.java	(revision 31044)
@@ -21,4 +21,5 @@
 import s57.S57map.*;
 import symbols.Beacons;
+import symbols.Symbols;
 import symbols.Topmarks;
 import symbols.Symbols.*;
@@ -162,5 +163,5 @@
 		}
 		if ((Renderer.zoom >= 15) && !bstr.isEmpty()) {
-			Renderer.labelText(feature, bstr, new Font("Arial", Font.PLAIN, 40), Rules.Msymb, new Delta(Handle.TR, AffineTransform.getTranslateInstance(-30, -70)));
+			Renderer.labelText(feature, bstr, new Font("Arial", Font.PLAIN, 40), Symbols.Msymb, new Delta(Handle.TR, AffineTransform.getTranslateInstance(-30, -70)));
 		}
 	}
@@ -273,8 +274,8 @@
 		if (Renderer.zoom >= 15) {
 			if (vais) {
-				Renderer.labelText(feature, "V-AIS", new Font("Arial", Font.PLAIN, 40), Rules.Msymb, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, 70)));
+				Renderer.labelText(feature, "V-AIS", new Font("Arial", Font.PLAIN, 40), Symbols.Msymb, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, 70)));
 			}
 			if (!bstr.isEmpty()) {
-				Renderer.labelText(feature, bstr, new Font("Arial", Font.PLAIN, 40), Rules.Msymb, new Delta(Handle.TR, AffineTransform.getTranslateInstance(-30, -110)));
+				Renderer.labelText(feature, bstr, new Font("Arial", Font.PLAIN, 40), Symbols.Msymb, new Delta(Handle.TR, AffineTransform.getTranslateInstance(-30, -110)));
 			}
 		}
Index: /applications/editors/josm/plugins/seachart/src/s57/S57map.java
===================================================================
--- /applications/editors/josm/plugins/seachart/src/s57/S57map.java	(revision 31043)
+++ /applications/editors/josm/plugins/seachart/src/s57/S57map.java	(revision 31044)
@@ -191,5 +191,5 @@
 		public int outers;						// Number of outers
 		public int inners;						// Number of inners
-		public ArrayList<Comp> refs;	// Ordered list of compounds
+		public ArrayList<Comp> comps;	// Ordered list of compounds
 		public double area;						// Area of feature
 		public double length;					// Length of feature
@@ -199,5 +199,5 @@
 			elems = new ArrayList<Prim>();
 			outers = inners = 0;
-			refs = new ArrayList<Comp>();
+			comps = new ArrayList<Comp>();
 			area = 0;
 			length = 0;
@@ -245,4 +245,5 @@
 	private Feature feature;
 	private Edge edge;
+	private KeyVal<?> osm = S57osm.OSMtag("", "");
 
 	public S57map() {
@@ -388,4 +389,5 @@
 		feature.geom.elems.add(new Prim(id));
 		edge = null;
+		osm = S57osm.OSMtag("", "");
 	}
 
@@ -396,4 +398,5 @@
 		feature.geom.elems.add(new Prim(id));
 		edge = new Edge();
+		osm = S57osm.OSMtag("", "");
 	}
 
@@ -415,4 +418,5 @@
 		feature.geom.prim = Pflag.AREA;
 		edge = null;
+		osm = S57osm.OSMtag("", "");
 	}
 
@@ -474,21 +478,9 @@
 			}
 		} else {
-			KeyVal kv = S57osm.OSMtag(key, val);
+			KeyVal<?> kv = S57osm.OSMtag(key, val);
 			if (kv.obj != Obj.UNKOBJ) {
-				if (feature.type == Obj.UNKOBJ) {
-					feature.type = kv.obj;
-				}
-				ObjTab objs = feature.objs.get(kv.obj);
-				if (objs == null) {
-					objs = new ObjTab();
-					feature.objs.put(kv.obj, objs);
-				}
-				AttMap atts = objs.get(0);
-				if (atts == null) {
-					atts = new AttMap();
-					objs.put(0, atts);
-				}
+				osm.obj = kv.obj;
 				if (kv.att != Att.UNKATT) {
-					atts.put(kv.att, new AttVal(kv.att, kv.conv, kv.val));
+					osm = kv;
 				}
 			}
@@ -517,135 +509,254 @@
 			break;
 		}
-		if ((sortGeom(feature)) && (feature.type != Obj.UNKOBJ) && !((edge != null) && (edge.last == 0))) {
-			index.put(id, feature);
-			if (features.get(feature.type) == null) {
-				features.put(feature.type, new ArrayList<Feature>());
-			}
-			features.get(feature.type).add(feature);
-			feature.geom.centre = findCentroid(feature);
-		}
-	}
-	
+		if (sortGeom(feature) && !((edge != null) && (edge.last == 0))) {
+			if (osm.obj != Obj.UNKOBJ) {
+				if (feature.type == Obj.UNKOBJ) {
+					feature.type = osm.obj;
+					ObjTab objs = feature.objs.get(osm.obj);
+					if (objs == null) {
+						objs = new ObjTab();
+						feature.objs.put(osm.obj, objs);
+					}
+					AttMap atts = objs.get(0);
+					if (atts == null) {
+						atts = new AttMap();
+						objs.put(0, atts);
+					}
+					if (osm.att != Att.UNKATT) {
+						atts.put(osm.att, new AttVal<>(osm.att, osm.conv, osm.val));
+					}
+				} else {
+					Feature base = new Feature();
+					base.reln = Rflag.MASTER;
+					base.geom = feature.geom;
+					base.type = osm.obj;
+					ObjTab objs = new ObjTab();
+					base.objs.put(osm.obj, objs);
+					AttMap atts = new AttMap();
+					objs.put(0, atts);
+					if (osm.att != Att.UNKATT) {
+						atts.put(osm.att, new AttVal<>(osm.att, osm.conv, osm.val));
+					}
+					index.put(++xref, base);
+					if (features.get(osm.obj) == null) {
+						features.put(osm.obj, new ArrayList<Feature>());
+					}
+					features.get(osm.obj).add(base);
+				}
+			}
+			if (feature.type != Obj.UNKOBJ) {
+				index.put(id, feature);
+				if (features.get(feature.type) == null) {
+					features.put(feature.type, new ArrayList<Feature>());
+				}
+				features.get(feature.type).add(feature);
+			}
+		}
+	}
+	
+	enum Ext {I, N, W, S, E }
 	public void mapDone() {
-		ArrayList<Feature> coasts = new ArrayList<Feature>();
-		ArrayList<Feature> lands = new ArrayList<Feature>();
-		if (features.get(Obj.LNDARE) == null) {
-			features.put(Obj.LNDARE, new ArrayList<Feature>());
-		}
-		for (Feature feature : features.get(Obj.COALNE)) {
-			Feature land = new Feature();
-			land.type = Obj.LNDARE;
-			land.reln = Rflag.MASTER;
-			land.objs.put(Obj.LNDARE, new ObjTab());
-			if (feature.geom.prim == Pflag.AREA) {
-				land.geom = feature.geom;
-				features.get(Obj.LNDARE).add(land);
-			} else if (feature.geom.prim == Pflag.LINE) {
-				land.geom.prim = Pflag.LINE;
-				for (int i = 0; i < feature.geom.elems.size(); i++) {
-					land.geom.elems.add(feature.geom.elems.get(i));
-				}
-				coasts.add(land);
-			}
-		}
-		while (coasts.size() > 0) {
-			Feature land = coasts.remove(0);
-			Edge fedge = edges.get(land.geom.elems.get(0).id);
-			long first = fedge.first;
-			long last = edges.get(land.geom.elems.get(land.geom.elems.size() - 1).id).last;
-			if (coasts.size() > 0) {
-				boolean added = true;
-				while (added) {
-					added = false;
-					for (int i = 0; i < coasts.size(); i++) {
-						Feature coast = coasts.get(i);
-						Edge edge = edges.get(coast.geom.elems.get(0).id);
-						if (edge.first == last) {
-							land.geom.elems.add(coast.geom.elems.get(0));
-							last = edge.last;
-							coasts.remove(i--);
-							added = true;
-						} else if (edge.last == first) {
-							land.geom.elems.add(0, coast.geom.elems.get(0));
-							first = edge.first;
-							coasts.remove(i--);
-							added = true;
-						}
-					}
-				}
-			}
-			lands.add(land);
-		}
-		for (Feature land : lands) {
-			long first = edges.get(land.geom.elems.get(0).id).first;
-			long last = edges.get(land.geom.elems.get(land.geom.elems.size()-1).id).last;
-			Ext fext = outsideBounds(first);
-			Ext lext = outsideBounds(last);
-			Edge nedge = new Edge();
-			nedge.first = last;
-			nedge.last = first;
-			switch (lext) {
-			case N:
-				if ((lext == fext) || (fext != Ext.N)) {
-					nedge.nodes.add(1L);
-					if ((fext != Ext.W)) {
-						nedge.nodes.add(2L);
-						if ((fext != Ext.S)) {
-							nedge.nodes.add(3L);
-							if ((fext != Ext.W)) {
-								nedge.nodes.add(4L);
+		class Land {
+			long first;
+			Snode start;
+			Ext sbound;
+			long last;
+			Snode end;
+			Ext ebound;
+			Feature land;
+			Land (Feature l) {
+				land = l;
+				first = last = 0;
+				start = end = null;
+				sbound = ebound = Ext.I;
+			}
+		}
+		if (features.get(Obj.COALNE) != null) {
+			ArrayList<Feature> coasts = new ArrayList<Feature>();
+			ArrayList<Land> lands = new ArrayList<Land>();
+			if (features.get(Obj.LNDARE) == null) {
+				features.put(Obj.LNDARE, new ArrayList<Feature>());
+			}
+			for (Feature feature : features.get(Obj.COALNE)) {
+				Feature land = new Feature();
+				land.type = Obj.LNDARE;
+				land.reln = Rflag.MASTER;
+				land.objs.put(Obj.LNDARE, new ObjTab());
+				if (feature.geom.prim == Pflag.AREA) {
+					land.geom = feature.geom;
+					features.get(Obj.LNDARE).add(land);
+				} else if (feature.geom.prim == Pflag.LINE) {
+					land.geom.prim = Pflag.LINE;
+					for (int i = 0; i < feature.geom.elems.size(); i++) {
+						land.geom.elems.add(feature.geom.elems.get(i));
+					}
+					coasts.add(land);
+				}
+			}
+			while (coasts.size() > 0) {
+				Feature land = coasts.remove(0);
+				Edge fedge = edges.get(land.geom.elems.get(0).id);
+				long first = fedge.first;
+				long last = edges.get(land.geom.elems.get(land.geom.elems.size() - 1).id).last;
+				if (coasts.size() > 0) {
+					boolean added = true;
+					while (added) {
+						added = false;
+						for (int i = 0; i < coasts.size(); i++) {
+							Feature coast = coasts.get(i);
+							Edge edge = edges.get(coast.geom.elems.get(0).id);
+							if (edge.first == last) {
+								land.geom.elems.add(coast.geom.elems.get(0));
+								last = edge.last;
+								coasts.remove(i--);
+								added = true;
+							} else if (edge.last == first) {
+								land.geom.elems.add(0, coast.geom.elems.get(0));
+								first = edge.first;
+								coasts.remove(i--);
+								added = true;
 							}
 						}
 					}
 				}
-				break;
-			case W:
-				if ((lext == fext) || (fext != Ext.W)) {
-					nedge.nodes.add(2L);
-					if ((fext != Ext.S)) {
-						nedge.nodes.add(3L);
-						if ((fext != Ext.E)) {
-							nedge.nodes.add(4L);
-							if ( (fext != Ext.N)) {
-								nedge.nodes.add(1L);
+				lands.add(new Land(land));
+			}
+			ArrayList<Land> islands = new ArrayList<Land>();
+			for (Land land : lands) {
+				sortGeom(land.land);
+				if (land.land.geom.prim == Pflag.AREA) {
+					islands.add(land);
+					features.get(Obj.LNDARE).add(land.land);
+				}
+			}
+			for (Land island : islands) {
+				lands.remove(island);
+			}
+			for (Land land : lands) {
+				GeomIterator git = new GeomIterator(land.land.geom);
+				Snode prev = null;
+				Ext bprev = Ext.I;
+				Ext ext;
+				land.ebound = land.sbound = Ext.I;
+				while (git.hasComp()) {
+					git.nextComp();
+					while (git.hasEdge()) {
+						git.nextEdge();
+						while (git.hasNode()) {
+							long ref = git.nextRef(false);
+							Snode node = nodes.get(ref);
+							if (node == null) continue;
+							if (land.first == 0) {
+								land.first = ref;
+							}
+							if (prev == null) {
+								prev = node;
+							}
+							if ((node.lat >= bounds.maxlat) && (node.lon < bounds.maxlon)) {
+								ext = Ext.N;
+							} else if (node.lon <= bounds.minlon) {
+								ext = Ext.W;
+							} else if (node.lat <= bounds.minlat) {
+								ext = Ext.S;
+							} else if (node.lon >= bounds.maxlon) {
+								ext = Ext.E;
+							} else {
+								ext = Ext.I;
+							}
+							if (ext == Ext.I) {
+								if (land.start == null) {
+									land.start = prev;
+									land.sbound = bprev;
+								}
+								land.end = null;
+								land.ebound = Ext.I;
+							} else {
+								if ((land.start != null) && (land.end == null)) {
+									land.end = node;
+									land.ebound = ext;
+								}
+							}
+							prev = node;
+							bprev = ext;
+							land.last = ref;
+						}
+					}
+				}
+			}
+			islands = new ArrayList<Land>();
+			for (Land land : lands) {
+				if ((land.sbound == Ext.I) || (land.ebound == Ext.I)) {
+					islands.add(land);
+				}
+			}
+			for (Land island : islands) {
+				lands.remove(island);
+			}
+			while (lands.size() > 0) {
+				Land land = lands.get(0);
+				Edge nedge = new Edge();
+				nedge.first = land.last;
+				Ext bound = land.ebound;
+				Snode last = land.end;
+				double delta = Math.PI;
+				int idx = -1;
+				Land next = null;
+				while (idx < 0) {
+					for (int i = 0; i < lands.size(); i++) {
+						next = lands.get(i);
+						if (next.sbound == bound) {
+							double diff = -Math.PI;
+							switch (bound) {
+							case N:
+								diff = last.lon - next.start.lon;
+								break;
+							case W:
+								diff = last.lat - next.start.lat;
+								break;
+							case S:
+								diff = next.start.lon - last.lon;
+								break;
+							case E:
+								diff = next.start.lat - last.lat;
+								break;
+							default:
+								continue;
+							}
+							if ((diff >= 0.0) && (diff < delta)) {
+								delta = diff;
+								idx = i;
 							}
 						}
 					}
-				}
-				break;
-			case S:
-				if ((lext == fext) || (fext != Ext.S)) {
-					nedge.nodes.add(3L);
-					if ((fext != Ext.E)) {
-						nedge.nodes.add(4L);
-						if ((fext != Ext.N)) {
-							nedge.nodes.add(1L);
-							if ((fext != Ext.W)) {
-								nedge.nodes.add(2L);
+					if (idx < 0) {
+						long ref = (long)bound.ordinal();
+						last = nodes.get(ref);
+						nedge.nodes.add(ref);
+						ref = ref < 4 ? ++ref : 1;
+						for (Ext e : Ext.values()) {
+							if (ref == e.ordinal()) {
+								bound = e;
+								break;
 							}
 						}
 					}
 				}
-				break;
-			case E:
-				if ((lext == fext) || (fext != Ext.E)) {
-					nedge.nodes.add(4L);
-					if ((fext != Ext.N)) {
-						nedge.nodes.add(1L);
-						if ((fext != Ext.W)) {
-							nedge.nodes.add(2L);
-							if ((fext != Ext.S)) {
-								nedge.nodes.add(3L);
-							}
-						}
-					}
-				}
-				break;
-			default:
-			}
-			edges.put(++xref, nedge);
-			land.geom.elems.add(new Prim(xref));
-			sortGeom(land);
-			features.get(Obj.LNDARE).add(land);
+				next = lands.get(idx);
+				nedge.last = next.first;
+				edges.put(++xref, nedge);
+				land.land.geom.elems.add(new Prim(xref));
+				if (next != land) {
+					land.land.geom.elems.addAll(next.land.geom.elems);
+					land.ebound = next.ebound;
+					land.end = next.end;
+					land.last = next.last;
+					lands.remove(idx);
+				}
+				sortGeom(land.land);
+				if (land.land.geom.prim == Pflag.AREA) {
+					features.get(Obj.LNDARE).add(land.land);
+					lands.remove(land);
+				}
+			}
 		}
 		return;
@@ -653,27 +764,4 @@
 
 	// Utility methods
-	
-	enum Ext {I, N, W, S, E }
-	class Xnode {
-		double lat;
-		double lon;
-		Ext ext;
-	}
-	Ext outsideBounds(long ref) {
-		Snode node = nodes.get(ref);
-		if (node.lat >= bounds.maxlat) {
-			return Ext.N;
-		}
-		if (node.lat <= bounds.minlat) {
-			return Ext.S;
-		}
-		if (node.lon >= bounds.maxlon) {
-			return Ext.E;
-		}
-		if (node.lon <= bounds.minlon) {
-			return Ext.W;
-		}
-		return Ext.I;
-	}
 	
 	public boolean sortGeom(Feature feature) {
@@ -686,4 +774,5 @@
 		feature.geom.area = 0;
 		if (feature.geom.prim == Pflag.POINT) { 
+			feature.geom.centre = findCentroid(feature);
 			return true;
 		}	else {
@@ -697,11 +786,7 @@
 				if (next == true) {
 					next = false;
-					if (prim.forward) {
-						first = edge.first;
-						last = edge.last;
-					} else {
-						first = edge.last;
-						last = edge.first;
-					}
+					first = edge.first;
+					last = edge.last;
+					prim.forward = true;
 					sort.elems.add(prim);
 					if (prim.outer) {
@@ -711,30 +796,28 @@
 					}
 					comp = new Comp(cref++, 1);
-					sort.refs.add(comp);
+					sort.comps.add(comp);
 				} else {
-					if (prim.forward) {
-						if (edge.first == last) {
-							sort.elems.add(prim);
-							last = edge.last;
-							comp.size++;
-						} else if (edge.last == first) {
-							sort.elems.add(0, prim);
-							first = edge.first;
-							comp.size++;
-						} else {
-							feature.geom.elems.add(prim);
-						}
+					if (edge.first == last) {
+						sort.elems.add(prim);
+						last = edge.last;
+						prim.forward = true;
+						comp.size++;
+					} else if (edge.last == first) {
+						sort.elems.add(0, prim);
+						first = edge.first;
+						prim.forward = true;
+						comp.size++;
+					} else if (edge.last == last) {
+						sort.elems.add(prim);
+						last = edge.first;
+						prim.forward = false;
+						comp.size++;
+					} else if (edge.first == first) {
+						sort.elems.add(0, prim);
+						first = edge.last;
+						prim.forward = false;
+						comp.size++;
 					} else {
-						if (edge.last == last) {
-							sort.elems.add(prim);
-							last = edge.first;
-							comp.size++;
-						} else if (edge.first == first) {
-							sort.elems.add(0, prim);
-							first = edge.last;
-							comp.size++;
-						} else {
-							feature.geom.elems.add(prim);
-						}
+						feature.geom.elems.add(prim);
 					}
 				}
@@ -750,66 +833,11 @@
 		}
 		if (feature.geom.prim == Pflag.AREA) {
-			ArrayList<Prim> outers = new ArrayList<Prim>();
-			ArrayList<Prim> inners = new ArrayList<Prim>();
-			for (Prim prim : feature.geom.elems) {
-				if (prim.outer) {
-					outers.add(prim);
-				} else {
-					inners.add(prim);
-				}
-			}
-			ArrayList<Prim> sorting = outers.size() > 0 ? outers : inners;
-			ArrayList<Prim> closed = null;
-			sort = new Geom(feature.geom.prim);
-			sort.outers = feature.geom.outers;
-			sort.inners = feature.geom.inners;
-			sort.refs = feature.geom.refs;
-			next = true;
-			while (!sorting.isEmpty()) {
-				Prim prim = sorting.remove(0);
-				Edge edge = edges.get(prim.id);
-				if (next == true) {
-					next = false;
-					closed = new ArrayList<Prim>();
-					closed.add(prim);
-					if (prim.forward) {
-						first = edge.first;
-						last = edge.last;
-					} else {
-						first = edge.last;
-						last = edge.first;
-					}
-				} else {
-					if (prim.forward) {
-						if (edge.first == last) {
-							last = edge.last;
-							closed.add(prim);
-						} else {
-							sorting.add(0, prim);
-							next = true;
-						}
-					} else {
-						if (edge.last == last) {
-							last = edge.first;
-							closed.add(prim);
-						} else {
-							sorting.add(0, prim);
-							next = true;
-						}
-					}
-				}
-				if (first == last) {
-					sort.elems.addAll(closed);
-					next = true;
-				}
-				if (sorting.isEmpty() && sorting == outers) {
-					sorting = inners;
-					next = true;
-				}
-			}
-			feature.geom = sort;
+			if (signedArea(feature.geom) < 0.0) {
+				
+			};
+			feature.geom.area = calcArea(feature.geom);
 		}
 		feature.geom.length = calcLength(feature.geom);
-		feature.geom.area = calcArea(feature.geom);
+		feature.geom.centre = findCentroid(feature);
 		return true;
 	}
@@ -883,5 +911,5 @@
 			lastref = 0;
 			ite = geom.elems.listIterator();
-			itc = geom.refs.listIterator();
+			itc = geom.comps.listIterator();
 		}
 		
Index: /applications/editors/josm/plugins/seachart/src/s57/S57osm.java
===================================================================
--- /applications/editors/josm/plugins/seachart/src/s57/S57osm.java	(revision 31043)
+++ /applications/editors/josm/plugins/seachart/src/s57/S57osm.java	(revision 31044)
@@ -38,5 +38,5 @@
 		OSMtags.put("waterway=canal", new KeyVal<>(Obj.CANALS, Att.UNKATT, null, null)); OSMtags.put("waterway=dock", new KeyVal<>(Obj.HRBBSN, Att.UNKATT, null, null));
 		OSMtags.put("waterway=lock", new KeyVal<>(Obj.HRBBSN, Att.UNKATT, null, null)); 
-		OSMtags.put("wetland=tidalflat", new KeyVal<Double>(Obj.DEPARE, Att.DRVAL2, Conv.F, (double)0)); OSMtags.put("tidal=yes", new KeyVal<Double>(Obj.DEPARE, Att.DRVAL2, Conv.F, (Double)0.0));
+		OSMtags.put("wetland=tidalflat", new KeyVal<Double>(Obj.DEPARE, Att.DRVAL2, Conv.F, (Double)0.0)); OSMtags.put("tidal=yes", new KeyVal<Double>(Obj.DEPARE, Att.DRVAL2, Conv.F, (Double)0.0));
 		OSMtags.put("natural=mud", new KeyVal<>(Obj.DEPARE, Att.UNKATT, null, null)); OSMtags.put("natural=sand", new KeyVal<>(Obj.DEPARE, Att.UNKATT, null, null));
 		OSMtags.put("highway=motorway", new KeyVal<>(Obj.ROADWY, Att.CATROD, Conv.E, CatROD.ROD_MWAY)); OSMtags.put("highway=trunk", new KeyVal<>(Obj.ROADWY, Att.CATROD, Conv.E, CatROD.ROD_MAJR));
Index: /applications/editors/josm/plugins/seachart/src/seachart/ChartImage.java
===================================================================
--- /applications/editors/josm/plugins/seachart/src/seachart/ChartImage.java	(revision 31043)
+++ /applications/editors/josm/plugins/seachart/src/seachart/ChartImage.java	(revision 31044)
@@ -30,5 +30,5 @@
 import render.ChartContext;
 import render.Renderer;
-import render.Rules;
+import render.Rules.RuleSet;
 import s57.S57map.*;
 
@@ -66,5 +66,5 @@
 	public void paint(Graphics2D g2, MapView mv, Bounds bb) {
 		Rectangle rect = Main.map.mapView.getBounds();
-		Renderer.reRender(g2, rect, zoom, Math.pow(2, (zoom-12)), SeachartAction.map, this);
+		Renderer.reRender(g2, RuleSet.ALL, rect, zoom, Math.pow(2, (zoom-12)), SeachartAction.map, this);
 		g2.setPaint(Color.black);
 		g2.setFont(new Font("Arial", Font.BOLD, 20));
Index: /applications/editors/josm/plugins/seachart/src/symbols/Areas.java
===================================================================
--- /applications/editors/josm/plugins/seachart/src/symbols/Areas.java	(revision 31043)
+++ /applications/editors/josm/plugins/seachart/src/symbols/Areas.java	(revision 31044)
@@ -53,5 +53,5 @@
 		LaneArrow.add(new Instr(Form.BBOX, new Rectangle2D.Double(-20,-240,40,240)));
 		LaneArrow.add(new Instr(Form.STRK, new BasicStroke(10, BasicStroke.CAP_ROUND, BasicStroke.JOIN_MITER)));
-		LaneArrow.add(new Instr(Form.FILL, new Color(0x80c480ff, true)));
+		LaneArrow.add(new Instr(Form.FILL, Symbols.Mline));
 		Path2D.Double p = new Path2D.Double(); p.moveTo(15,0); p.lineTo(15,-195); p.lineTo(40,-195);
 		p.lineTo(0,-240); p.lineTo(-40,-195); p.lineTo(-15,-195); p.lineTo(-15,0); p.closePath();
Index: /applications/editors/josm/plugins/seachart/src/symbols/Harbours.java
===================================================================
--- /applications/editors/josm/plugins/seachart/src/symbols/Harbours.java	(revision 31043)
+++ /applications/editors/josm/plugins/seachart/src/symbols/Harbours.java	(revision 31044)
@@ -14,5 +14,4 @@
 import java.awt.geom.*;
 
-import render.Rules;
 import symbols.Symbols.*;
 
@@ -39,5 +38,5 @@
 	public static final Symbol Anchorage = new Symbol();
 	static {
-		Anchorage.add(new Instr(Form.SYMB, new Symbols.SubSymbol(Harbours.Anchor, 1.0, 0, 0, new Scheme(Rules.Msymb), null)));
+		Anchorage.add(new Instr(Form.SYMB, new Symbols.SubSymbol(Harbours.Anchor, 1.0, 0, 0, new Scheme(Symbols.Msymb), null)));
 	}
 	public static final Symbol Bollard = new Symbol();
@@ -54,5 +53,5 @@
 		CallPoint1.add(new Instr(Form.BBOX, new Rectangle2D.Double(-50,-50,100,100)));
 		CallPoint1.add(new Instr(Form.STRK, new BasicStroke(5, BasicStroke.CAP_ROUND, BasicStroke.JOIN_MITER)));
-		CallPoint1.add(new Instr(Form.FILL, Rules.Msymb));
+		CallPoint1.add(new Instr(Form.FILL, Symbols.Msymb));
 		CallPoint1.add(new Instr(Form.ELPS, new Ellipse2D.Double(-25,-25,50,50)));
 		Path2D.Double p = new Path2D.Double(); p.moveTo(-16.0,-20.0); p.lineTo(0.0,-50.0); p.lineTo(16.0,-20.0);
@@ -95,5 +94,5 @@
 	static {
 		DistanceU.add(new Instr(Form.STRK, new BasicStroke(3, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)));
-		DistanceU.add(new Instr(Form.FILL, Rules.Msymb));
+		DistanceU.add(new Instr(Form.FILL, Symbols.Msymb));
 		DistanceU.add(new Instr(Form.ELPS, new Ellipse2D.Double(-11,-11,22,22)));
 	}
@@ -121,5 +120,5 @@
 	static {
 		Fishing.add(new Instr(Form.STRK, new BasicStroke(10, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)));
-		Fishing.add(new Instr(Form.FILL, Rules.Msymb));
+		Fishing.add(new Instr(Form.FILL, Symbols.Msymb));
 		Fishing.add(new Instr(Form.EARC, new Arc2D.Double(-50,-50,100,100,15,140,Arc2D.OPEN)));
 		Fishing.add(new Instr(Form.EARC, new Arc2D.Double(-50,-50,100,100,-15,-140,Arc2D.OPEN)));
@@ -133,7 +132,7 @@
 	static {
 		Harbour.add(new Instr(Form.STRK, new BasicStroke(10, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)));
-		Harbour.add(new Instr(Form.FILL, Rules.Msymb));
+		Harbour.add(new Instr(Form.FILL, Symbols.Msymb));
 		Harbour.add(new Instr(Form.ELPS, new Ellipse2D.Double(-50,-50,100,100)));
-		Harbour.add(new Instr(Form.SYMB, new Symbols.SubSymbol(Harbours.Anchor, 0.6, 0, 0, new Scheme(Rules.Msymb), null)));
+		Harbour.add(new Instr(Form.SYMB, new Symbols.SubSymbol(Harbours.Anchor, 0.6, 0, 0, new Scheme(Symbols.Msymb), null)));
 	}
 	public static final Symbol HarbourMaster = new Symbol();
@@ -155,5 +154,5 @@
 	public static final Symbol LandingSteps = new Symbol();
 	static {
-		LandingSteps.add(new Instr(Form.FILL, Rules.Msymb));
+		LandingSteps.add(new Instr(Form.FILL, Symbols.Msymb));
 		Path2D.Double p = new Path2D.Double(); p.moveTo(-20,-10); p.lineTo(10,20); p.lineTo(20,20); p.lineTo(20,10);
 		p.lineTo(10,10); p.lineTo(10,0); p.lineTo(0,0); p.lineTo(0,-10); p.lineTo(-10,-10); p.lineTo(-10,-20); p.lineTo(-20,-20); p.closePath();
@@ -165,11 +164,11 @@
 	static {
 		Marina.add(new Instr(Form.STRK, new BasicStroke(10, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)));
-		Marina.add(new Instr(Form.FILL, Rules.Msymb));
+		Marina.add(new Instr(Form.FILL, Symbols.Msymb));
 		Marina.add(new Instr(Form.EARC, new Arc2D.Double(-50.0,-50.0,100.0,100.0,215.0,-250.0,Arc2D.OPEN)));
-		Marina.add(new Instr(Form.SYMB, new Symbols.SubSymbol(Harbours.Yacht, 0.6, 0, 0, new Scheme(Rules.Msymb), null)));
+		Marina.add(new Instr(Form.SYMB, new Symbols.SubSymbol(Harbours.Yacht, 0.6, 0, 0, new Scheme(Symbols.Msymb), null)));
 	}
 	public static final Symbol MarinaNF = new Symbol();
 	static {
-		MarinaNF.add(new Instr(Form.SYMB, new Symbols.SubSymbol(Harbours.Yacht, 0.6, 0, 0, new Scheme(Rules.Msymb), null)));
+		MarinaNF.add(new Instr(Form.SYMB, new Symbols.SubSymbol(Harbours.Yacht, 0.6, 0, 0, new Scheme(Symbols.Msymb), null)));
 	}
 	public static final Symbol Pilot = new Symbol();
Index: /applications/editors/josm/plugins/seachart/src/symbols/Symbols.java
===================================================================
--- /applications/editors/josm/plugins/seachart/src/symbols/Symbols.java	(revision 31043)
+++ /applications/editors/josm/plugins/seachart/src/symbols/Symbols.java	(revision 31044)
@@ -20,4 +20,10 @@
 public class Symbols {
 
+	public static final Color Yland = new Color(0xf1c010);
+	public static final Color Bwater = new Color(0x78acd2);
+	public static final Color Gdries = new Color(0x689868);
+	public static final Color Mline = new Color(0x9a6078);
+	public static final Color Msymb = new Color(0xa30075);
+	
 	public enum Form {
 		BBOX, STRK, COLR, FILL, LINE, RECT, RRCT, ELPS, EARC, PLIN, PGON, RSHP, TEXT, SYMB, P1, P2, H2, H3, H4, H5, V2, V3, D2, D3, D4, B1, S2, S3, S4, C2, X2
