Index: /applications/editors/josm/plugins/smed2/jrender/src/jrender/Jrender.java
===================================================================
--- /applications/editors/josm/plugins/smed2/jrender/src/jrender/Jrender.java	(revision 30225)
+++ /applications/editors/josm/plugins/smed2/jrender/src/jrender/Jrender.java	(revision 30226)
@@ -11,5 +11,11 @@
 
 import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.io.Writer;
+import java.util.ArrayList;
 import java.awt.Color;
+import java.awt.Dimension;
 import java.awt.Graphics;
 import java.awt.Graphics2D;
@@ -21,10 +27,15 @@
 import javax.swing.JFrame;
 
+import org.apache.batik.svggen.SVGGraphics2D;
+import org.apache.batik.svggen.SVGGraphics2DIOException;
+import org.apache.batik.dom.GenericDOMImplementation;
+import org.w3c.dom.Document;
+import org.w3c.dom.DOMImplementation;
+
 import symbols.*;
-import symbols.Symbols.Scheme;
+import symbols.Symbols.*;
 import render.*;
 
 public class Jrender extends Panel {
-	private static final long serialVersionUID = 1L;
 
 	public static void main(String[] args) {
@@ -38,22 +49,7 @@
 		frame.setSize(256, 256);
 		frame.setVisible(true);
-/*		
-		for (int x = 0; x < 4; x++) {
-			for (int y = 0; y < 4; y++) {
-				img = new BufferedImage(256, 256, BufferedImage.TYPE_INT_ARGB);
-				g2 = img.createGraphics();
-				g2.translate(-(x*256), -(y*256));
-				drawRendering(g2);
-				try {
-					ImageIO.write(img, "png", new File("tst" + x + "_" + y + ".png"));
-				} catch (IOException e) {
-					System.out.println("IO Exception");
-				}
-			}
-		}*/
 		
-		img = new BufferedImage(64, 64, BufferedImage.TYPE_INT_ARGB);
+		img = new BufferedImage(256, 256, BufferedImage.TYPE_INT_ARGB);
 		g2 = img.createGraphics();
-		g2.translate(-32, -32);
 		drawRendering(g2);
 		try {
@@ -63,13 +59,30 @@
 		}
 		
+    DOMImplementation domImpl = GenericDOMImplementation.getDOMImplementation();
+    String svgNS = "http://www.w3.org/2000/svg";
+    Document document = domImpl.createDocument(svgNS, "svg", null);
+    SVGGraphics2D svgGenerator = new SVGGraphics2D(document);
+    svgGenerator.setSVGCanvasSize(new Dimension(256, 256));
+		drawRendering(svgGenerator);
+    boolean useCSS = true;
+    Writer out = null;
+			try {
+				out = new OutputStreamWriter(new FileOutputStream("/Users/mherring/Desktop/export.svg"), "UTF-8");
+			} catch (IOException e1) {
+				System.out.println("Exception");
+			}
+    try {
+			svgGenerator.stream(out, useCSS);
+		} catch (SVGGraphics2DIOException e) {
+			System.out.println("Exception");
+		}
 	}
 	
 	public static void drawRendering(Graphics2D g2) {
-		double scale = Renderer.symbolScale[7];
+		double scale = Renderer.symbolScale[8];
 		g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
 		g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_GASP);
-//		System.out.println("hello");
-   
-		Symbols.drawSymbol(g2, Areas.Seaplane, scale/2, 64.0, 64.0, new Scheme(Color.green), null);
+		Scheme scheme = new Scheme(); scheme.pat.add(Patt.H); scheme.col.add(Color.red); scheme.col.add(Color.yellow); scheme.col.add(Color.green);
+		Symbols.drawSymbol(g2, Buoys.Pillar, scale, 128.0, 128.0, scheme, null);
 	}
 	
