Index: /applications/editors/josm/plugins/smed2/src/seamap/Renderer.java
===================================================================
--- /applications/editors/josm/plugins/smed2/src/seamap/Renderer.java	(revision 29203)
+++ /applications/editors/josm/plugins/smed2/src/seamap/Renderer.java	(revision 29204)
@@ -16,5 +16,5 @@
 import java.awt.Rectangle;
 import java.awt.RenderingHints;
-import java.awt.font.TextLayout;
+import java.awt.geom.AffineTransform;
 import java.awt.geom.GeneralPath;
 import java.awt.geom.Path2D;
@@ -29,5 +29,4 @@
 import seamap.SeaMap;
 import seamap.SeaMap.*;
-import symbols.Areas;
 import symbols.Symbols;
 import symbols.Symbols.*;
@@ -145,14 +144,93 @@
 	}
 	
+	private static Rectangle symbolSize(Symbol symbol) {
+		Symbol ssymb = symbol;
+		while (ssymb != null) {
+			for (Instr item : symbol) {
+				if (item.type == Prim.BBOX) {
+					return (Rectangle) item.params;
+				}
+				if (item.type == Prim.SYMB) {
+					ssymb = (Symbol) item.params;
+					break;
+				}
+			}
+			if (ssymb == symbol)
+				break;
+		}
+		return null;
+	}
+	
 	public static void lineSymbols(Feature feature, Symbol prisymb, double space, Symbol secsymb, int ratio) {
 		if (feature.flag != Fflag.NODE) {
-			ArrayList<Long> way = map.ways.get(feature.refs);
-			for (long node : way) {
-				Point2D point = helper.getPoint(map.nodes.get(node));
-				
-			}
-		}
-	}
-	
+			Rectangle prect = symbolSize(prisymb);
+			Rectangle srect = symbolSize(secsymb);
+			if (srect == null)
+				ratio = 0;
+			if (prect != null) {
+				ArrayList<Long> ways = new ArrayList<Long>();
+				double psize = Math.abs(prect.getY()) * sScale;
+				double ssize = (srect != null) ? Math.abs(srect.getY()) * sScale : 0;
+				if (map.outers.containsKey(feature.refs)) {
+					ways.addAll(map.mpolys.get(map.outers.get(feature.refs)));
+				} else {
+					if (map.mpolys.containsKey(feature.refs)) {
+						ways.addAll(map.mpolys.get(feature.refs));
+					} else {
+						ways.add(feature.refs);
+					}
+				}
+				Point2D prev = new Point2D.Double();
+				Point2D next = new Point2D.Double();
+				Point2D curr = new Point2D.Double();
+				Point2D succ = new Point2D.Double();
+				boolean gap = true;
+				boolean piv = false;
+				double len = 0;
+				double angle = 0;
+				int scount = ratio;
+				Symbol symbol = prisymb;
+				for (long way : ways) {
+					boolean first = true;
+					for (long node : map.ways.get(way)) {
+						prev = next;
+						next = helper.getPoint(map.nodes.get(node));
+						angle = Math.atan2(next.getY() - prev.getY(), next.getX() - prev.getX());
+						piv = true;
+						if (first) {
+							curr = succ = next;
+							gap  = (space > 0);
+							scount  = ratio;
+							symbol  = prisymb;
+							len = gap ? psize * space * 0.5 : psize;
+							first = false;
+						} else {
+							while (curr.distance(next) >= len) {
+								if (piv) {
+									succ = new Point2D.Double(prev.getX() + (len * Math.cos(angle)), prev.getY() + (len * Math.sin(angle)));
+									piv = false;
+								} else {
+									succ = new Point2D.Double(curr.getX() + (len * Math.cos(angle)), curr.getY() + (len * Math.sin(angle)));
+								}
+								if (!gap) {
+									Symbols.drawSymbol(g2, symbol, sScale, curr.getX(), curr.getY(), new Delta(Handle.BC, AffineTransform.getRotateInstance(Math.atan2(succ.getY() - curr.getY(), succ.getX() - curr.getX())+Math.toRadians(90))), null);
+								}
+								if (space > 0) gap = !gap;
+								curr = succ;
+				        len = gap ? (psize * space) : (--scount == 0) ? ssize : psize;
+				        if (scount == 0) {
+				          symbol = secsymb;
+				          scount = ratio;
+				        } else {
+				          symbol = prisymb;
+				        }
+							}
+						}
+					}
+				}
+			}
+		}
+	}
+
 	public static void lineVector (Feature feature, LineStyle style) {
 		if (feature.flag != Fflag.NODE) {
@@ -202,8 +280,8 @@
 	}
 	
-	public static void labelText (Feature feature, String str, Font font, Delta delta) {
+	public static void labelText (Feature feature, String str, Font font, Color colour, Delta delta) {
 		Symbol label = new Symbol();
-		label.add(new Instr(Prim.FILL, Color.black));
-		label.add(new Instr(Prim.TEXT, new Caption(str, font, delta)));
+		label.add(new Instr(Prim.TEXT, new Caption(str, font, colour
+				, delta)));
 		Point2D point = helper.getPoint(findCentroid(feature));
 		Symbols.drawSymbol(g2, label, tScale, point.getX(), point.getY(), delta, null);
Index: /applications/editors/josm/plugins/smed2/src/seamap/Rules.java
===================================================================
--- /applications/editors/josm/plugins/smed2/src/seamap/Rules.java	(revision 29203)
+++ /applications/editors/josm/plugins/smed2/src/seamap/Rules.java	(revision 29204)
@@ -148,5 +148,5 @@
 			AttItem name = feature.atts.get(Att.OBJNAM);
 			if ((zoom >= 10) && (name != null))
-				Renderer.labelText(feature, (String) name.val, new Font("Arial", Font.BOLD, 150), null);
+				Renderer.labelText(feature, (String) name.val, new Font("Arial", Font.BOLD, 150), new Color(0x80c480ff), null);
 			break;
 		case TSELNE:
@@ -170,5 +170,5 @@
 			}
 			if ((zoom >= 15) && (name != null))
-				Renderer.labelText(feature, (String) name.val, new Font("Arial", Font.BOLD, 80), new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, -90)));
+				Renderer.labelText(feature, (String) name.val, new Font("Arial", Font.BOLD, 80), Color.black, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, -90)));
 			break;
 		case MARCUL:
@@ -195,11 +195,11 @@
 				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 Font("Arial", Font.PLAIN, 100), new Delta(Handle.CC, AffineTransform.getTranslateInstance(0, 0)));
+				Renderer.labelText(feature, (String) name.val, new Font("Arial", Font.PLAIN, 100), Color.black, new Delta(Handle.CC, AffineTransform.getTranslateInstance(0, 0)));
 			break;
 		case RESARE:
 			if (zoom >= 12) {
 				Renderer.lineSymbols(feature, Areas.Restricted, 1.0, null, 0);
-				if ((CatREA)Renderer.getAttVal(feature, feature.type, 0, Att.CATREA) == CatREA.REA_NWAK)
-					Renderer.symbol(feature, Areas.NoWake, Obj.RESARE, null);
+//				if ((CatREA)Renderer.getAttVal(feature, feature.type, 0, Att.CATREA) == CatREA.REA_NWAK)
+//					Renderer.symbol(feature, Areas.NoWake, Obj.RESARE, null);
 			}
 			break;
@@ -209,5 +209,5 @@
 				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 Font("Arial", Font.BOLD, 80), new Delta(Handle.TC, AffineTransform.getTranslateInstance(0, 10)));
+					Renderer.labelText(feature, (String) name.val, new Font("Arial", Font.BOLD, 80), Color.black, new Delta(Handle.TC, AffineTransform.getTranslateInstance(0, 10)));
 			}
 			break;
Index: /applications/editors/josm/plugins/smed2/src/smed2/MapImage.java
===================================================================
--- /applications/editors/josm/plugins/smed2/src/smed2/MapImage.java	(revision 29203)
+++ /applications/editors/josm/plugins/smed2/src/smed2/MapImage.java	(revision 29204)
@@ -6,4 +6,5 @@
 import java.awt.Rectangle;
 import java.awt.geom.Point2D;
+import java.awt.geom.Point2D.Double;
 
 import javax.swing.Action;
@@ -86,6 +87,6 @@
 	}
 
