Index: /applications/editors/josm/plugins/smed2/src/seamap/Rules.java
===================================================================
--- /applications/editors/josm/plugins/smed2/src/seamap/Rules.java	(revision 29175)
+++ /applications/editors/josm/plugins/smed2/src/seamap/Rules.java	(revision 29176)
@@ -16,8 +16,10 @@
 import s57.S57obj.*;
 
-import seamap.SeaMap.AttItem;
-import seamap.SeaMap.Feature;
+import seamap.SeaMap.*;
 import symbols.Beacons;
 import symbols.Buoys;
+import symbols.Harbours;
+import symbols.Landmarks;
+import symbols.Symbols.Instr;
 
 public class Rules {
@@ -114,15 +116,100 @@
 	private static void distances(ArrayList<Feature> features) {}
 	private static void ports(ArrayList<Feature> features) {}
-	private static void landmarks(ArrayList<Feature> features) {}
-	private static void moorings(ArrayList<Feature> features) {}
+	private static void landmarks(ArrayList<Feature> features) {
+		for (Feature feature : features) {
+			ArrayList<CatLMK> cats = (ArrayList<CatLMK>) Renderer.getAttVal(feature, feature.type, 0, Att.CATLMK);
+			ArrayList<Instr> catSym = Landmarks.Shapes.get(cats.get(0));
+			ArrayList<FncFNC> fncs = (ArrayList<FncFNC>) Renderer.getAttVal(feature, feature.type, 0, Att.FUNCTN);
+			ArrayList<Instr> fncSym = Landmarks.Funcs.get(fncs.get(0));
+			if ((fncs.get(0) == FncFNC.FNC_CHCH) && (cats.get(0) == CatLMK.LMK_TOWR)) catSym = Landmarks.ChurchTower;
+			Renderer.symbol(feature, catSym, feature.type);
+			Renderer.symbol(feature, fncSym, feature.type);
+		}
+	}
+	private static void moorings(ArrayList<Feature> features) {
+		for (Feature feature : features) {
+			CatMOR cat = (CatMOR) Renderer.getAttVal(feature, feature.type, 0, Att.CATMOR);
+			switch (cat) {
+			case MOR_DLPN:
+				Renderer.symbol(feature, Harbours.Dolphin, feature.type);
+				break;
+			case MOR_DDPN:
+				Renderer.symbol(feature, Harbours.DeviationDolphin, feature.type);
+				break;
+			case MOR_BLRD:
+			case MOR_POST:
+				Renderer.symbol(feature, Harbours.Bollard, feature.type);
+				break;
+			case MOR_BUOY:
+				BoySHP shape = (BoySHP) Renderer.getAttVal(feature, feature.type, 0, Att.BOYSHP);
+				if (shape == BoySHP.BOY_UNKN) shape = BoySHP.BOY_SPHR;
+				Renderer.symbol(feature, Buoys.Shapes.get(shape), feature.type);
+				break;
+			}
+		}
+	}
 	private static void notices(ArrayList<Feature> features) {}
 	private static void marinas(ArrayList<Feature> features) {}
 	private static void bridges(ArrayList<Feature> features) {}
-	private static void lights(ArrayList<Feature> features) {}
-	private static void floats(ArrayList<Feature> features) {}
-	private static void signals(ArrayList<Feature> features) {}
 	private static void wrecks(ArrayList<Feature> features) {}
 	private static void gauges(ArrayList<Feature> features) {}
-	private static void platforms(ArrayList<Feature> features) {}
+	private static void lights(ArrayList<Feature> features) {
+		for (Feature feature : features) {
+			switch (feature.type) {
+			case LITMAJ:
+				Renderer.symbol(feature, Beacons.LightMajor, feature.type);
+				break;
+			case LITMIN:
+			case LIGHTS:
+				Renderer.symbol(feature, Beacons.LightMinor, feature.type);
+				break;
+			}
+		}
+	}
+	private static void signals(ArrayList<Feature> features) {
+		for (Feature feature : features) {
+			switch (feature.type) {
+			case SISTAT:
+			case SISTAW:
+				Renderer.symbol(feature, Harbours.SignalStation, feature.type);
+				break;
+			case RDOSTA:
+				Renderer.symbol(feature, Harbours.SignalStation, feature.type);
+				break;
+			case RADSTA:
+				Renderer.symbol(feature, Harbours.SignalStation, feature.type);
+				break;
+			case PILBOP:
+				Renderer.symbol(feature, Harbours.SignalStation, feature.type);
+				break;
+			case CGUSTA:
+//			Renderer.symbol(feature, Harbours.CGuardStation, feature.type);
+			break;
+			case RSCSTA:
+//				Renderer.symbol(feature, Harbours.RescueStation, feature.type);
+				break;
+			}
+		}
+	}
+	private static void floats(ArrayList<Feature> features) {
+		for (Feature feature : features) {
+			switch (feature.type) {
+			case LITVES:
+				Renderer.symbol(feature, Buoys.Super, feature.type);
+				break;
+			case LITFLT:
+				Renderer.symbol(feature, Buoys.Float, feature.type);
+				break;
+			case BOYINB:
+				Renderer.symbol(feature, Buoys.Storage, feature.type);
+				break;
+			}
+		}
+	}
+	private static void platforms(ArrayList<Feature> features) {
+		for (Feature feature : features) {
+			Renderer.symbol(feature, Landmarks.Platform, feature.type);
+		}
+	}
 	private static void buoys(ArrayList<Feature> features) {
 		for (Feature feature : features) {
Index: /applications/editors/josm/plugins/smed2/src/symbols/Beacons.java
===================================================================
--- /applications/editors/josm/plugins/smed2/src/symbols/Beacons.java	(revision 29175)
+++ /applications/editors/josm/plugins/smed2/src/symbols/Beacons.java	(revision 29176)
@@ -63,4 +63,5 @@
 	public static final ArrayList<Instr> LightMajor = new ArrayList<Instr>();
 	static {
+		LightMajor.add(new Instr(Prim.FILL, Color.black));
 		Path2D.Double p = new Path2D.Double(); p.setWindingRule(GeneralPath.WIND_NON_ZERO);
 		p.moveTo(0.0,-7.0); p.curveTo(-9.3,-6.5,-9.3,6.5,0.0,7.0); p.curveTo(9.3,6.5,9.3,-6.5,0.0,-7.0); p.closePath();
@@ -71,4 +72,5 @@
 	public static final ArrayList<Instr> LightMinor = new ArrayList<Instr>();
 	static {
+		LightMinor.add(new Instr(Prim.FILL, Color.black));
 		Path2D.Double p = new Path2D.Double(); p.moveTo(0.0,-26.5); p.lineTo(6.0,-8.4); p.lineTo(25.1,-8.4); p.lineTo(9.6,3.0);
 		p.lineTo(15.4,21.4); p.lineTo(0.0,9.8); p.lineTo(-15.4,21.4); p.lineTo(-9.6,3.0); p.lineTo(-25.1,-8.4); p.lineTo(-6.0,-8.4); p.closePath();
Index: /applications/editors/josm/plugins/smed2/src/symbols/Landmarks.java
===================================================================
--- /applications/editors/josm/plugins/smed2/src/symbols/Landmarks.java	(revision 29175)
+++ /applications/editors/josm/plugins/smed2/src/symbols/Landmarks.java	(revision 29176)
@@ -18,7 +18,9 @@
 import java.awt.geom.Rectangle2D;
 import java.util.ArrayList;
-
-import symbols.Symbols.Instr;
-import symbols.Symbols.Prim;
+import java.util.EnumMap;
+
+import s57.S57val.*;
+import symbols.Symbols.*;
+
 
 public class Landmarks {
@@ -210,3 +212,24 @@
 		Windsock.add(new Instr(Prim.PLIN, p));
 	}
+	
+	public static final EnumMap<CatLMK, ArrayList<Instr>> Shapes = new EnumMap<CatLMK, ArrayList<Instr>>(CatLMK.class);
+	static {
+		Shapes.put(CatLMK.LMK_CARN, Beacons.Cairn); Shapes.put(CatLMK.LMK_CHMY, Landmarks.Chimney);
+		Shapes.put(CatLMK.LMK_DISH, Landmarks.DishAerial); Shapes.put(CatLMK.LMK_FLAG, Landmarks.Flagstaff); Shapes.put(CatLMK.LMK_FLAR, Landmarks.FlareStack);
+		Shapes.put(CatLMK.LMK_MAST, Landmarks.Mast); Shapes.put(CatLMK.LMK_WNDS, Landmarks.Windsock); Shapes.put(CatLMK.LMK_MNMT, Landmarks.Monument);
+		Shapes.put(CatLMK.LMK_CLMN, Landmarks.Monument); Shapes.put(CatLMK.LMK_MEML, Landmarks.Monument); Shapes.put(CatLMK.LMK_OBLK, Landmarks.Monument);
+		Shapes.put(CatLMK.LMK_STAT, Landmarks.Monument); Shapes.put(CatLMK.LMK_CROS, Landmarks.Cross); Shapes.put(CatLMK.LMK_DOME, Landmarks.Dome);
+		Shapes.put(CatLMK.LMK_RADR, Landmarks.RadioMast); Shapes.put(CatLMK.LMK_TOWR, Landmarks.LandTower); Shapes.put(CatLMK.LMK_WNDM, Landmarks.Windmill);
+		Shapes.put(CatLMK.LMK_WNDG, Landmarks.WindMotor); Shapes.put(CatLMK.LMK_SPIR, Landmarks.Spire); Shapes.put(CatLMK.LMK_BLDR, Beacons.Cairn);
+		Shapes.put(CatLMK.LMK_MNRT, Landmarks.Minaret); Shapes.put(CatLMK.LMK_WTRT, Landmarks.WaterTower);
+	}
+
+	public static final EnumMap<FncFNC, ArrayList<Instr>> Funcs = new EnumMap<FncFNC, ArrayList<Instr>>(FncFNC.class);
+	static {
+		Funcs.put(FncFNC.FNC_CHCH, Landmarks.Church); Funcs.put(FncFNC.FNC_CHPL, Landmarks.Church); Funcs.put(FncFNC.FNC_TMPL, Landmarks.Temple);
+		Funcs.put(FncFNC.FNC_PGDA, Landmarks.Temple); Funcs.put(FncFNC.FNC_SHSH, Landmarks.Temple); Funcs.put(FncFNC.FNC_BTMP, Landmarks.Temple);
+		Funcs.put(FncFNC.FNC_MOSQ, Landmarks.Minaret); Funcs.put(FncFNC.FNC_MRBT, Landmarks.Spire); Funcs.put(FncFNC.FNC_COMM, Landmarks.RadioMast);
+		Funcs.put(FncFNC.FNC_TV, Landmarks.RadioMast); Funcs.put(FncFNC.FNC_RADO, Landmarks.RadioMast); Funcs.put(FncFNC.FNC_RADR, Landmarks.RadioMast);
+		Funcs.put(FncFNC.FNC_LGHT, Beacons.LightMajor); Funcs.put(FncFNC.FNC_MCWV, Landmarks.RadioMast);
+	}
 }
Index: /applications/editors/josm/plugins/smed2/src/symbols/Symbols.java
===================================================================
--- /applications/editors/josm/plugins/smed2/src/symbols/Symbols.java	(revision 29175)
+++ /applications/editors/josm/plugins/smed2/src/symbols/Symbols.java	(revision 29176)
@@ -125,148 +125,150 @@
 		g2.translate(x, y);
 		g2.scale(scale, scale);
-		for (Instr item : symbol) {
-			switch (item.type) {
-			case BBOX:
-				Rectangle bbox = (Rectangle) item.params;
-				double dx = 0.0;
-				double dy = 0.0;
-				if (dd != null) {
-					g2.transform(dd.t);
-					switch (dd.h) {
-					case CC:
-						dx = bbox.x + (bbox.width / 2.0);
-						dy = bbox.y + (bbox.height / 2.0);
-						break;
-					case TL:
-						dx = bbox.x;
-						dy = bbox.y;
-						break;
-					case TR:
-						dx = bbox.x + bbox.width;
-						dy = bbox.y;
-						break;
-					case TC:
-						dx = bbox.x + (bbox.width / 2.0);
-						dy = bbox.y;
-						break;
-					case LC:
-						dx = bbox.x;
-						dy = bbox.y + (bbox.height / 2.0);
-						break;
-					case RC:
-						dx = bbox.x + bbox.width;
-						dy = bbox.y + (bbox.height / 2.0);
-						break;
-					case BL:
-						dx = bbox.x;
-						dy = bbox.y + bbox.height;
-						break;
-					case BR:
-						dx = bbox.x + bbox.width;
-						dy = bbox.y + bbox.height;
-						break;
-					case BC:
-						dx = bbox.x + (bbox.width / 2.0);
-						dy = bbox.y + bbox.height;
-						break;
+		if (symbol != null) {
+			for (Instr item : symbol) {
+				switch (item.type) {
+				case BBOX:
+					Rectangle bbox = (Rectangle) item.params;
+					double dx = 0.0;
+					double dy = 0.0;
+					if (dd != null) {
+						g2.transform(dd.t);
+						switch (dd.h) {
+						case CC:
+							dx = bbox.x + (bbox.width / 2.0);
+							dy = bbox.y + (bbox.height / 2.0);
+							break;
+						case TL:
+							dx = bbox.x;
+							dy = bbox.y;
+							break;
+						case TR:
+							dx = bbox.x + bbox.width;
+							dy = bbox.y;
+							break;
+						case TC:
+							dx = bbox.x + (bbox.width / 2.0);
+							dy = bbox.y;
+							break;
+						case LC:
+							dx = bbox.x;
+							dy = bbox.y + (bbox.height / 2.0);
+							break;
+						case RC:
+							dx = bbox.x + bbox.width;
+							dy = bbox.y + (bbox.height / 2.0);
+							break;
+						case BL:
+							dx = bbox.x;
+							dy = bbox.y + bbox.height;
+							break;
+						case BR:
+							dx = bbox.x + bbox.width;
+							dy = bbox.y + bbox.height;
+							break;
+						case BC:
+							dx = bbox.x + (bbox.width / 2.0);
+							dy = bbox.y + bbox.height;
+							break;
+						}
+						g2.translate(-dx, -dy);
 					}
-					g2.translate(-dx, -dy);
-				}
-				break;
-			case COLR:
-				if ((cs != null) && (cs.col != null)) {
-					for (Instr patch : (ArrayList<Instr>) item.params) {
-						switch (patch.type) {
-						case P1:
-							if (cn > 0) {
-								g2.setPaint(bodyColours.get(cs.col.get(0)));
-								g2.fill((Path2D.Double) patch.params);
+					break;
+				case COLR:
+					if ((cs != null) && (cs.col != null)) {
+						for (Instr patch : (ArrayList<Instr>) item.params) {
+							switch (patch.type) {
+							case P1:
+								if (cn > 0) {
+									g2.setPaint(bodyColours.get(cs.col.get(0)));
+									g2.fill((Path2D.Double) patch.params);
+								}
+								break;
+							case P2:
+								if (cn > 0) {
+									if (cn > 1) {
+										g2.setPaint(bodyColours.get(cs.col.get(1)));
+									} else {
+										g2.setPaint(bodyColours.get(cs.col.get(0)));
+									}
+									g2.fill((Path2D.Double) patch.params);
+								}
+								break;
+							case H2:
+								if ((cn > 1) && (cs.pat.get(0) == ColPAT.PAT_HORI)) {
+									g2.setPaint(bodyColours.get(cs.col.get(cs.col.size() - pn)));
+									g2.fill((Path2D.Double) patch.params);
+								}
+								break;
+							case H3:
+								if ((cn == 3) && (cs.pat.get(0) == ColPAT.PAT_HORI)) {
+									g2.setPaint(bodyColours.get(cs.col.get(1)));
+									g2.fill((Path2D.Double) patch.params);
+								}
+								break;
+							case H4:
+								if ((cn == 4) && (cs.pat.get(0) == ColPAT.PAT_HORI)) {
+									g2.setPaint(bodyColours.get(cs.col.get(1)));
+									g2.fill((Path2D.Double) patch.params);
+								}
+								break;
+							case H5:
+								if ((cn == 4) && (cs.pat.get(0) == ColPAT.PAT_HORI)) {
+									g2.setPaint(bodyColours.get(cs.col.get(2)));
+									g2.fill((Path2D.Double) patch.params);
+								}
+								break;
+							case V2:
+								if ((cn > 1) && (cs.pat.get(0) == ColPAT.PAT_VERT)) {
+									g2.setPaint(bodyColours.get(cs.col.get(cs.col.size() - pn)));
+									g2.fill((Path2D.Double) patch.params);
+								}
+								break;
 							}
-							break;
-						case P2:
-							if (cn > 0) {
-								if (cn > 1) {
-									g2.setPaint(bodyColours.get(cs.col.get(1)));
-								} else {
-									g2.setPaint(bodyColours.get(cs.col.get(0)));
-								}
-								g2.fill((Path2D.Double) patch.params);
-							}
-							break;
-						case H2:
-							if ((cn > 1) && (cs.pat.get(0) == ColPAT.PAT_HORI)) {
-								g2.setPaint(bodyColours.get(cs.col.get(cs.col.size() - pn)));
-								g2.fill((Path2D.Double) patch.params);
-							}
-							break;
-						case H3:
-							if ((cn == 3) && (cs.pat.get(0) == ColPAT.PAT_HORI)) {
-								g2.setPaint(bodyColours.get(cs.col.get(1)));
-								g2.fill((Path2D.Double) patch.params);
-							}
-							break;
-						case H4:
-							if ((cn == 4) && (cs.pat.get(0) == ColPAT.PAT_HORI)) {
-								g2.setPaint(bodyColours.get(cs.col.get(1)));
-								g2.fill((Path2D.Double) patch.params);
-							}
-							break;
-						case H5:
-							if ((cn == 4) && (cs.pat.get(0) == ColPAT.PAT_HORI)) {
-								g2.setPaint(bodyColours.get(cs.col.get(2)));
-								g2.fill((Path2D.Double) patch.params);
-							}
-							break;
-						case V2:
-							if ((cn > 1) && (cs.pat.get(0) == ColPAT.PAT_VERT)) {
-								g2.setPaint(bodyColours.get(cs.col.get(cs.col.size() - pn)));
-								g2.fill((Path2D.Double) patch.params);
-							}
-							break;
 						}
 					}
+					break;
+				case STRK:
+					g2.setStroke((BasicStroke) item.params);
+					break;
+				case FILL:
+					g2.setPaint((Color) item.params);
+					break;
+				case LINE:
+					g2.draw((Line2D.Double) item.params);
+					break;
+				case RECT:
+					g2.draw((Rectangle2D.Double) item.params);
+					break;
+				case RRCT:
+					g2.draw((RoundRectangle2D.Double) item.params);
+					break;
+				case ELPS:
+					g2.draw((Ellipse2D.Double) item.params);
+					break;
+				case EARC:
+					g2.draw((Arc2D.Double) item.params);
+					break;
+				case PLIN:
+					g2.draw((Path2D.Double) item.params);
+					break;
+				case PGON:
+					g2.fill((Path2D.Double) item.params);
+					break;
+				case RSHP:
+					g2.fill((RectangularShape) item.params);
+					break;
+				case SYMB:
+					Symbol s = (Symbol) item.params;
+					drawSymbol(g2, s.instr, s.scale, s.x, s.y, s.delta, s.scheme);
+					break;
+				case FONT:
+					g2.setFont((Font) item.params);
+					break;
+				case TEXT:
+					Caption c = (Caption) item.params;
+					g2.drawString(c.str, c.x, c.y);
+					break;
 				}
-				break;
-			case STRK:
-				g2.setStroke((BasicStroke) item.params);
-				break;
-			case FILL:
-				g2.setPaint((Color) item.params);
-				break;
-			case LINE:
-				g2.draw((Line2D.Double) item.params);
-				break;
-			case RECT:
-				g2.draw((Rectangle2D.Double) item.params);
-				break;
-			case RRCT:
-				g2.draw((RoundRectangle2D.Double) item.params);
-				break;
-			case ELPS:
-				g2.draw((Ellipse2D.Double) item.params);
-				break;
-			case EARC:
-				g2.draw((Arc2D.Double) item.params);
-				break;
-			case PLIN:
-				g2.draw((Path2D.Double) item.params);
-				break;
-			case PGON:
-				g2.fill((Path2D.Double) item.params);
-				break;
-			case RSHP:
-				g2.fill((RectangularShape) item.params);
-				break;
-			case SYMB:
-				Symbol s = (Symbol) item.params;
-				drawSymbol(g2, s.instr, s.scale, s.x, s.y, s.delta, s.scheme);
-				break;
-			case FONT:
-				g2.setFont((Font)item.params);
-				break;
-			case TEXT:
-				Caption c = (Caption)item.params;
-				g2.drawString(c.str, c.x, c.y);
-				break;
 			}
 		}