Index: /applications/editors/josm/plugins/smed2/js57toosm/src/js57toosm/Js57toosm.java
===================================================================
--- /applications/editors/josm/plugins/smed2/js57toosm/src/js57toosm/Js57toosm.java	(revision 30225)
+++ /applications/editors/josm/plugins/smed2/js57toosm/src/js57toosm/Js57toosm.java	(revision 30226)
@@ -25,8 +25,13 @@
 public class Js57toosm {
 	
+	static FileInputStream in;
+	static PrintStream out;
+	static S57map map;
+	
 	public static void main(String[] args) throws IOException {
 
-		FileInputStream in = new FileInputStream("/Users/mherring/boatsw/oseam/josm/plugins/smed2/js57toosm/tst.000");
-		PrintStream out = System.out;
+		in = new FileInputStream("/Users/mherring/boatsw/oseam/josm/plugins/smed2/js57toosm/tst.000");
+		out = System.out;
+		map = new S57map();
 
 		S57dat.rnum = 0;
@@ -48,5 +53,4 @@
 		S57map.Pflag prim = S57map.Pflag.NOSP;
 		long objl = 0;
-		S57map map = new S57map();
 		double minlat = 90, minlon = 180, maxlat = -90, maxlon = -180;
 
@@ -206,26 +210,49 @@
 			if (feature.reln != Rflag.SLAVE) {
 				if (feature.geom.prim == Pflag.POINT) {
-					Snode node = map.nodes.get(feature.geom.elems.get(0).id);
+					long ref = feature.geom.elems.get(0).id;
+					Snode node = map.nodes.get(ref);
 					String type = S57obj.stringType(feature.type);
-					out.format("  <node id='%d' lat='%f' lon='%f' version='1'>%n",-id,  Math.toDegrees(node.lat), Math.toDegrees(node.lon));
+					out.format("  <node id='%d' lat='%f' lon='%f' version='1'>%n", -ref,  Math.toDegrees(node.lat), Math.toDegrees(node.lon));
 					out.format("    <tag k='seamark:type' v=\"%s\"/>%n", type);
-					for (Map.Entry<Att, AttVal<?>> item : feature.atts.entrySet()) {
-						out.format("    <tag k='seamark:%s:%s' v=\"%s\"/>%n", type, S57att.stringAttribute(item.getKey()), S57val.stringValue(item.getValue()));
+					writeAtts(feature, type);
+					out.format("  </node>%n");
+					map.nodes.remove(ref);
+				}
+			}
+		}
+		
+		for (long id : map.index.keySet()) {
+			Feature feature = map.index.get(id);
+			if (feature.reln != Rflag.SLAVE) {
+				if (feature.geom.prim == Pflag.LINE) {
+					GeomIterator git = map.new GeomIterator(feature.geom);
+					while (git.hasMore()) {
+						git.more();
+						while (git.hasNext()) {
+							long ref = git.nextRef();
+							Snode node = map.nodes.get(ref);
+							if (node != null) {
+								out.format("  <node id='%d' lat='%f' lon='%f' version='1'/>%n", -ref, Math.toDegrees(node.lat), Math.toDegrees(node.lon));
+								map.nodes.remove(ref);
+							}
+						}
 					}
-					for (Reln rel : feature.rels) {
-						if (rel.reln == Rflag.SLAVE) {
-							Feature slave = map.index.get(rel.id);
-							type = S57obj.stringType(slave.type);
-							for (Map.Entry<Att, AttVal<?>> item : slave.atts.entrySet()) {
-								out.format("    <tag k='seamark:%s:%s' v=\"%s\"/>%n", type, S57att.stringAttribute(item.getKey()), S57val.stringValue(item.getValue()));
-							}
+					out.format("  <way id='%d' version='1'>%n", -id);
+					git = map.new GeomIterator(feature.geom);
+					while (git.hasMore()) {
+						git.more();
+						while (git.hasNext()) {
+							long ref = git.nextRef();
+							out.format("    <nd ref='%d'/>%n", -ref);
 						}
 					}
-					out.format("  </node>%n");
-				}
-			}
-		}
-/*		
-		for (long id : map.nodes.keySet()) {
+					String type = S57obj.stringType(feature.type);
+					out.format("    <tag k='seamark:type' v=\"%s\"/>%n", type);
+					writeAtts(feature, type);
+					out.format("  </way>%n");
+				}
+			}
+		}
+/*		for (long id : map.nodes.keySet()) {
 			Snode node = map.nodes.get(id);
 			if (node.flg == S57map.Nflag.DPTH) {
@@ -234,6 +261,5 @@
 				out.format("    <tag k='seamark:sounding:depth' v='%.1f'/>%n", ((Dnode)node).val);
 				out.format("  </node>%n");
-			} else {
-				out.format("  <node id='%d' lat='%f' lon='%f' version='1'/>%n",-id,  Math.toDegrees(node.lat), Math.toDegrees(node.lon));
+				map.nodes.remove(id);
 			}
 		}
@@ -252,4 +278,26 @@
 		out.println("</osm>\n");
 	}
+	
+	static void writeAtts(Feature feature, String type) {
+		for (Map.Entry<Att, AttVal<?>> item : feature.atts.entrySet()) {
+			String attstr = S57att.stringAttribute(item.getKey());
+			String valstr = S57val.stringValue(item.getValue());
+			if (!attstr.isEmpty() && !valstr.isEmpty())
+				out.format("    <tag k='seamark:%s:%s' v=\"%s\"/>%n", type, attstr, valstr);
+		}
+		for (Reln rel : feature.rels) {
+			if (rel.reln == Rflag.SLAVE) {
+				Feature slave = map.index.get(rel.id);
+				type = S57obj.stringType(slave.type);
+				for (Map.Entry<Att, AttVal<?>> item : slave.atts.entrySet()) {
+					String attstr = S57att.stringAttribute(item.getKey());
+					String valstr = S57val.stringValue(item.getValue());
+					if (!attstr.isEmpty() && !valstr.isEmpty())
+						out.format("    <tag k='seamark:%s:%s' v=\"%s\"/>%n", type, attstr, valstr);
+				}
+			}
+		}
+
+	}
 
 }
Index: /applications/editors/josm/plugins/smed2/src/s57/S57att.java
===================================================================
--- /applications/editors/josm/plugins/smed2/src/s57/S57att.java	(revision 30225)
+++ /applications/editors/josm/plugins/smed2/src/s57/S57att.java	(revision 30226)
@@ -50,6 +50,6 @@
 		AttS57.put(Att.ORIENT, 117); AttS57.put(Att.PEREND, 118);	AttS57.put(Att.PERSTA, 119); AttS57.put(Att.PICREP, 120);	AttS57.put(Att.PILDST, 121); AttS57.put(Att.PRCTRY, 122);
 		AttS57.put(Att.PRODCT, 123); AttS57.put(Att.PUBREF, 124);	AttS57.put(Att.QUASOU, 125); AttS57.put(Att.RADWAL, 126);	AttS57.put(Att.RADIUS, 127); AttS57.put(Att.RECDAT, 128);
-		AttS57.put(Att.RECIND, 129); AttS57.put(Att.RYRMGV, 130);	AttS57.put(Att.RESTRN, 131);	AttS57.put(Att.SCAMIN, 133);
-		AttS57.put(Att.SECTR1, 136);	AttS57.put(Att.SECTR2, 137); AttS57.put(Att.SHIPAM, 138);
+		AttS57.put(Att.RECIND, 129); AttS57.put(Att.RYRMGV, 130);	AttS57.put(Att.RESTRN, 131); AttS57.put(Att.SCAMAX, 132); AttS57.put(Att.SCAMIN, 133); AttS57.put(Att.SCVAL1, 134);
+		AttS57.put(Att.SCVAL2, 135); AttS57.put(Att.SECTR1, 136);	AttS57.put(Att.SECTR2, 137); AttS57.put(Att.SHIPAM, 138);
 		AttS57.put(Att.SIGFRQ, 139); AttS57.put(Att.SIGGEN, 140);	AttS57.put(Att.SIGGRP, 141); AttS57.put(Att.SIGPER, 142);	AttS57.put(Att.SIGSEQ, 143); AttS57.put(Att.SOUACC, 144);
 		AttS57.put(Att.SDISMX, 145); AttS57.put(Att.SDISMN, 146);	AttS57.put(Att.SORDAT, 147); AttS57.put(Att.SORIND, 148);	AttS57.put(Att.STATUS, 149); AttS57.put(Att.SURATH, 150);
@@ -152,5 +152,5 @@
 		AttStr.put(Att.CATVTR, "category");	AttStr.put(Att.CATTAB, "operation"); AttStr.put(Att.SCHREF, "schedule"); AttStr.put(Att.USESHP, "use"); AttStr.put(Att.CURVHW, "high_velocity");
 		AttStr.put(Att.CURVLW, "low_velocity"); AttStr.put(Att.CURVMW, "mean_velocity"); AttStr.put(Att.CURVOW, "other_velocity"); AttStr.put(Att.APTREF, "passing_time");
-		AttStr.put(Att.CATCOM, "category"); AttStr.put(Att.CATCVR, "category"); AttStr.put(Att.SCAMIN, "scale_minimum");
+		AttStr.put(Att.CATCOM, "category"); AttStr.put(Att.CATCVR, "category");
 		AttStr.put(Att.CATEXS, "category"); AttStr.put(Att.CATWWM, "category"); AttStr.put(Att.SHPTYP, "ship"); AttStr.put(Att.UPDMSG, "message"); AttStr.put(Att.LITRAD, "radius");
 	}
Index: /applications/editors/josm/plugins/smed2/src/s57/S57map.java
===================================================================
--- /applications/editors/josm/plugins/smed2/src/s57/S57map.java	(revision 30225)
+++ /applications/editors/josm/plugins/smed2/src/s57/S57map.java	(revision 30226)
@@ -319,4 +319,5 @@
 			}
 		}
+		sortGeom();
 	}
 
@@ -450,4 +451,118 @@
 	// Utility methods
 	
+	public void sortGeom() {
+		for (long id : index.keySet()) {
+			feature = index.get(id);
+			Geom geom = feature.geom;
+			Geom sort = new Geom(geom.prim);
+			long first = 0;
+			long last = 0;
+			boolean next = true;
+			if ((geom.prim == Pflag.LINE) || (geom.prim == Pflag.AREA)) {
+				int sweep = geom.elems.size();
+				while (!geom.elems.isEmpty()) {
+					Prim prim = geom.elems.remove(0);
+					Edge edge = edges.get(prim.id);
+					if (next == true) {
+						next = false;
+						if (prim.forward) {
+							first = edge.first;
+							last = edge.last;
+						} else {
+							first = edge.last;
+							last = edge.first;
+						}
+						sort.elems.add(prim);
+					} else {
+						if (prim.forward) {
+							if (edge.first == last) {
+								sort.elems.add(prim);
+								last = edge.last;
+							} else if (edge.last == first) {
+								sort.elems.add(0, prim);
+								first = edge.first;
+							} else {
+								geom.elems.add(prim);
+							}
+						} else {
+							if (edge.last == last) {
+								sort.elems.add(prim);
+								last = edge.first;
+							} else if (edge.first == first) {
+								sort.elems.add(0, prim);
+								first = edge.last;
+							} else {
+								geom.elems.add(prim);
+							}
+						}
+					}
+					if (--sweep == 0) {
+						next = true;
+						sweep = geom.elems.size();
+					}
+				}
+				feature.geom = sort;
+			} 
+			if (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;
+				ArrayList<Prim> closed = null;
+				sort = new Geom(geom.prim);
+				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;
+			}
+		}
+	}
+	
 	public class EdgeIterator {
 		Edge edge;
@@ -465,5 +580,5 @@
 		}
 
-		public Snode next() {
+		public long nextRef() {
 			long ref = 0;
 			if (forward) {
@@ -492,5 +607,9 @@
 				}
 			}
-			return nodes.get(ref);
+			return ref;
+		}
+		
+		public Snode next() {
+			return nodes.get(nextRef());
 		}
 	}
@@ -501,11 +620,12 @@
 		EdgeIterator eit;
 		ListIterator<S57map.Prim> it;
-		Snode first;
-		Snode last;
+		long first;
+		long last;
 		
 		public GeomIterator(Geom g) {
 			geom = g;
 			eit = null;
-			first = last = null;
+			first = 0;
+			last = -1;
 			if ((geom.prim != Pflag.NOSP) && (geom.prim != Pflag.POINT)) {
 				it = geom.elems.listIterator();
@@ -522,4 +642,5 @@
 			if ((it != null) && it.hasNext()) {
 				prim = it.next();
+				eit = new EdgeIterator(edges.get(prim.id), prim.forward);
 				return prim.outer;
 			}
@@ -528,18 +649,30 @@
 		
 		public boolean hasNext() {
-			return (first != last) && (eit.hasNext() || it.hasNext());
+			return (first != last) && (it.hasNext() || eit.hasNext());
 		}
 		
-		public Snode next() {
-			if (!eit.hasNext()) {
+		public long nextRef() {
+			if ((eit == null) || !eit.hasNext()) {
 				if (it.hasNext()) {
 					prim = it.next();
 					eit = new EdgeIterator(edges.get(prim.id), prim.forward);
 				} else {
-					return null;
-				}
-			}
-			last = eit.next();
-			return last;
+					return 0;
+				}
+			}
+			long ref = eit.nextRef();
+			if (ref == last)
+				ref = eit.nextRef();
+			if (first == 0) {
+				first = ref;
+				last = 0;
+			} else {
+				last = ref;
+			}
+			return ref;
+		}
+		
+		public Snode next() {
+			return nodes.get(nextRef());
 		}
 	}
Index: /applications/editors/josm/plugins/smed2/src/symbols/Symbols.java
===================================================================
--- /applications/editors/josm/plugins/smed2/src/symbols/Symbols.java	(revision 30225)
+++ /applications/editors/josm/plugins/smed2/src/symbols/Symbols.java	(revision 30226)
@@ -68,4 +68,8 @@
 			col = new ArrayList<Color>();
 			col.add(icol);
+		}
+		public Scheme() {
+			pat = new ArrayList<Patt>();
+			col = new ArrayList<Color>();
 		}
 	}