-	public Point2D getPoint(Coord coord) {
-		return Main.map.mapView.getPoint2D(new LatLon(Math.toDegrees(coord.lat), Math.toDegrees(coord.lon)));
+	public Point2D.Double getPoint(Coord coord) {
+		return (Double) Main.map.mapView.getPoint2D(new LatLon(Math.toDegrees(coord.lat), Math.toDegrees(coord.lon)));
 	}
 }
Index: /applications/editors/josm/plugins/smed2/src/symbols/Areas.java
===================================================================
--- /applications/editors/josm/plugins/smed2/src/symbols/Areas.java	(revision 29203)
+++ /applications/editors/josm/plugins/smed2/src/symbols/Areas.java	(revision 29204)
@@ -35,4 +35,5 @@
 	public static final Symbol LaneArrow = new Symbol();
 	static {
+		LaneArrow.add(new Instr(Prim.BBOX, new Rectangle(-20,-240,40,240)));
 		LaneArrow.add(new Instr(Prim.STRK, new BasicStroke(10, BasicStroke.CAP_ROUND, BasicStroke.JOIN_MITER)));
 		LaneArrow.add(new Instr(Prim.FILL, new Color(0x80c480ff, true)));
Index: /applications/editors/josm/plugins/smed2/src/symbols/Notices.java
===================================================================
--- /applications/editors/josm/plugins/smed2/src/symbols/Notices.java	(revision 29203)
+++ /applications/editors/josm/plugins/smed2/src/symbols/Notices.java	(revision 29204)
@@ -51,5 +51,5 @@
 	private static final Symbol Sport = new Symbol();
 	static {
-		Sport.add(new Instr(Prim.TEXT, new Caption("SPORT", new Font("Arial", Font.BOLD, 15), new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, 0)))));
+		Sport.add(new Instr(Prim.TEXT, new Caption("SPORT", new Font("Arial", Font.BOLD, 15), Color.black, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, 0)))));
 	}
 	private static final Symbol Turn = new Symbol();
@@ -65,5 +65,5 @@
 	private static final Symbol VHF = new Symbol();
 	static {
-		VHF.add(new Instr(Prim.TEXT, new Caption("VHF", new Font("Arial", Font.BOLD, 20), new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, 0)))));
+		VHF.add(new Instr(Prim.TEXT, new Caption("VHF", new Font("Arial", Font.BOLD, 20), Color.black, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, 0)))));
 	}
 	private static final Symbol Waterbike = new Symbol();
Index: /applications/editors/josm/plugins/smed2/src/symbols/Symbols.java
===================================================================
--- /applications/editors/josm/plugins/smed2/src/symbols/Symbols.java	(revision 29203)
+++ /applications/editors/josm/plugins/smed2/src/symbols/Symbols.java	(revision 29204)
@@ -57,6 +57,6 @@
 
 	public static class Instr {
-		Prim type;
-		Object params;
+		public Prim type;
+		public Object params;
 
 		public Instr(Prim itype, Object iparams) {
@@ -67,6 +67,6 @@
 
 	public static class Delta {
-		Handle h;
-		AffineTransform t;
+		public Handle h;
+		public AffineTransform t;
 
 		public Delta(Handle ih, AffineTransform it) {
@@ -77,6 +77,6 @@
 
 	public static class Scheme {
-		ArrayList<ColPAT> pat;
-		ArrayList<ColCOL> col;
+		public ArrayList<ColPAT> pat;
+		public ArrayList<ColCOL> col;
 
 		public Scheme(ArrayList<ColPAT> ipat, ArrayList<ColCOL> icol) {
@@ -87,11 +87,13 @@
 
 	public static class Caption {
-		String str;
-		Font font;
-		Delta dd;
-
-		public Caption(String istr, Font ifont, Delta idd) {
-			str = istr;
+		public String string;
+		public Font font;
+		public Color colour;
+		public Delta dd;
+
+		public Caption(String istr, Font ifont, Color icolour, Delta idd) {
+			string = istr;
 			font = ifont;
+			colour = icolour;
 			dd = idd;
 		}
@@ -287,5 +289,6 @@
 				case TEXT:
 					Caption c = (Caption) item.params;
-					TextLayout layout = new TextLayout(c.str, c.font, g2.getFontRenderContext());
+					g2.setPaint(c.colour);
+					TextLayout layout = new TextLayout(c.string, c.font, g2.getFontRenderContext());
 					Rectangle2D bb = layout.getBounds();
 					dx = 0;
