Index: /applications/editors/josm/plugins/smed2/src/s57/S57val.java
===================================================================
--- /applications/editors/josm/plugins/smed2/src/s57/S57val.java	(revision 29174)
+++ /applications/editors/josm/plugins/smed2/src/s57/S57val.java	(revision 29175)
@@ -1086,4 +1086,26 @@
 	}
 	
+	public static Object nullVal(Att att) {
+		switch (keys.get(att).conv) {
+		case A:
+		case S:
+			return "";
+		case E:
+			for (Enum<?> key : keys.get(att).map.keySet())
+				return key;
+		case L:
+			ArrayList<Enum<?>> list = new ArrayList<Enum<?>>();
+			for (Enum<?> key : keys.get(att).map.keySet()) {
+				list.add(key);
+				return list;
+			}
+		case I:
+			return null;
+		case F:
+			return null;
+		}
+		return null;
+	}
+	
 	public static String decodeValue(String val, Integer attl) {          // Convert S57 attribute value string to OSeaM attribute value string
 		Att att = S57att.lookupAttribute(attl);
Index: /applications/editors/josm/plugins/smed2/src/seamap/Renderer.java
===================================================================
--- /applications/editors/josm/plugins/smed2/src/seamap/Renderer.java	(revision 29174)
+++ /applications/editors/josm/plugins/smed2/src/seamap/Renderer.java	(revision 29175)
@@ -14,5 +14,12 @@
 import java.awt.geom.Point2D;
 import java.util.ArrayList;
+import java.util.EnumMap;
+import java.util.HashMap;
 
+import s57.S57att.Att;
+import s57.S57obj.Obj;
+import s57.S57val.ColCOL;
+import s57.S57val.*;
+import s57.S57val;
 import seamap.SeaMap.*;
 import symbols.Symbols;
@@ -40,7 +47,25 @@
 	}
 	
