Index: applications/editors/josm/plugins/smed2/js57toosm/src/js57toosm/Js57toosm.java
===================================================================
--- applications/editors/josm/plugins/smed2/js57toosm/src/js57toosm/Js57toosm.java	(revision 30313)
+++ applications/editors/josm/plugins/smed2/js57toosm/src/js57toosm/Js57toosm.java	(revision 30314)
@@ -104,6 +104,6 @@
 						git = map.new GeomIterator(feature.geom);
 						while (git.hasComp()) {
-							long way = git.nextComp();
-							out.format("  <way id='%d' version='1'>%n", -way);
+							long edge = git.nextComp();
+							out.format("  <way id='%d' version='1'>%n", -edge);
 							while (git.hasEdge()) {
 								git.nextEdge();
@@ -112,9 +112,8 @@
 									out.format("    <nd ref='%d'/>%n", -ref);
 								}
-								out.format("    <tag k='seamark:type' v=\"%s\"/>%n", type);
-								writeAtts(feature, type);
 							}
+							out.format("    <tag k='seamark:type' v=\"%s\"/>%n", type);
+							writeAtts(feature, type);
 							out.format("  </way>%n");
-							done.add(way);
 						}
 					} else if (feature.geom.prim == Pflag.AREA) {
@@ -136,31 +135,25 @@
 						git = map.new GeomIterator(feature.geom);
 						while (git.hasComp()) {
-							git.nextComp();
+							long ref = git.nextComp();
+							out.format("  <way id='%d' version='1'>%n", -ref);
 							while (git.hasEdge()) {
-								long way = git.nextEdge();
-								if (!done.contains(way)) {
-									out.format("  <way id='%d' version='1'>%n", -way);
-									while (git.hasNode()) {
-										long ref = git.nextRef(true);
-										out.format("    <nd ref='%d'/>%n", -ref);
-									}
-									out.format("  </way>%n");
-									done.add(way);
+								git.nextEdge();
+								while (git.hasNode()) {
+									ref = git.nextRef();
+									out.format("    <nd ref='%d'/>%n", -ref);
 								}
 							}
+							out.format("  </way>%n");
 						}
 						out.format("  <relation id='%d' version='1'>%n", -map.ref++);
 						out.format("    <tag k='type' v='multipolygon'/>%n");
 						git = map.new GeomIterator(feature.geom);
-						int outers = feature.geom.refs.get(0).size;
+						int outers = feature.geom.outers;
 						while (git.hasComp()) {
-							git.nextComp();
-							while (git.hasEdge()) {
-								long way = git.nextEdge();
-								if (outers-- > 0) {
-									out.format("    <member type='way' ref='%d' role='outer'/>%n", -way);
-								} else {
-									out.format("    <member type='way' ref='%d' role='inner'/>%n", -way);
-								}
+							long ref = git.nextComp();
+							if (outers-- > 0) {
+								out.format("    <member type='way' ref='%d' role='outer'/>%n", -ref);
+							} else {
+								out.format("    <member type='way' ref='%d' role='inner'/>%n", -ref);
 							}
 						}
Index: applications/editors/josm/plugins/smed2/src/panels/PanelMain.java
===================================================================
--- applications/editors/josm/plugins/smed2/src/panels/PanelMain.java	(revision 30313)
+++ applications/editors/josm/plugins/smed2/src/panels/PanelMain.java	(revision 30314)
@@ -47,5 +47,5 @@
 	};
 	private JButton importButton = null;
-	JFileChooser ifc = new JFileChooser(Main.pref.get("smed2plugin.file"));
+	JFileChooser ifc = new JFileChooser(Main.pref.get("smed2plugin.encinpfile"));
 	private ActionListener alImport = new ActionListener() {
 		public void actionPerformed(java.awt.event.ActionEvent e) {
@@ -56,5 +56,5 @@
 				if (returnVal == JFileChooser.APPROVE_OPTION) {
 					try {
-						Main.pref.put("smed2plugin.file", ifc.getSelectedFile().getPath());
+						Main.pref.put("smed2plugin.encinpfile", ifc.getSelectedFile().getPath());
 						Smed2Action.panelS57.startImport(ifc.getSelectedFile());
 					} catch (IOException e1) {
Index: applications/editors/josm/plugins/smed2/src/panels/PanelS57.java
===================================================================
--- applications/editors/josm/plugins/smed2/src/panels/PanelS57.java	(revision 30313)
+++ applications/editors/josm/plugins/smed2/src/panels/PanelS57.java	(revision 30314)
@@ -50,11 +50,10 @@
 
 	public void startImport(File inf) throws IOException {
-		JFileChooser ifc = new JFileChooser(Main.pref.get("smed2plugin.file"));
 		FileInputStream in = new FileInputStream(inf);
 		PanelMain.setStatus("Select OSM types file", Color.yellow);
-		ifc.setCurrentDirectory(inf);
+		JFileChooser ifc = new JFileChooser(Main.pref.get("smed2plugin.typesfile"));
 		int returnVal = ifc.showOpenDialog(Main.parent);
 		if (returnVal == JFileChooser.APPROVE_OPTION) {
-			Main.pref.put("smed2plugin.file", ifc.getSelectedFile().getPath());
+			Main.pref.put("smed2plugin.typesfile", ifc.getSelectedFile().getPath());
 			Scanner tin = new Scanner(new FileInputStream(ifc.getSelectedFile()));
 			while (tin.hasNext()) {
@@ -82,6 +81,6 @@
 							while ((snode = map.nodes.get(ref)) != null) {
 								if (!done.contains(ref)) {
-									Node node = new Node(new LatLon(Math.toDegrees(snode.lat), Math.toDegrees(snode.lon)));
-									node.setOsmId(ref, 1);
+									Node node = new Node(ref, 1);
+									node.setCoor((new LatLon(Math.toDegrees(snode.lat), Math.toDegrees(snode.lon))));
 									data.addPrimitive(node);
 									addKeys(node, feature, type);
@@ -110,6 +109,6 @@
 									Snode snode = map.nodes.get(ref);
 									if (!done.contains(ref)) {
-										Node node = new Node(new LatLon(Math.toDegrees(snode.lat), Math.toDegrees(snode.lon)));
-										node.setOsmId(ref, 1);
+										Node node = new Node(ref, 1);
+										node.setCoor((new LatLon(Math.toDegrees(snode.lat), Math.toDegrees(snode.lon))));
 										data.addPrimitive(node);
 										done.add(ref);
@@ -129,7 +128,6 @@
 									way.addNode((Node)data.getPrimitiveById(ref, OsmPrimitiveType.NODE));
 								}
-								addKeys(way, feature, type);
-							}
-							done.add(edge);
+							}
+							addKeys(way, feature, type);
 						}
 					} else if (feature.geom.prim == Pflag.AREA) {
@@ -143,6 +141,6 @@
 									Snode snode = map.nodes.get(ref);
 									if (!done.contains(ref)) {
-										Node node = new Node(new LatLon(Math.toDegrees(snode.lat), Math.toDegrees(snode.lon)));
-										node.setOsmId(ref, 1);
+										Node node = new Node(ref, 1);
+										node.setCoor((new LatLon(Math.toDegrees(snode.lat), Math.toDegrees(snode.lon))));
 										data.addPrimitive(node);
 										done.add(ref);
@@ -153,15 +151,12 @@
 						git = map.new GeomIterator(feature.geom);
 						while (git.hasComp()) {
-							git.nextComp();
-							while (git.hasEdge()) {
-								long edge = git.nextEdge();
-								if (!done.contains(edge)) {
-									Way way = new Way(edge, 1);
-									data.addPrimitive(way);
-									while (git.hasNode()) {
-										long ref = git.nextRef(true);
-										way.addNode((Node)data.getPrimitiveById(ref, OsmPrimitiveType.NODE));
-									}
-									done.add(edge);
+							long ref = git.nextComp();
+							Way way = new Way(ref, 1);
+							data.addPrimitive(way);
+							while (git.hasEdge()) {
+								git.nextEdge();
+								while (git.hasNode()) {
+									ref = git.nextRef();
+									way.addNode((Node) data.getPrimitiveById(ref, OsmPrimitiveType.NODE));
 								}
 							}
@@ -170,14 +165,11 @@
 						data.addPrimitive(rel);
 						git = map.new GeomIterator(feature.geom);
-						int outers = feature.geom.refs.get(0).size;
-						while (git.hasComp()) {
-							git.nextComp();
-							while (git.hasEdge()) {
-								long way = git.nextEdge();
-								if (outers-- > 0) {
-									rel.addMember(new RelationMember("outer", (Way)data.getPrimitiveById(way, OsmPrimitiveType.WAY)));
-								} else {
-									rel.addMember(new RelationMember("inner", (Way)data.getPrimitiveById(way, OsmPrimitiveType.WAY)));
-								}
+						int outers = feature.geom.outers;
+						while (git.hasComp()) {
+							long ref = git.nextComp();
+							if (outers-- > 0) {
+								rel.addMember(new RelationMember("outer", (Way) data.getPrimitiveById(ref, OsmPrimitiveType.WAY)));
+							} else {
+								rel.addMember(new RelationMember("inner", (Way) data.getPrimitiveById(ref, OsmPrimitiveType.WAY)));
 							}
 						}
Index: applications/editors/josm/plugins/smed2/src/render/Renderer.java
===================================================================
--- applications/editors/josm/plugins/smed2/src/render/Renderer.java	(revision 30313)
+++ applications/editors/josm/plugins/smed2/src/render/Renderer.java	(revision 30314)
@@ -220,47 +220,50 @@
 				git.nextComp();
 				boolean first = true;
-				while (git.hasNode()) {
-					prev = next;
-					next = context.getPoint(git.next());
-					angle = Math.atan2(next.getY() - prev.getY(), next.getX() - prev.getX());
-					piv = true;
-					if (first) {
-						curr = succ = next;
-						gap = (space > 0);
-						stcount = ratio - 1;
-						symbol = prisymb;
-						len = gap ? psize * space * 0.5 : psize;
-						first = false;
-					} else {
-						while (curr.distance(next) >= len) {
-							if (piv) {
-								double rem = len;
-								double s = prev.distance(next);
-								double p = curr.distance(prev);
-								if ((s > 0) && (p > 0)) {
-									double n = curr.distance(next);
-									double theta = Math.acos((s * s + p * p - n * n) / 2 / s / p);
-									double phi = Math.asin(p / len * Math.sin(theta));
-									rem = len * Math.sin(Math.PI - theta - phi) / Math.sin(theta);
+				while (git.hasEdge()) {
+					git.nextEdge();
+					while (git.hasNode()) {
+						prev = next;
+						next = context.getPoint(git.next());
+						angle = Math.atan2(next.getY() - prev.getY(), next.getX() - prev.getX());
+						piv = true;
+						if (first) {
+							curr = succ = next;
+							gap = (space > 0);
+							stcount = ratio - 1;
+							symbol = prisymb;
+							len = gap ? psize * space * 0.5 : psize;
+							first = false;
+						} else {
+							while (curr.distance(next) >= len) {
+								if (piv) {
+									double rem = len;
+									double s = prev.distance(next);
+									double p = curr.distance(prev);
+									if ((s > 0) && (p > 0)) {
+										double n = curr.distance(next);
+										double theta = Math.acos((s * s + p * p - n * n) / 2 / s / p);
+										double phi = Math.asin(p / len * Math.sin(theta));
+										rem = len * Math.sin(Math.PI - theta - phi) / Math.sin(theta);
+									}
+									succ = new Point2D.Double(prev.getX() + (rem * Math.cos(angle)), prev.getY() + (rem * Math.sin(angle)));
+									piv = false;
+								} else {
+									succ = new Point2D.Double(curr.getX() + (len * Math.cos(angle)), curr.getY() + (len * Math.sin(angle)));
 								}
-								succ = new Point2D.Double(prev.getX() + (rem * Math.cos(angle)), prev.getY() + (rem * 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 Scheme(col),
-										new Delta(Handle.BC, AffineTransform.getRotateInstance(Math.atan2((succ.getY() - curr.getY()), (succ.getX() - curr.getX())) + Math.toRadians(90))));
-							}
-							if (space > 0)
-								gap = !gap;
-							curr = succ;
-							len = gap ? (psize * space) : (--stcount == 0) ? (stflag ? tsize : ssize) : psize;
-							if (stcount == 0) {
-								symbol = stflag ? tersymb : secsymb;
-								if (trect != null) stflag = !stflag;
-								stcount = ratio;
-							} else {
-								symbol = prisymb;
+								if (!gap) {
+									Symbols.drawSymbol(g2, symbol, sScale, curr.getX(), curr.getY(), new Scheme(col), new Delta(Handle.BC, AffineTransform.getRotateInstance(Math.atan2((succ.getY() - curr.getY()), (succ.getX() - curr.getX())) + Math.toRadians(90))));
+								}
+								if (space > 0)
+									gap = !gap;
+								curr = succ;
+								len = gap ? (psize * space) : (--stcount == 0) ? (stflag ? tsize : ssize) : psize;
+								if (stcount == 0) {
+									symbol = stflag ? tersymb : secsymb;
+									if (trect != null)
+										stflag = !stflag;
+									stcount = ratio;
+								} else {
+									symbol = prisymb;
+								}
 							}
 						}
@@ -278,9 +281,12 @@
 		while (git.hasComp()) {
 			git.nextComp();
-			point = context.getPoint(git.next());
-			p.moveTo(point.getX(), point.getY());
-			while (git.hasNode()) {
+			while (git.hasEdge()) {
+				git.nextEdge();
 				point = context.getPoint(git.next());
-				p.lineTo(point.getX(), point.getY());
+				p.moveTo(point.getX(), point.getY());
+				while (git.hasNode()) {
+					point = context.getPoint(git.next());
+					p.lineTo(point.getX(), point.getY());
+				}
 			}
 		}
@@ -353,9 +359,12 @@
 			while (git.hasComp()) {
 				git.nextComp();
-				point = context.getPoint(git.next());
-				p.moveTo(point.getX(), point.getY());
-				while (git.hasNode()) {
+				while (git.hasEdge()) {
+					git.nextEdge();
 					point = context.getPoint(git.next());
-					p.lineTo(point.getX(), point.getY());
+					p.moveTo(point.getX(), point.getY());
+					while (git.hasNode()) {
+						point = context.getPoint(git.next());
+						p.lineTo(point.getX(), point.getY());
+					}
 				}
 			}
@@ -500,33 +509,40 @@
 				git.nextComp();
 				boolean first = true;
-				while (git.hasNode()) {
-					prev = next;
-					next = context.getPoint(git.next());
-					angle = Math.atan2(next.getY() - prev.getY(), next.getX() - prev.getX());
-					piv = true;
-					if (first) {
-						curr = succ = next;
-//						len = psize;
-						first = false;
-					} else {
-						while (curr.distance(next) >= len) {
-							if (piv) {
-								double rem = len;
-								double s = prev.distance(next);
-								double p = curr.distance(prev);
-								if ((s > 0) && (p > 0)) {
-									double n = curr.distance(next);
-									double theta = Math.acos((s * s + p * p - n * n) / 2 / s / p);
-									double phi = Math.asin(p / len * Math.sin(theta));
-									rem = len * Math.sin(Math.PI - theta - phi) / Math.sin(theta);
+				while (git.hasEdge()) {
+					git.nextEdge();
+					while (git.hasNode()) {
+						prev = next;
+						next = context.getPoint(git.next());
+						angle = Math.atan2(next.getY() - prev.getY(), next.getX() - prev.getX());
+						piv = true;
+						if (first) {
+							curr = succ = next;
+							// len = psize;
+							first = false;
+						} else {
+							while (curr.distance(next) >= len) {
+								if (piv) {
+									double rem = len;
+									double s = prev.distance(next);
+									double p = curr.distance(prev);
+									if ((s > 0) && (p > 0)) {
+										double n = curr.distance(next);
+										double theta = Math.acos((s * s + p * p - n * n) / 2 / s / p);
+										double phi = Math.asin(p / len * Math.sin(theta));
+										rem = len * Math.sin(Math.PI - theta - phi) / Math.sin(theta);
+									}
+									succ = new Point2D.Double(prev.getX() + (rem * Math.cos(angle)), prev.getY() + (rem * Math.sin(angle)));
+									piv = false;
+								} else {
+									succ = new Point2D.Double(curr.getX() + (len * Math.cos(angle)), curr.getY() + (len * Math.sin(angle)));
 								}
-								succ = new Point2D.Double(prev.getX() + (rem * Math.cos(angle)), prev.getY() + (rem * Math.sin(angle)));
-								piv = false;
-							} else {
-								succ = new Point2D.Double(curr.getX() + (len * Math.cos(angle)), curr.getY() + (len * Math.sin(angle)));
+								// 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);
+								curr = succ;
+								// len = psize;
 							}
-//								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);
-							curr = succ;
-//							len = psize;
 						}
 					}
Index: applications/editors/josm/plugins/smed2/src/render/Rules.java
===================================================================
--- applications/editors/josm/plugins/smed2/src/render/Rules.java	(revision 30313)
+++ applications/editors/josm/plugins/smed2/src/render/Rules.java	(revision 30314)
@@ -628,4 +628,6 @@
 				Renderer.symbol(feature, Harbours.Post);
 			break;
+		default:
+			break;
 		}
 		Signals.addSignals(feature);
Index: applications/editors/josm/plugins/smed2/src/s57/S57map.java
===================================================================
--- applications/editors/josm/plugins/smed2/src/s57/S57map.java	(revision 30313)
+++ applications/editors/josm/plugins/smed2/src/s57/S57map.java	(revision 30314)
@@ -171,7 +171,7 @@
 	}
 	
-	public class Comp {
-		public long ref;
-		public int size;
+	public class Comp {			// Composite spatial element
+		public long ref;			// ID of Comp
+		public int size;			// Number of Prims in this Comp
 		public Comp(long r, int s) {
 			ref = r;
@@ -316,33 +316,5 @@
 		for (long id : index.keySet()) {
 			Feature feature = index.get(id);
-			if ((feature.geom.prim == Pflag.LINE) || (feature.geom.prim == Pflag.AREA)) {
-				feature.geom.outers = 1;
-				feature.geom.inners = 0;
-				feature.geom.refs = new ArrayList<Comp>();
-				Comp comp = new Comp(ref++, 0);
-				feature.geom.refs.add(comp);
-				ListIterator<S57map.Prim> ite = feature.geom.elems.listIterator();
-				long first = 0;
-				while (ite.hasNext()) {
-					Prim prim = ite.next();
-					Edge edge = edges.get(prim.id);
-					if (!prim.outer) {
-						if (first == 0) {
-							feature.geom.inners++;
-							comp = new Comp(ref++, 0);
-							feature.geom.refs.add(comp);
-							first = edge.first;
-						} else {
-							if (edge.last == first) {
-								first = 0;
-							}
-						}
-					}
-					comp.size++;
-				}
-			}
-		}
-		for (long id : index.keySet()) {
-			Feature feature = index.get(id);
+			sortGeom(feature);
 			for (Reln reln : feature.rels) {
 				Feature rel = index.get(reln.id);
@@ -426,5 +398,4 @@
 		feature.reln = Rflag.UNKN;
 		feature.geom.prim = Pflag.AREA;
-		feature.geom.elems.add(new Prim(id));
 		edge = null;
 	}
@@ -503,7 +474,10 @@
 			nodes.get(edge.first).flg = Nflag.CONN;
 			nodes.get(edge.last).flg = Nflag.CONN;
-			feature.geom.length = calcLength(feature.geom);
 			if (edge.first == edge.last) {
 				feature.geom.prim = Pflag.AREA;
+			}
+			sortGeom(feature);
+			feature.geom.length = calcLength(feature.geom);
+			if (feature.geom.prim == Pflag.AREA) {
 				feature.geom.area = calcArea(feature.geom);
 			} else {
@@ -512,4 +486,7 @@
 			break;
 		case AREA:
+			sortGeom(feature);
+			feature.geom.length = calcLength(feature.geom);
+			feature.geom.area = calcArea(feature.geom);
 			break;
 		default:
@@ -528,132 +505,129 @@
 	// Utility methods
 	
-	public void sortGeom() {
-		for (long id : index.keySet()) {
-			feature = index.get(id);
-			Geom sort = new Geom(feature.geom.prim);
-			long first = 0;
-			long last = 0;
-			Comp comp = null;
-			boolean next = true;
-			if ((feature.geom.prim == Pflag.LINE) || (feature.geom.prim == Pflag.AREA)) {
-				int sweep = feature.geom.elems.size();
-				while (!feature.geom.elems.isEmpty()) {
-					Prim prim = feature.geom.elems.remove(0);
-					Edge edge = edges.get(prim.id);
-					if (next == true) {
-						next = false;
-						if (prim.forward) {
+	public void sortGeom(Feature feature) {
+		Geom sort = new Geom(feature.geom.prim);
+		long first = 0;
+		long last = 0;
+		Comp comp = null;
+		boolean next = true;
+		if ((feature.geom.prim == Pflag.LINE) || (feature.geom.prim == Pflag.AREA)) {
+			int sweep = feature.geom.elems.size();
+			while (!feature.geom.elems.isEmpty()) {
+				Prim prim = feature.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);
+					if (prim.outer) {
+						sort.outers++;
+					} else {
+						sort.inners++;
+					}
+					comp = new Comp(ref++, 1);
+					sort.refs.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;
-							last = edge.last;
+							comp.size++;
 						} else {
-							first = edge.last;
-							last = edge.first;
-						}
-						sort.elems.add(prim);
-						if (prim.outer) {
-							sort.outers++;
-						} else {
-							sort.inners++;
-						}
-						comp = new Comp(ref++, 1);
-						sort.refs.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);
-							}
-						} 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);
-							}
-						}
-					}
-					if (--sweep == 0) {
-						next = true;
-						sweep = feature.geom.elems.size();
-					}
-				}
-				if ((sort.prim == Pflag.LINE) && (sort.outers == 1) && (sort.inners == 0) && (first == last)) {
-					sort.prim = Pflag.AREA;
-				}
-				feature.geom = sort;
-			} 
-			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;
-				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;
+							feature.geom.elems.add(prim);
 						}
 					} else {
-						if (prim.forward) {
-							if (edge.first == last) {
-								last = edge.last;
-								closed.add(prim);
-							} else {
-								sorting.add(0, prim);
-								next = true;
-							}
+						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 {
-							if (edge.last == last) {
-								last = edge.first;
-								closed.add(prim);
-							} else {
-								sorting.add(0, prim);
-								next = true;
-							}
+							feature.geom.elems.add(prim);
 						}
 					}
-					if (first == last) {
-						sort.elems.addAll(closed);
-						next = true;
-					}
-					if (sorting.isEmpty() && sorting == outers) {
-						sorting = inners;
-						next = true;
-					}
-				}
-				feature.geom = sort;
-			}
+				}
+				if (--sweep == 0) {
+					next = true;
+					sweep = feature.geom.elems.size();
+				}
+			}
+			if ((sort.prim == Pflag.LINE) && (sort.outers == 1) && (sort.inners == 0) && (first == last)) {
+				sort.prim = Pflag.AREA;
+			}
+			feature.geom = sort;
+		}
+		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;
 		}
 	}
@@ -779,13 +753,18 @@
 		lat = lon = llon = llat = 0;
 		double sigma = 0;
-		GeomIterator it = new GeomIterator(geom);
-		it.nextComp();
-		while (it.hasNode()) {
-			llon = lon;
-			llat = lat;
-			node = it.next();
-			lat = node.lat;
-			lon = node.lon;
-			sigma += (lon * Math.sin(llat)) - (llon * Math.sin(lat));
+		GeomIterator git = new GeomIterator(geom);
+		if (git.hasComp()) {
+			git.nextComp();
+			while (git.hasEdge()) {
+				git.nextEdge();
+				while (git.hasNode()) {
+					llon = lon;
+					llat = lat;
+					node = git.next();
+					lat = node.lat;
+					lon = node.lon;
+					sigma += (lon * Math.sin(llat)) - (llon * Math.sin(lat));
+				}
+			}
 		}
 		return sigma / 2.0;
@@ -805,17 +784,24 @@
 		lat = lon = llon = llat = 0;
 		double sigma = 0;
-		GeomIterator it = new GeomIterator(geom);
-		it.nextComp();
-		if (it.hasNode()) {
-			node = it.next();
-			lat = node.lat;
-			lon = node.lon;
-			while (it.hasNode()) {
-				llon = lon;
-				llat = lat;
-				node = it.next();
-				lat = node.lat;
-				lon = node.lon;
-				sigma += Math.acos(Math.sin(lat) * Math.sin(llat) + Math.cos(lat) * Math.cos(llat) * Math.cos(llon - lon));
+		boolean first = true;
+		GeomIterator git = new GeomIterator(geom);
+		while (git.hasComp()) {
+			git.nextComp();
+			while (git.hasEdge()) {
+				git.nextEdge();
+				while (git.hasNode()) {
+					node = git.next();
+					if (first) {
+						first = false;
+						lat = node.lat;
+						lon = node.lon;
+					} else {
+						llat = lat;
+						llon = lon;
+						lat = node.lat;
+						lon = node.lon;
+						sigma += Math.acos(Math.sin(lat) * Math.sin(llat) + Math.cos(lat) * Math.cos(llat) * Math.cos(llon - lon));
+					}
+				}
 			}
 		}
@@ -832,56 +818,72 @@
 			return nodes.get(feature.geom.elems.get(0).id);
 		case LINE:
-			GeomIterator it = new GeomIterator(feature.geom);
-			it.nextComp();
-			while (it.hasNode()) {
-				Snode node = it.next();
-				lat = node.lat;
-				lon = node.lon;
-				if (first) {
-					first = false;
-				} else {
-					sarc += (Math.acos(Math.cos(lon - llon) * Math.cos(lat - llat)));
-				}
-				llat = lat;
-				llon = lon;
+			GeomIterator git = new GeomIterator(feature.geom);
+			while (git.hasComp()) {
+				git.nextComp();
+				while (git.hasEdge()) {
+					git.nextEdge();
+					while (git.hasNode()) {
+						Snode node = git.next();
+						lat = node.lat;
+						lon = node.lon;
+						if (first) {
+							first = false;
+						} else {
+							sarc += (Math.acos(Math.cos(lon - llon) * Math.cos(lat - llat)));
+						}
+						llat = lat;
+						llon = lon;
+					}
+				}
 			}
 			double harc = sarc / 2;
 			sarc = 0;
 			first = true;
-			it = new GeomIterator(feature.geom);
-			while (it.hasNode()) {
-				it.nextComp();
-				Snode node = it.next();
-				lat = node.lat;
-				lon = node.lon;
-				if (first) {
-					first = false;
-				} else {
-					sarc = (Math.acos(Math.cos(lon - llon) * Math.cos(lat - llat)));
-					if (sarc > harc)
-						break;
-				}
-				harc -= sarc;
-				llat = lat;
-				llon = lon;
+			git = new GeomIterator(feature.geom);
+			while (git.hasComp()) {
+				git.nextComp();
+				while (git.hasEdge()) {
+					git.nextEdge();
+					while (git.hasNode()) {
+						git.nextComp();
+						Snode node = git.next();
+						lat = node.lat;
+						lon = node.lon;
+						if (first) {
+							first = false;
+						} else {
+							sarc = (Math.acos(Math.cos(lon - llon) * Math.cos(lat - llat)));
+							if (sarc > harc)
+								break;
+						}
+						harc -= sarc;
+						llat = lat;
+						llon = lon;
+					}
+				}
 			}
 			return new Snode(llat + ((lat - llat) * harc / sarc), llon + ((lon - llon) * harc / sarc));
 		case AREA:
-			GeomIterator bit = new GeomIterator(feature.geom);
-			bit.nextComp();
-			while (bit.hasNode()) {
-				Snode node = bit.next();
-				lat = node.lat;
-				lon = node.lon;
-				if (first) {
-					first = false;
-				} else {
-					double arc = (Math.acos(Math.cos(lon - llon) * Math.cos(lat - llat)));
-					slat += ((lat + llat) / 2 * arc);
-					slon += ((lon + llon) / 2 * arc);
-					sarc += arc;
-				}
-				llon = lon;
-				llat = lat;
+			git = new GeomIterator(feature.geom);
+			while (git.hasComp()) {
+				git.nextComp();
+				while (git.hasEdge()) {
+					git.nextEdge();
+					while (git.hasNode()) {
+						Snode node = git.next();
+						lat = node.lat;
+						lon = node.lon;
+						if (first) {
+							first = false;
+						} else {
+							double arc = (Math.acos(Math.cos(lon - llon) * Math.cos(lat - llat)));
+							slat += ((lat + llat) / 2 * arc);
+							slon += ((lon + llon) / 2 * arc);
+							sarc += arc;
+						}
+						llon = lon;
+						llat = lat;
+					}
+				}
 			}
 			return new Snode((sarc > 0.0 ? slat / sarc : 0.0), (sarc > 0.0 ? slon / sarc : 0.0));
Index: applications/editors/josm/plugins/smed2/src/smed2/MapImage.java
===================================================================
--- applications/editors/josm/plugins/smed2/src/smed2/MapImage.java	(revision 30313)
+++ applications/editors/josm/plugins/smed2/src/smed2/MapImage.java	(revision 30314)
@@ -34,6 +34,4 @@
 public class MapImage extends ImageryLayer implements ZoomChangeListener, MapContext {
 
-	private Smed2Action dlg;
-
 	double top;
 	double bottom;
@@ -44,7 +42,6 @@
 	int zoom;
 	
-	public MapImage(ImageryInfo info, Smed2Action d) {
+	public MapImage(ImageryInfo info) {
 		super(info);
-		dlg = d;
 		MapView.addZoomChangeListener(this);
 		zoomChanged();
@@ -79,5 +76,5 @@
 		g2.setFont(new Font("Arial", Font.BOLD, 20));
 		g2.drawString(("Z" + zoom), (rect.x + rect.width - 40), (rect.y + rect.height - 10));
-		Renderer.reRender(g2, zoom, Math.pow(2, (zoom-12)), dlg.map, this);
+		Renderer.reRender(g2, zoom, Math.pow(2, (zoom-12)), Smed2Action.map, this);
 	}
 
Index: applications/editors/josm/plugins/smed2/src/smed2/Smed2Action.java
===================================================================
--- applications/editors/josm/plugins/smed2/src/smed2/Smed2Action.java	(revision 30313)
+++ applications/editors/josm/plugins/smed2/src/smed2/Smed2Action.java	(revision 30314)
@@ -134,5 +134,5 @@
 
 		// System.out.println("hello");
-		rendering = new MapImage(new ImageryInfo("OpenSeaMap"), this);
+		rendering = new MapImage(new ImageryInfo("OpenSeaMap"));
 		rendering.setBackgroundLayer(true);
 		Main.main.addLayer(rendering);
@@ -162,5 +162,5 @@
 			newLayer.data.addDataSetListener(dataSetListener);
 			data = newLayer.data;
-//			makeMap();
+			makeMap();
 		} else {
 			data = null;
@@ -184,5 +184,5 @@
 						Feature id = map.index.get(feature.getUniqueId());
 						if (id != null) {
-//							panelMain.parseMark(id);
+							panelMain.parseMark(id);
 							showFrame.setVisible(true);
 							showFrame.showFeature(feature, map);
@@ -214,15 +214,17 @@
 			}
 			for (Way way : data.getWays()) {
-				map.addEdge(way.getUniqueId());
-				for (Node node : way.getNodes()) {
-					map.addToEdge((node.getUniqueId()));
-				}
-				for (Entry<String, String> entry : way.getKeys().entrySet()) {
-					map.addTag(entry.getKey(), entry.getValue());
-				}
-				map.tagsDone(way.getUniqueId());
+				if (way.getNodesCount() > 0) {
+					map.addEdge(way.getUniqueId());
+					for (Node node : way.getNodes()) {
+						map.addToEdge((node.getUniqueId()));
+					}
+					for (Entry<String, String> entry : way.getKeys().entrySet()) {
+						map.addTag(entry.getKey(), entry.getValue());
+					}
+					map.tagsDone(way.getUniqueId());
+				}
 			}
 			for (Relation rel : data.getRelations()) {
-				if (rel.isMultipolygon()) {
+				if (rel.isMultipolygon() && (rel.getMembersCount() > 0)) {
 					map.addArea(rel.getUniqueId());
 					for (RelationMember mem : rel.getMembers()) {
@@ -230,9 +232,9 @@
 							map.addToArea(mem.getUniqueId(), (mem.getRole().equals("outer")));
 					}
-				}
-				for (Entry<String, String> entry : rel.getKeys().entrySet()) {
-					map.addTag(entry.getKey(), entry.getValue());
-				}
-				map.tagsDone(rel.getUniqueId());
+					for (Entry<String, String> entry : rel.getKeys().entrySet()) {
+						map.addTag(entry.getKey(), entry.getValue());
+					}
+					map.tagsDone(rel.getUniqueId());
+				}
 			}
 			if (rendering != null) rendering.zoomChanged();