-	public static void symbol(Feature feature, ArrayList<Instr> symbol) {
+	public static EnumMap<Att, AttItem> getAtts(Feature feature, Obj obj, int idx) {
+		HashMap<Integer, EnumMap<Att, AttItem>> objs = feature.objs.get(obj);
+		if (objs == null) return null;
+		else return objs.get(idx);
+	}
+	
+	public static Object getAttVal(Feature feature, Obj obj, int idx, Att att) {
+		EnumMap<Att, AttItem> atts = getAtts(feature, obj, idx);
+		if (atts == null) return  S57val.nullVal(att);
+		else {
+			AttItem item = atts.get(att);
+			if (item == null) return S57val.nullVal(att);
+			return item.val;
+		}
+	}
+	
+	public static void symbol(Feature feature, ArrayList<Instr> symbol, Obj obj) {
 		Point2D point = helper.getPoint(map.nodes.get(feature.refs));
-		Symbols.drawSymbol(g2, symbol, sScale, point.getX(), point.getY(), null, null);
+		ArrayList<ColCOL> colours = (ArrayList<ColCOL>) getAttVal(feature, obj, 0, Att.COLOUR);
+		ArrayList<ColPAT> pattern = (ArrayList<ColPAT>) getAttVal(feature, obj, 0, Att.COLPAT);
+		Symbols.drawSymbol(g2, symbol, sScale, point.getX(), point.getY(), null, new Scheme(pattern, colours));
 	}
 	
Index: /applications/editors/josm/plugins/smed2/src/seamap/Rules.java
===================================================================
--- /applications/editors/josm/plugins/smed2/src/seamap/Rules.java	(revision 29174)
+++ /applications/editors/josm/plugins/smed2/src/seamap/Rules.java	(revision 29175)
@@ -11,19 +11,13 @@
 
 import java.util.ArrayList;
-import java.util.EnumMap;
-import java.util.HashMap;
 
-import s57.S57att;
-import s57.S57val.BcnSHP;
+import s57.S57val.*;
 import s57.S57att.*;
-import s57.S57obj;
 import s57.S57obj.*;
-import s57.S57val;
-import s57.S57val.*;
 
 import seamap.SeaMap.AttItem;
 import seamap.SeaMap.Feature;
 import symbols.Beacons;
-import symbols.Symbols.Instr;
+import symbols.Buoys;
 
 public class Rules {
@@ -106,6 +100,6 @@
 	
 	private static void shoreline(ArrayList<Feature> features) {
-		for (Feature feature : features) {
-		}
+//		for (Feature feature : features) {
+//		}
 	}
 	private static void pipelines(ArrayList<Feature> features) {}
@@ -131,25 +125,33 @@
 	private static void gauges(ArrayList<Feature> features) {}
 	private static void platforms(ArrayList<Feature> features) {}
-	private static void buoys(ArrayList<Feature> features) {}
+	private static void buoys(ArrayList<Feature> features) {
+		for (Feature feature : features) {
+			BoySHP shape = (BoySHP) Renderer.getAttVal(feature, feature.type, 0, Att.BOYSHP);
+			Renderer.symbol(feature, Buoys.Shapes.get(shape), feature.type);
+		}
+	}
 	private static void beacons(ArrayList<Feature> features) {
 		for (Feature feature : features) {
-			BcnSHP shape;
-			HashMap<Integer, EnumMap<Att, AttItem>> objs = feature.objs.get(feature.type);
-			if (objs == null) shape = BcnSHP.BCN_UNKN;
-			else {
-				EnumMap<Att, AttItem> atts = objs.get(0);
-				if (atts == null) shape = BcnSHP.BCN_UNKN;
-				else {
-					AttItem item = atts.get(Att.BCNSHP);
-					if (item == null) shape = BcnSHP.BCN_UNKN;
-					else shape = (BcnSHP) item.val;
+			BcnSHP shape = (BcnSHP) Renderer.getAttVal(feature, feature.type, 0, Att.BCNSHP);
+			if (((shape == BcnSHP.BCN_PRCH) || (shape == BcnSHP.BCN_WTHY)) && (feature.type == Obj.BCNLAT)) {
+				CatLAM cat = (CatLAM) Renderer.getAttVal(feature, feature.type, 0, Att.CATLAM);
+				switch (cat) {
+				case LAM_PORT:
+					if (shape == BcnSHP.BCN_PRCH)
+						Renderer.symbol(feature, Beacons.PerchPort, feature.type);
+					else
+						Renderer.symbol(feature, Beacons.WithyPort, feature.type);
+					break;
+				case LAM_STBD:
+					if (shape == BcnSHP.BCN_PRCH)
+						Renderer.symbol(feature, Beacons.PerchStarboard, feature.type);
+					else
+						Renderer.symbol(feature, Beacons.WithyStarboard, feature.type);
+					break;
+				default:
+					Renderer.symbol(feature, Beacons.Stake, feature.type);
 				}
-			}
-			if (shape == BcnSHP.BCN_PRCH) {
-				
-			} else if (shape == BcnSHP.BCN_WTHY) {
-					
 			} else {
-				Renderer.symbol(feature, Beacons.Shapes.get(shape));
+				Renderer.symbol(feature, Beacons.Shapes.get(shape), feature.type);
 			}
 		}
Index: /applications/editors/josm/plugins/smed2/src/smed2/MapImage.java
===================================================================
--- /applications/editors/josm/plugins/smed2/src/smed2/MapImage.java	(revision 29174)
+++ /applications/editors/josm/plugins/smed2/src/smed2/MapImage.java	(revision 29175)
@@ -24,14 +24,12 @@
 
 	private SeaMap mapdata;
-//	private Params imageParams;
-	private Renderer renderer;
 
-	private double top;
-	private double bottom;
-	private double left;
-	private double right;
-	private double width;
-	private double height;
-	private int zoom;
+	double top;
+	double bottom;
+	double left;
+	double right;
+	double width;
+	double height;
+	int zoom;
 	
 	public MapImage(ImageryInfo info, SeaMap map) {
Index: /applications/editors/josm/plugins/smed2/src/smed2/Smed2Action.java
===================================================================
--- /applications/editors/josm/plugins/smed2/src/smed2/Smed2Action.java	(revision 29174)
+++ /applications/editors/josm/plugins/smed2/src/smed2/Smed2Action.java	(revision 29175)
@@ -12,5 +12,4 @@
 import org.openstreetmap.josm.gui.MapView;
 import org.openstreetmap.josm.gui.MapView.EditLayerChangeListener;
-import org.openstreetmap.josm.gui.NavigatableComponent.ZoomChangeListener;
 import org.openstreetmap.josm.gui.layer.*;
 import org.openstreetmap.josm.data.SelectionChangedListener;
Index: /applications/editors/josm/plugins/smed2/src/symbols/Buoys.java
===================================================================
--- /applications/editors/josm/plugins/smed2/src/symbols/Buoys.java	(revision 29174)
+++ /applications/editors/josm/plugins/smed2/src/symbols/Buoys.java	(revision 29175)
@@ -14,5 +14,7 @@
 import java.awt.geom.*;
 import java.util.ArrayList;
-
+import java.util.EnumMap;
+
+import s57.S57val.BoySHP;
 import symbols.Symbols.*;
 
@@ -247,3 +249,10 @@
     Super.add(new Instr(Prim.PLIN, p));
 	}
+	
+	public static final EnumMap<BoySHP, ArrayList<Instr>> Shapes = new EnumMap<BoySHP, ArrayList<Instr>>(BoySHP.class);
+	static {
+		Shapes.put(BoySHP.BOY_UNKN, Buoys.Pillar); Shapes.put(BoySHP.BOY_CONE, Buoys.Cone); Shapes.put(BoySHP.BOY_CAN, Buoys.Can);
+		Shapes.put(BoySHP.BOY_SPHR, Buoys.Sphere); Shapes.put(BoySHP.BOY_PILR, Buoys.Pillar); Shapes.put(BoySHP.BOY_SPAR, Buoys.Spar);
+		Shapes.put(BoySHP.BOY_BARL, Buoys.Barrel); Shapes.put(BoySHP.BOY_SUPR, Buoys.Super); Shapes.put(BoySHP.BOY_ICE, Buoys.Ice);
+	}
 }
