Index: /applications/editors/josm/plugins/smed2/src/panels/ShowFrame.java
===================================================================
--- /applications/editors/josm/plugins/smed2/src/panels/ShowFrame.java	(revision 30035)
+++ /applications/editors/josm/plugins/smed2/src/panels/ShowFrame.java	(revision 30036)
@@ -49,5 +49,4 @@
 		}
 
-		@Override
 		public Point2D getPoint(Snode coord) {
 			return new Point2D.Double(150, 150);
Index: /applications/editors/josm/plugins/smed2/src/seamap/Renderer.java
===================================================================
--- /applications/editors/josm/plugins/smed2/src/seamap/Renderer.java	(revision 30035)
+++ /applications/editors/josm/plugins/smed2/src/seamap/Renderer.java	(revision 30036)
@@ -28,35 +28,4 @@
 public class Renderer {
 
-	public static final EnumMap<ColCOL, Color> bodyColours = new EnumMap<ColCOL, Color>(ColCOL.class);
-	static {
-		bodyColours.put(ColCOL.COL_UNK, new Color(0, true));
-		bodyColours.put(ColCOL.COL_WHT, new Color(0xffffff));
-		bodyColours.put(ColCOL.COL_BLK, new Color(0x000000));
-		bodyColours.put(ColCOL.COL_RED, new Color(0xd40000));
-		bodyColours.put(ColCOL.COL_GRN, new Color(0x00d400));
-		bodyColours.put(ColCOL.COL_BLU, Color.blue);
-		bodyColours.put(ColCOL.COL_YEL, new Color(0xffd400));
-		bodyColours.put(ColCOL.COL_GRY, Color.gray);
-		bodyColours.put(ColCOL.COL_BRN, new Color(0x8b4513));
-		bodyColours.put(ColCOL.COL_AMB, new Color(0xfbf00f));
-		bodyColours.put(ColCOL.COL_VIO, new Color(0xee82ee));
-		bodyColours.put(ColCOL.COL_ORG, Color.orange);
-		bodyColours.put(ColCOL.COL_MAG, new Color(0xf000f0));
-		bodyColours.put(ColCOL.COL_PNK, Color.pink);
-	}
-
-	public static final EnumMap<ColPAT, Patt> pattMap = new EnumMap<ColPAT, Patt>(ColPAT.class);
-	static {
-		pattMap.put(ColPAT.PAT_UNKN, Patt.Z);
-		pattMap.put(ColPAT.PAT_HORI, Patt.H);
-		pattMap.put(ColPAT.PAT_VERT, Patt.V);
-		pattMap.put(ColPAT.PAT_DIAG, Patt.D);
-		pattMap.put(ColPAT.PAT_BRDR, Patt.B);
-		pattMap.put(ColPAT.PAT_SQUR, Patt.S);
-		pattMap.put(ColPAT.PAT_CROS, Patt.C);
-		pattMap.put(ColPAT.PAT_SALT, Patt.X);
-		pattMap.put(ColPAT.PAT_STRP, Patt.H);
-	}
-	
 	public static final double symbolScale[] = { 256.0, 128.0, 64.0, 32.0, 16.0, 8.0, 4.0, 2.0, 1.0, 0.61, 0.372, 0.227, 0.138, 0.0843, 0.0514, 0.0313, 0.0191, 0.0117, 0.007, 0.138 };
 
@@ -83,39 +52,22 @@
 	}
 
-	public static AttMap getAtts(Feature feature, Obj obj, int idx) {
-		HashMap<Integer, AttMap> 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) {
-		AttMap 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, Symbol symbol, Obj obj, Scheme scheme, Delta delta) {
-		Point2D point = context.getPoint(feature.centre);
-		if (obj == null) {
-			Symbols.drawSymbol(g2, symbol, sScale, point.getX(), point.getY(), scheme, delta);
-		} else {
-			ArrayList<Color> colours = new ArrayList<Color>();
-			for (ColCOL col : (ArrayList<ColCOL>)getAttVal(feature, obj, 0, Att.COLOUR)) {
-				colours.add(bodyColours.get(col));
-			}
-			ArrayList<Patt> patterns = new ArrayList<Patt>();
-			for(ColPAT pat: (ArrayList<ColPAT>) getAttVal(feature, obj, 0, Att.COLPAT)) {
-				patterns.add(pattMap.get(pat));
-			}
-			Symbols.drawSymbol(g2, symbol, sScale, point.getX(), point.getY(), new Scheme(patterns, colours), delta);
-		}
+	public static void symbol(Feature feature, Symbol symbol) {
+		Point2D point = context.getPoint(feature.centre);
+		Symbols.drawSymbol(g2, symbol, sScale, point.getX(), point.getY(), null, null);
+	}
+	
+	public static void symbol(Feature feature, Symbol symbol, Scheme scheme) {
+		Point2D point = context.getPoint(feature.centre);
+		Symbols.drawSymbol(g2, symbol, sScale, point.getX(), point.getY(), scheme, null);
+	}
+	
+	public static void symbol(Feature feature, Symbol symbol, Delta delta) {
+		Point2D point = context.getPoint(feature.centre);
+		Symbols.drawSymbol(g2, symbol, sScale, point.getX(), point.getY(), null, delta);
+	}
+	
+	public static void symbol(Feature feature, Symbol symbol, Scheme scheme, Delta delta) {
+		Point2D point = context.getPoint(feature.centre);
+		Symbols.drawSymbol(g2, symbol, sScale, point.getX(), point.getY(), scheme, delta);
 	}
 	
@@ -133,65 +85,65 @@
 		switch (symbols.size()) {
 		case 1:
-			symbol(feature, symbols.get(0), null, null, new Delta(Handle.CC, new AffineTransform()));
+			symbol(feature, symbols.get(0), new Delta(Handle.CC, new AffineTransform()));
 			break;
 		case 2:
-			symbol(feature, symbols.get(0), null, null, new Delta(Handle.RC, new AffineTransform()));
-			symbol(feature, symbols.get(1), null, null, new Delta(Handle.LC, new AffineTransform()));
+			symbol(feature, symbols.get(0), new Delta(Handle.RC, new AffineTransform()));
+			symbol(feature, symbols.get(1), new Delta(Handle.LC, new AffineTransform()));
 			break;
 		case 3:
-			symbol(feature, symbols.get(0), null, null, new Delta(Handle.BC, new AffineTransform()));
-			symbol(feature, symbols.get(1), null, null, new Delta(Handle.TR, new AffineTransform()));
-			symbol(feature, symbols.get(2), null, null, new Delta(Handle.TL, new AffineTransform()));
+			symbol(feature, symbols.get(0), new Delta(Handle.BC, new AffineTransform()));
+			symbol(feature, symbols.get(1), new Delta(Handle.TR, new AffineTransform()));
+			symbol(feature, symbols.get(2), new Delta(Handle.TL, new AffineTransform()));
 			break;
 		case 4:
-			symbol(feature, symbols.get(0), null, null, new Delta(Handle.BR, new AffineTransform()));
-			symbol(feature, symbols.get(1), null, null, new Delta(Handle.BL, new AffineTransform()));
-			symbol(feature, symbols.get(2), null, null, new Delta(Handle.TR, new AffineTransform()));
-			symbol(feature, symbols.get(3), null, null, new Delta(Handle.TL, new AffineTransform()));
+			symbol(feature, symbols.get(0), new Delta(Handle.BR, new AffineTransform()));
+			symbol(feature, symbols.get(1), new Delta(Handle.BL, new AffineTransform()));
+			symbol(feature, symbols.get(2), new Delta(Handle.TR, new AffineTransform()));
+			symbol(feature, symbols.get(3), new Delta(Handle.TL, new AffineTransform()));
 			break;
 		case 5:
-			symbol(feature, symbols.get(0), null, null, new Delta(Handle.BR, new AffineTransform()));
-			symbol(feature, symbols.get(1), null, null, new Delta(Handle.BL, new AffineTransform()));
-			symbol(feature, symbols.get(2), null, null, new Delta(Handle.TR, AffineTransform.getTranslateInstance(-bbox.width/2, 0)));
-			symbol(feature, symbols.get(3), null, null, new Delta(Handle.TC, new AffineTransform()));
-			symbol(feature, symbols.get(4), null, null, new Delta(Handle.TL, AffineTransform.getTranslateInstance(bbox.width/2, 0)));
+			symbol(feature, symbols.get(0), new Delta(Handle.BR, new AffineTransform()));
+			symbol(feature, symbols.get(1), new Delta(Handle.BL, new AffineTransform()));
+			symbol(feature, symbols.get(2), new Delta(Handle.TR, AffineTransform.getTranslateInstance(-bbox.width/2, 0)));
+			symbol(feature, symbols.get(3), new Delta(Handle.TC, new AffineTransform()));
+			symbol(feature, symbols.get(4), new Delta(Handle.TL, AffineTransform.getTranslateInstance(bbox.width/2, 0)));
 			break;
 		case 6:
-			symbol(feature, symbols.get(0), null, null, new Delta(Handle.BR, AffineTransform.getTranslateInstance(-bbox.width/2, 0)));
-			symbol(feature, symbols.get(1), null, null, new Delta(Handle.BC, new AffineTransform()));
-			symbol(feature, symbols.get(2), null, null, new Delta(Handle.BL, AffineTransform.getTranslateInstance(bbox.width/2, 0)));
-			symbol(feature, symbols.get(3), null, null, new Delta(Handle.TR, AffineTransform.getTranslateInstance(-bbox.width/2, 0)));
-			symbol(feature, symbols.get(4), null, null, new Delta(Handle.TC, new AffineTransform()));
-			symbol(feature, symbols.get(5), null, null, new Delta(Handle.TL, AffineTransform.getTranslateInstance(bbox.width/2, 0)));
+			symbol(feature, symbols.get(0), new Delta(Handle.BR, AffineTransform.getTranslateInstance(-bbox.width/2, 0)));
+			symbol(feature, symbols.get(1), new Delta(Handle.BC, new AffineTransform()));
+			symbol(feature, symbols.get(2), new Delta(Handle.BL, AffineTransform.getTranslateInstance(bbox.width/2, 0)));
+			symbol(feature, symbols.get(3), new Delta(Handle.TR, AffineTransform.getTranslateInstance(-bbox.width/2, 0)));
+			symbol(feature, symbols.get(4), new Delta(Handle.TC, new AffineTransform()));
+			symbol(feature, symbols.get(5), new Delta(Handle.TL, AffineTransform.getTranslateInstance(bbox.width/2, 0)));
 			break;
 		case 7:
-			symbol(feature, symbols.get(0), null, null, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, -bbox.height/2)));
-			symbol(feature, symbols.get(1), null, null, new Delta(Handle.RC, AffineTransform.getTranslateInstance(-bbox.width/2, 0)));
-			symbol(feature, symbols.get(2), null, null, new Delta(Handle.CC, new AffineTransform()));
-			symbol(feature, symbols.get(3), null, null, new Delta(Handle.LC, AffineTransform.getTranslateInstance(bbox.width/2, 0)));
-			symbol(feature, symbols.get(4), null, null, new Delta(Handle.TR, AffineTransform.getTranslateInstance(-bbox.width/2, bbox.height/2)));
-			symbol(feature, symbols.get(5), null, null, new Delta(Handle.TC, AffineTransform.getTranslateInstance(0, bbox.height/2)));
-			symbol(feature, symbols.get(6), null, null, new Delta(Handle.TL, AffineTransform.getTranslateInstance(bbox.width/2, bbox.height/2)));
+			symbol(feature, symbols.get(0), new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, -bbox.height/2)));
+			symbol(feature, symbols.get(1), new Delta(Handle.RC, AffineTransform.getTranslateInstance(-bbox.width/2, 0)));
+			symbol(feature, symbols.get(2), new Delta(Handle.CC, new AffineTransform()));
+			symbol(feature, symbols.get(3), new Delta(Handle.LC, AffineTransform.getTranslateInstance(bbox.width/2, 0)));
+			symbol(feature, symbols.get(4), new Delta(Handle.TR, AffineTransform.getTranslateInstance(-bbox.width/2, bbox.height/2)));
+			symbol(feature, symbols.get(5), new Delta(Handle.TC, AffineTransform.getTranslateInstance(0, bbox.height/2)));
+			symbol(feature, symbols.get(6), new Delta(Handle.TL, AffineTransform.getTranslateInstance(bbox.width/2, bbox.height/2)));
 			break;
 		case 8:
-			symbol(feature, symbols.get(0), null, null, new Delta(Handle.BR, AffineTransform.getTranslateInstance(0, -bbox.height/2)));
-			symbol(feature, symbols.get(1), null, null, new Delta(Handle.BL, AffineTransform.getTranslateInstance(0, -bbox.height/2)));
-			symbol(feature, symbols.get(2), null, null, new Delta(Handle.RC, AffineTransform.getTranslateInstance(-bbox.width/2, 0)));
-			symbol(feature, symbols.get(3), null, null, new Delta(Handle.CC, new AffineTransform()));
-			symbol(feature, symbols.get(4), null, null, new Delta(Handle.LC, AffineTransform.getTranslateInstance(bbox.width/2, 0)));
-			symbol(feature, symbols.get(5), null, null, new Delta(Handle.TR, AffineTransform.getTranslateInstance(-bbox.width/2, bbox.height/2)));
-			symbol(feature, symbols.get(6), null, null, new Delta(Handle.TC, AffineTransform.getTranslateInstance(0, bbox.height/2)));
-			symbol(feature, symbols.get(7), null, null, new Delta(Handle.TL, AffineTransform.getTranslateInstance(bbox.width/2, bbox.height/2)));
+			symbol(feature, symbols.get(0), new Delta(Handle.BR, AffineTransform.getTranslateInstance(0, -bbox.height/2)));
+			symbol(feature, symbols.get(1), new Delta(Handle.BL, AffineTransform.getTranslateInstance(0, -bbox.height/2)));
+			symbol(feature, symbols.get(2), new Delta(Handle.RC, AffineTransform.getTranslateInstance(-bbox.width/2, 0)));
+			symbol(feature, symbols.get(3), new Delta(Handle.CC, new AffineTransform()));
+			symbol(feature, symbols.get(4), new Delta(Handle.LC, AffineTransform.getTranslateInstance(bbox.width/2, 0)));
+			symbol(feature, symbols.get(5), new Delta(Handle.TR, AffineTransform.getTranslateInstance(-bbox.width/2, bbox.height/2)));
+			symbol(feature, symbols.get(6), new Delta(Handle.TC, AffineTransform.getTranslateInstance(0, bbox.height/2)));
+			symbol(feature, symbols.get(7), new Delta(Handle.TL, AffineTransform.getTranslateInstance(bbox.width/2, bbox.height/2)));
 			break;
 		case 9:
-			symbol(feature, symbols.get(0), null, null, new Delta(Handle.BR, AffineTransform.getTranslateInstance(-bbox.width/2, -bbox.height/2)));
-			symbol(feature, symbols.get(1), null, null, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, -bbox.height/2)));
-			symbol(feature, symbols.get(2), null, null, new Delta(Handle.BL, AffineTransform.getTranslateInstance(bbox.width/2, -bbox.height/2)));
-			symbol(feature, symbols.get(3), null, null, new Delta(Handle.RC, AffineTransform.getTranslateInstance(-bbox.width/2, 0)));
-			symbol(feature, symbols.get(4), null, null, new Delta(Handle.CC, new AffineTransform()));
-			symbol(feature, symbols.get(5), null, null, new Delta(Handle.LC, AffineTransform.getTranslateInstance(bbox.width/2, 0)));
-			symbol(feature, symbols.get(6), null, null, new Delta(Handle.TR, AffineTransform.getTranslateInstance(-bbox.width/2, bbox.height/2)));
-			symbol(feature, symbols.get(7), null, null, new Delta(Handle.TC, AffineTransform.getTranslateInstance(0, bbox.height/2)));
-			symbol(feature, symbols.get(8), null, null, new Delta(Handle.TL, AffineTransform.getTranslateInstance(bbox.width/2, bbox.height/2)));
+			symbol(feature, symbols.get(0), new Delta(Handle.BR, AffineTransform.getTranslateInstance(-bbox.width/2, -bbox.height/2)));
+			symbol(feature, symbols.get(1), new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, -bbox.height/2)));
+			symbol(feature, symbols.get(2), new Delta(Handle.BL, AffineTransform.getTranslateInstance(bbox.width/2, -bbox.height/2)));
+			symbol(feature, symbols.get(3), new Delta(Handle.RC, AffineTransform.getTranslateInstance(-bbox.width/2, 0)));
+			symbol(feature, symbols.get(4), new Delta(Handle.CC, new AffineTransform()));
+			symbol(feature, symbols.get(5), new Delta(Handle.LC, AffineTransform.getTranslateInstance(bbox.width/2, 0)));
+			symbol(feature, symbols.get(6), new Delta(Handle.TR, AffineTransform.getTranslateInstance(-bbox.width/2, bbox.height/2)));
+			symbol(feature, symbols.get(7), new Delta(Handle.TC, AffineTransform.getTranslateInstance(0, bbox.height/2)));
+			symbol(feature, symbols.get(8), new Delta(Handle.TL, AffineTransform.getTranslateInstance(bbox.width/2, bbox.height/2)));
 			break;
 		}
Index: /applications/editors/josm/plugins/smed2/src/seamap/Rules.java
===================================================================
--- /applications/editors/josm/plugins/smed2/src/seamap/Rules.java	(revision 30035)
+++ /applications/editors/josm/plugins/smed2/src/seamap/Rules.java	(revision 30036)
@@ -108,5 +108,5 @@
 	
 	private static void areas(Feature feature) {
-		AttItem name = feature.atts.get(Att.OBJNAM);
+		String name = Util.getName(feature);
 		switch (feature.type) {
 		case DRGARE:
@@ -116,5 +116,5 @@
 				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), LabelStyle.NONE, Color.black, null, null);
+				Renderer.labelText(feature, name, new Font("Arial", Font.PLAIN, 100), LabelStyle.NONE, Color.black, null, null);
 			break;
 		case FAIRWY:
@@ -131,14 +131,14 @@
 		case MARCUL:
 			if (zoom >= 14)
-				Renderer.symbol(feature, Areas.MarineFarm, Obj.MARCUL, null, null);
+				Renderer.symbol(feature, Areas.MarineFarm);
 			if (zoom >= 16)
 				Renderer.lineVector(feature, new LineStyle( Color.black, 4, new float[] { 10, 10 }, null));
 			break;
 		case OSPARE:
-			if ((CatPRA)Renderer.getAttVal(feature, feature.type, 0, Att.CATPRA) == CatPRA.PRA_WFRM) {
-				Renderer.symbol(feature, Areas.WindFarm, Obj.OSPARE, null, null);
+			if (Util.testAttribute(feature, feature.type, Att.CATPRA, CatPRA.PRA_WFRM)) {
+				Renderer.symbol(feature, Areas.WindFarm);
 				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), LabelStyle.NONE, Color.black, null, new Delta(Handle.TC, AffineTransform.getTranslateInstance(0, 10)));
+					Renderer.labelText(feature, name, new Font("Arial", Font.BOLD, 80), LabelStyle.NONE, Color.black, null, new Delta(Handle.TC, AffineTransform.getTranslateInstance(0, 10)));
 			}
 			break;
@@ -146,10 +146,11 @@
 			if (zoom >= 12) {
 				Renderer.lineSymbols(feature, Areas.Restricted, 1.0, null, null, 0, Mline);
-//				if ((CatREA)Renderer.getAttVal(feature, feature.type, 0, Att.CATREA) == CatREA.REA_NWAK)
-//					Renderer.symbol(feature, Areas.NoWake, Obj.RESARE, null);
+				if (Util.testAttribute(feature, feature.type, Att.CATPRA, CatREA.REA_NWAK)) {
+					Renderer.symbol(feature, Areas.NoWake);
+				}
 			}
 			break;
 		case SEAARE:
-			switch ((CatSEA) Renderer.getAttVal(feature, feature.type, 0, Att.CATSEA)) {
+			switch ((CatSEA) Util.getAttVal(feature, feature.type, 0, Att.CATSEA)) {
 			case SEA_RECH:
 				break;
@@ -160,4 +161,6 @@
 			case SEA_GAT:
 			case SEA_NRRW:
+				break;
+			default:
 				break;
 			}
@@ -203,9 +206,9 @@
 		case SPLARE:
 			if (zoom >= 12) {
-				Renderer.symbol(feature, Areas.Plane, Obj.SPLARE, null, null);
+				Renderer.symbol(feature, Areas.Plane);
 				Renderer.lineSymbols(feature, Areas.Restricted, 0.5, Areas.LinePlane, null, 10, Mline);
 			}
 			if ((zoom >= 15) && (name != null))
-				Renderer.labelText(feature, (String) name.val, new Font("Arial", Font.BOLD, 80), LabelStyle.NONE, Color.black, null, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, -90)));
+				Renderer.labelText(feature, name, new Font("Arial", Font.BOLD, 80), LabelStyle.NONE, Color.black, null, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, -90)));
 			break;
 		default:
@@ -215,27 +218,27 @@
 	
 	private static void beacons(Feature feature) {
-		BcnSHP shape = (BcnSHP) Renderer.getAttVal(feature, feature.type, 0, Att.BCNSHP);
+		BcnSHP shape = (BcnSHP) Util.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);
+			CatLAM cat = (CatLAM) Util.getAttVal(feature, feature.type, 0, Att.CATLAM);
 			switch (cat) {
 			case LAM_PORT:
 				if (shape == BcnSHP.BCN_PRCH)
-					Renderer.symbol(feature, Beacons.PerchPort, null, null, null);
+					Renderer.symbol(feature, Beacons.PerchPort);
 				else
-					Renderer.symbol(feature, Beacons.WithyPort, null, null, null);
+					Renderer.symbol(feature, Beacons.WithyPort);
 				break;
 			case LAM_STBD:
 				if (shape == BcnSHP.BCN_PRCH)
-					Renderer.symbol(feature, Beacons.PerchStarboard, null, null, null);
+					Renderer.symbol(feature, Beacons.PerchStarboard);
 				else
-					Renderer.symbol(feature, Beacons.WithyStarboard, null, null, null);
+					Renderer.symbol(feature, Beacons.WithyStarboard);
 				break;
 			default:
-				Renderer.symbol(feature, Beacons.Stake, feature.type, null, null);
+				Renderer.symbol(feature, Beacons.Stake, Util.getScheme(feature, feature.type));
 			}
 		} else {
-			Renderer.symbol(feature, Beacons.Shapes.get(shape), feature.type, null, null);
+			Renderer.symbol(feature, Beacons.Shapes.get(shape), Util.getScheme(feature, feature.type));
 			if (feature.objs.get(Obj.TOPMAR) != null)
-				Renderer.symbol(feature, Topmarks.Shapes.get(feature.objs.get(Obj.TOPMAR).get(0).get(Att.TOPSHP).val), Obj.TOPMAR, null, Topmarks.Beacons);
+				Renderer.symbol(feature, Topmarks.Shapes.get(feature.objs.get(Obj.TOPMAR).get(0).get(Att.TOPSHP).val), Util.getScheme(feature, Obj.TOPMAR), Topmarks.BeaconDelta);
 		}
 		Signals.addSignals(feature);
@@ -243,8 +246,8 @@
 	
 	private static void buoys(Feature feature) {
-		BoySHP shape = (BoySHP) Renderer.getAttVal(feature, feature.type, 0, Att.BOYSHP);
-		Renderer.symbol(feature, Buoys.Shapes.get(shape), feature.type, null, null);
-		if (feature.objs.get(Obj.TOPMAR) != null) {
-			Renderer.symbol(feature, Topmarks.Shapes.get(feature.objs.get(Obj.TOPMAR).get(0).get(Att.TOPSHP).val), Obj.TOPMAR, null, Topmarks.Buoys.get(shape));
+		BoySHP shape = (BoySHP) Util.getAttVal(feature, feature.type, 0, Att.BOYSHP);
+		Renderer.symbol(feature, Buoys.Shapes.get(shape), Util.getScheme(feature, feature.type));
+		if (Util.hasObject(feature, Obj.TOPMAR)) {
+			Renderer.symbol(feature, Topmarks.Shapes.get(feature.objs.get(Obj.TOPMAR).get(0).get(Att.TOPSHP).val), Util.getScheme(feature, Obj.TOPMAR), Topmarks.BuoyDeltas.get(shape));
 		}
 		Signals.addSignals(feature);
@@ -296,37 +299,39 @@
 	private static void distances(Feature feature) {
 		if (zoom >= 14) {
-			if (!((CatDIS)Renderer.getAttVal(feature, Obj.DISMAR, 0, Att.CATDIS) == CatDIS.DIS_NONI)) {
-				Renderer.symbol(feature, Harbours.DistanceI, null, null, null);
+			if (!Util.testAttribute(feature, Obj.DISMAR, Att.CATDIS, CatDIS.DIS_NONI)) {
+				Renderer.symbol(feature, Harbours.DistanceI);
 			} else {
-				Renderer.symbol(feature, Harbours.DistanceU, null, null, null);
-			}
-			AttMap atts = feature.objs.get(Obj.DISMAR).get(0);
-			if ((atts != null) && (atts.containsKey(Att.WTWDIS)) && (zoom >=15)) {
-			Double dist = (Double)atts.get(Att.WTWDIS).val;
-			String str = "";
-			if (atts.containsKey(Att.HUNITS)) {
-				switch ((UniHLU)atts.get(Att.HUNITS).val) {
-				case HLU_METR:
-					str += "m ";
-					break;
-				case HLU_FEET:
-					str += "ft ";
-					break;
-				case HLU_HMTR:
-					str += "hm ";
-					break;
-				case HLU_KMTR:
-					str += "km ";
-					break;
-				case HLU_SMIL:
-					str += "M ";
-					break;
-				case HLU_NMIL:
-					str += "NM ";
-					break;
-				}
-			}
-			str += String.format("%1.0f", dist);
-			Renderer.labelText(feature, str, new Font("Arial", Font.PLAIN, 40), LabelStyle.NONE, Color.black, null, new Delta(Handle.CC, AffineTransform.getTranslateInstance(0, 45)));
+				Renderer.symbol(feature, Harbours.DistanceU);
+			}
+			if ((zoom >=15) && Util.hasAttribute(feature, Obj.DISMAR, Att.WTWDIS)) {
+				AttMap atts = feature.objs.get(Obj.DISMAR).get(0);
+				Double dist = (Double) atts.get(Att.WTWDIS).val;
+				String str = "";
+				if (atts.containsKey(Att.HUNITS)) {
+					switch ((UniHLU) atts.get(Att.HUNITS).val) {
+					case HLU_METR:
+						str += "m ";
+						break;
+					case HLU_FEET:
+						str += "ft ";
+						break;
+					case HLU_HMTR:
+						str += "hm ";
+						break;
+					case HLU_KMTR:
+						str += "km ";
+						break;
+					case HLU_SMIL:
+						str += "M ";
+						break;
+					case HLU_NMIL:
+						str += "NM ";
+						break;
+					default:
+						break;
+					}
+				}
+				str += String.format("%1.0f", dist);
+				Renderer.labelText(feature, str, new Font("Arial", Font.PLAIN, 40), LabelStyle.NONE, Color.black, null, new Delta(Handle.CC, AffineTransform.getTranslateInstance(0, 45)));
 			}
 		}
@@ -336,15 +341,17 @@
 		switch (feature.type) {
 		case LITVES:
-			Renderer.symbol(feature, Buoys.Super, feature.type, null, null);
+			Renderer.symbol(feature, Buoys.Super, Util.getScheme(feature, feature.type));
 			break;
 		case LITFLT:
-			Renderer.symbol(feature, Buoys.Float, feature.type, null, null);
+			Renderer.symbol(feature, Buoys.Float, Util.getScheme(feature, feature.type));
 			break;
 		case BOYINB:
-			Renderer.symbol(feature, Buoys.Super, feature.type, null, null);
+			Renderer.symbol(feature, Buoys.Super, Util.getScheme(feature, feature.type));
+			break;
+		default:
 			break;
 		}
 		if (feature.objs.get(Obj.TOPMAR) != null)
-			Renderer.symbol(feature, Topmarks.Shapes.get(feature.objs.get(Obj.TOPMAR).get(0).get(Att.TOPSHP).val), Obj.TOPMAR, null, Topmarks.Floats);
+			Renderer.symbol(feature, Topmarks.Shapes.get(feature.objs.get(Obj.TOPMAR).get(0).get(Att.TOPSHP).val), Util.getScheme(feature, Obj.TOPMAR), Topmarks.FloatDelta);
 		Signals.addSignals(feature);
 	}
@@ -359,14 +366,14 @@
 	
 	private static void harbours(Feature feature) {
-		AttItem name = feature.atts.get(Att.OBJNAM);
+		String name = Util.getName(feature);
 		switch (feature.type) {
 		case ACHBRT:
 			if (zoom >= 14) {
-				Renderer.symbol(feature, Harbours.Anchorage, null, new Scheme(Mline), null);
-			Renderer.labelText(feature, name == null ? "" : (String) name.val, new Font("Arial", Font.PLAIN, 30), LabelStyle.RRCT, Mline, Color.white, new Delta(Handle.BC));
-			}
-			double radius = (Double)Renderer.getAttVal(feature, Obj.ACHBRT, 0, Att.RADIUS);
+				Renderer.symbol(feature, Harbours.Anchorage, new Scheme(Mline));
+			Renderer.labelText(feature, name == null ? "" : name, new Font("Arial", Font.PLAIN, 30), LabelStyle.RRCT, Mline, Color.white, new Delta(Handle.BC));
+			}
+			double radius = (Double)Util.getAttVal(feature, Obj.ACHBRT, 0, Att.RADIUS);
 			if (radius != 0) {
-				UniHLU units = (UniHLU)Renderer.getAttVal(feature, Obj.ACHBRT, 0, Att.HUNITS);
+				UniHLU units = (UniHLU)Util.getAttVal(feature, Obj.ACHBRT, 0, Att.HUNITS);
 				Renderer.lineCircle (feature, new LineStyle(Mline, 4, new float[] { 10, 10 }, null), radius, units);
 			}
@@ -375,18 +382,18 @@
 			if (zoom >= 12) {
 				if (feature.flag != Fflag.AREA) {
-					Renderer.symbol(feature, Harbours.Anchorage, null, new Scheme(Color.black), null);
+					Renderer.symbol(feature, Harbours.Anchorage, new Scheme(Color.black));
 				} else {
-					Renderer.symbol(feature, Harbours.Anchorage, null, new Scheme(Mline), null);
+					Renderer.symbol(feature, Harbours.Anchorage, new Scheme(Mline));
 					Renderer.lineSymbols(feature, Areas.Restricted, 1.0, Areas.LineAnchor, null, 10, Mline);
 				}
 				if ((zoom >= 15) && ((name) != null)) {
-					Renderer.labelText(feature, (String) name.val, new Font("Arial", Font.BOLD, 60), LabelStyle.NONE, Mline, null, new Delta(Handle.LC, AffineTransform.getTranslateInstance(70, 0)));
-				}
-				ArrayList<StsSTS> sts = (ArrayList<StsSTS>)Renderer.getAttVal(feature, Obj.ACHARE, 0, Att.STATUS);
+					Renderer.labelText(feature, name, new Font("Arial", Font.BOLD, 60), LabelStyle.NONE, Mline, null, new Delta(Handle.LC, AffineTransform.getTranslateInstance(70, 0)));
+				}
+				ArrayList<StsSTS> sts = (ArrayList<StsSTS>)Util.getAttVal(feature, Obj.ACHARE, 0, Att.STATUS);
 				if ((zoom >= 15) && (sts != null) && (sts.contains(StsSTS.STS_RESV))) {
 					Renderer.labelText(feature, "Reserved", new Font("Arial", Font.PLAIN, 50), LabelStyle.NONE, Mline, null, new Delta(Handle.TC, AffineTransform.getTranslateInstance(0, 60)));
 				}
 			}
-			ArrayList<CatACH> cats = (ArrayList<CatACH>)Renderer.getAttVal(feature, Obj.ACHARE, 0, Att.CATACH);
+			ArrayList<CatACH> cats = (ArrayList<CatACH>)Util.getAttVal(feature, Obj.ACHARE, 0, Att.CATACH);
 			int dy = (cats.size() - 1) * -30;
 			for (CatACH cat : cats) {
@@ -405,13 +412,13 @@
 					break;
 				case ACH_EXPL:
-					Renderer.symbol(feature, Harbours.Explosives, null, new Scheme(Mline), new Delta(Handle.RC, AffineTransform.getTranslateInstance(-60, dy)));
+					Renderer.symbol(feature, Harbours.Explosives, new Scheme(Mline), new Delta(Handle.RC, AffineTransform.getTranslateInstance(-60, dy)));
 					dy += 60;
 					break;
 				case ACH_QUAR:
-					Renderer.symbol(feature, Harbours.Hospital, null, new Scheme(Mline), new Delta(Handle.RC, AffineTransform.getTranslateInstance(-60, dy)));
+					Renderer.symbol(feature, Harbours.Hospital, new Scheme(Mline), new Delta(Handle.RC, AffineTransform.getTranslateInstance(-60, dy)));
 					dy += 60;
 					break;
 				case ACH_SEAP:
-					Renderer.symbol(feature, Areas.Seaplane, null, new Scheme(Mline), new Delta(Handle.RC, AffineTransform.getTranslateInstance(-60, dy)));
+					Renderer.symbol(feature, Areas.Seaplane, new Scheme(Mline), new Delta(Handle.RC, AffineTransform.getTranslateInstance(-60, dy)));
 					dy += 60;
 					break;
@@ -421,5 +428,5 @@
 		case BERTHS:
 			if (zoom >= 14) {
-				Renderer.labelText(feature, name == null ? " " : (String) name.val, new Font("Arial", Font.PLAIN, 40), LabelStyle.RRCT, Mline, Color.white, null);
+				Renderer.labelText(feature, name == null ? " " : name, new Font("Arial", Font.PLAIN, 40), LabelStyle.RRCT, Mline, Color.white, null);
 			}
 			break;
@@ -427,10 +434,10 @@
 		  if (zoom >= 16) {
 		  	ArrayList<Symbol> symbols = new ArrayList();
-		  	ArrayList<FncFNC> fncs = (ArrayList<FncFNC>) Renderer.getAttVal(feature, Obj.BUISGL, 0, Att.FUNCTN);
+		  	ArrayList<FncFNC> fncs = (ArrayList<FncFNC>) Util.getAttVal(feature, Obj.BUISGL, 0, Att.FUNCTN);
 		  	for (FncFNC fnc : fncs) {
 		  		symbols.add(Landmarks.Funcs.get(fnc));
 		  	}
 			  if (feature.objs.containsKey(Obj.SMCFAC))  {
-			  	ArrayList<CatSCF> scfs = (ArrayList<CatSCF>) Renderer.getAttVal(feature, Obj.SMCFAC, 0, Att.CATSCF);
+			  	ArrayList<CatSCF> scfs = (ArrayList<CatSCF>) Util.getAttVal(feature, Obj.SMCFAC, 0, Att.CATSCF);
 			  	for (CatSCF scf : scfs) {
 			  		symbols.add(Facilities.Cats.get(scf));
@@ -439,4 +446,6 @@
 			  Renderer.cluster(feature, symbols);
 		  }
+			break;
+		default:
 			break;
 		}
@@ -457,7 +466,7 @@
 	
 	private static void landmarks(Feature feature) {
-		ArrayList<CatLMK> cats = (ArrayList<CatLMK>) Renderer.getAttVal(feature, feature.type, 0, Att.CATLMK);
+		ArrayList<CatLMK> cats = (ArrayList<CatLMK>) Util.getAttVal(feature, feature.type, 0, Att.CATLMK);
 		Symbol catSym = Landmarks.Shapes.get(cats.get(0));
-		ArrayList<FncFNC> fncs = (ArrayList<FncFNC>) Renderer.getAttVal(feature, feature.type, 0, Att.FUNCTN);
+		ArrayList<FncFNC> fncs = (ArrayList<FncFNC>) Util.getAttVal(feature, feature.type, 0, Att.FUNCTN);
 		Symbol fncSym = Landmarks.Funcs.get(fncs.get(0));
 		if ((fncs.get(0) == FncFNC.FNC_CHCH) && (cats.get(0) == CatLMK.LMK_TOWR))
@@ -467,6 +476,6 @@
 		if (cats.get(0) == CatLMK.LMK_RADR)
 			fncSym = Landmarks.RadioTV;
-		Renderer.symbol(feature, catSym, null, null, null);
-		Renderer.symbol(feature, fncSym, null, null, null);
+		Renderer.symbol(feature, catSym);
+		Renderer.symbol(feature, fncSym);
 /*  if (!has_attribute("function") && !has_attribute("category") && has_object("light")) {
     symbol("lighthouse");
@@ -488,9 +497,9 @@
 		switch (feature.type) {
 		case LITMAJ:
-			Renderer.symbol(feature, Beacons.LightMajor, null, null, null);
+			Renderer.symbol(feature, Beacons.LightMajor);
 			break;
 		case LITMIN:
 		case LIGHTS:
-			Renderer.symbol(feature, Beacons.LightMinor, null, null, null);
+			Renderer.symbol(feature, Beacons.LightMinor);
 			break;
 		}
@@ -499,9 +508,4 @@
 	
 	private static void locks(Feature feature) {
-/*object_rules(locks) {
-  if ((zoom>=13) && is_type("lock_basin|lock_basin_part")) symbol("lock");
-  if ((zoom>=15) && is_type("gate")) symbol("lock_gate");
-}
-*/
 	}
 	private static void marinas(Feature feature) {
@@ -509,74 +513,24 @@
 			
 		}
-/*      int n = countObjects(item, type);
-      Atta_t atta = enumAttribute("category", obja);
-      char **map = cluster_map(obja);
-      if (map == NULL) return;
-      switch (n) {
-        case 0: {
-          Obj_t *obj = getObj(item, obja, 0);
-          int n = countValues(getAtt(obj, atta));
-          switch (n) {
-            case 1:
-              renderSymbol(item, obja, map[getAttEnum(obj, atta, 0)], "", "", CC, 0, 0, 0);
-              break;
-            case 2:
-              renderSymbol(item, obja, map[getAttEnum(obj, atta, 0)], "", "", RC, 0, 0, 0);
-              renderSymbol(item, obja, map[getAttEnum(obj, atta, 1)], "", "", LC, 0, 0, 0);
-              break;
-            case 3:
-              renderSymbol(item, obja, map[getAttEnum(obj, atta, 0)], "", "", BC, 0, 0, 0);
-              renderSymbol(item, obja, map[getAttEnum(obj, atta, 1)], "", "", TR, 0, 0, 0);
-              renderSymbol(item, obja, map[getAttEnum(obj, atta, 2)], "", "", TL, 0, 0, 0);
-              break;
-            case 4:
-              renderSymbol(item, obja, map[getAttEnum(obj, atta, 0)], "", "", BR, 0, 0, 0);
-              renderSymbol(item, obja, map[getAttEnum(obj, atta, 1)], "", "", BL, 0, 0, 0);
-              renderSymbol(item, obja, map[getAttEnum(obj, atta, 2)], "", "", TR, 0, 0, 0);
-              renderSymbol(item, obja, map[getAttEnum(obj, atta, 3)], "", "", TL, 0, 0, 0);
-              break;
-          }
-        }
-          break;
-        case 1:
-          renderSymbol(item, obja, map[getAttEnum(getObj(item, obja, 1), atta, 0)], "", "", CC, 0, 0, 0);
-          break;
-        case 2:
-          renderSymbol(item, obja, map[getAttEnum(getObj(item, obja, 1), atta, 0)], "", "", RC, 0, 0, 0);
-          renderSymbol(item, obja, map[getAttEnum(getObj(item, obja, 2), atta, 0)], "", "", LC, 0, 0, 0);
-          break;
-        case 3:
-          renderSymbol(item, obja, map[getAttEnum(getObj(item, obja, 1), atta, 0)], "", "", BC, 0, 0, 0);
-          renderSymbol(item, obja, map[getAttEnum(getObj(item, obja, 2), atta, 0)], "", "", TR, 0, 0, 0);
-          renderSymbol(item, obja, map[getAttEnum(getObj(item, obja, 3), atta, 0)], "", "", TL, 0, 0, 0);
-          break;
-        case 4:
-          renderSymbol(item, obja, map[getAttEnum(getObj(item, obja, 1), atta, 0)], "", "", BR, 0, 0, 0);
-          renderSymbol(item, obja, map[getAttEnum(getObj(item, obja, 2), atta, 0)], "", "", BL, 0, 0, 0);
-          renderSymbol(item, obja, map[getAttEnum(getObj(item, obja, 3), atta, 0)], "", "", TR, 0, 0, 0);
-          renderSymbol(item, obja, map[getAttEnum(getObj(item, obja, 4), atta, 0)], "", "", TL, 0, 0, 0);
-          break;
-      }
-*/
 	}
 	
 	private static void moorings(Feature feature) {
-		CatMOR cat = (CatMOR) Renderer.getAttVal(feature, feature.type, 0, Att.CATMOR);
+		CatMOR cat = (CatMOR) Util.getAttVal(feature, feature.type, 0, Att.CATMOR);
 		switch (cat) {
 		case MOR_DLPN:
-			Renderer.symbol(feature, Harbours.Dolphin, null, null, null);
+			Renderer.symbol(feature, Harbours.Dolphin);
 			break;
 		case MOR_DDPN:
-			Renderer.symbol(feature, Harbours.DeviationDolphin, null, null, null);
+			Renderer.symbol(feature, Harbours.DeviationDolphin);
 			break;
 		case MOR_BLRD:
 		case MOR_POST:
-			Renderer.symbol(feature, Harbours.Bollard, null, null, null);
+			Renderer.symbol(feature, Harbours.Bollard);
 			break;
 		case MOR_BUOY:
-			BoySHP shape = (BoySHP) Renderer.getAttVal(feature, feature.type, 0, Att.BOYSHP);
+			BoySHP shape = (BoySHP) Util.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, null, null);
+			Renderer.symbol(feature, Buoys.Shapes.get(shape), Util.getScheme(feature, feature.type));
 			break;
 		}
@@ -802,17 +756,17 @@
 	private static void obstructions(Feature feature) {
 		if ((zoom >= 14) && (feature.type == Obj.UWTROC)) {
-			WatLEV lvl = (WatLEV) Renderer.getAttVal(feature, feature.type, 0, Att.WATLEV);
+			WatLEV lvl = (WatLEV) Util.getAttVal(feature, feature.type, 0, Att.WATLEV);
 			switch (lvl) {
 			case LEV_CVRS:
-				Renderer.symbol(feature, Areas.RockC, null, null, null);
+				Renderer.symbol(feature, Areas.RockC);
 				break;
 			case LEV_AWSH:
-				Renderer.symbol(feature, Areas.RockA, null, null, null);
+				Renderer.symbol(feature, Areas.RockA);
 				break;
 			default:
-				Renderer.symbol(feature, Areas.Rock, null, null, null);
+				Renderer.symbol(feature, Areas.Rock);
 			}
 		} else {
-			Renderer.symbol(feature, Areas.Rock, null, null, null);
+			Renderer.symbol(feature, Areas.Rock);
 		}
 	}
@@ -827,12 +781,12 @@
 	}
 	private static void platforms(Feature feature) {
-		ArrayList<CatOFP> cats = (ArrayList<CatOFP>)Renderer.getAttVal(feature, Obj.OFSPLF, 0, Att.CATOFP);
+		ArrayList<CatOFP> cats = (ArrayList<CatOFP>)Util.getAttVal(feature, Obj.OFSPLF, 0, Att.CATOFP);
 		if ((CatOFP) cats.get(0) == CatOFP.OFP_FPSO)
-			Renderer.symbol(feature, Buoys.Storage, null, null, null);
+			Renderer.symbol(feature, Buoys.Storage);
 		else
-			Renderer.symbol(feature, Landmarks.Platform, null, null, null);
-		AttItem name = feature.atts.get(Att.OBJNAM);
+			Renderer.symbol(feature, Landmarks.Platform);
+		String name = Util.getName(feature);
 		if ((zoom >= 15) && (name != null))
-			Renderer.labelText(feature, (String) name.val, new Font("Arial", Font.BOLD, 40), LabelStyle.NONE, Color.black, null, new Delta(Handle.BL, AffineTransform.getTranslateInstance(20, -50)));
+			Renderer.labelText(feature, name, new Font("Arial", Font.BOLD, 40), LabelStyle.NONE, Color.black, null, new Delta(Handle.BL, AffineTransform.getTranslateInstance(20, -50)));
 /*object_rules(platforms) {
   if (has_object("fog_signal")) object(fogs);
@@ -845,13 +799,13 @@
 		if (zoom >= 14) {
 			if (feature.type == Obj.CRANES) {
-				if ((CatCRN) Renderer.getAttVal(feature, feature.type, 0, Att.CATCRN) == CatCRN.CRN_CONT)
-					Renderer.symbol(feature, Harbours.ContainerCrane, null, null, null);
+				if ((CatCRN) Util.getAttVal(feature, feature.type, 0, Att.CATCRN) == CatCRN.CRN_CONT)
+					Renderer.symbol(feature, Harbours.ContainerCrane);
 				else
-					Renderer.symbol(feature, Harbours.PortCrane, null, null, null);
+					Renderer.symbol(feature, Harbours.PortCrane);
 			} else if (feature.type == Obj.HULKES) {
 				Renderer.lineVector(feature, new LineStyle(Color.black, 4, null, new Color(0xffe000)));
-				AttItem name = feature.atts.get(Att.OBJNAM);
+				String name = Util.getName(feature);
 				if ((zoom >= 15) && (name != null))
-					Renderer.labelText(feature, (String) name.val, new Font("Arial", Font.BOLD, 80), LabelStyle.NONE, Color.black, null, null);
+					Renderer.labelText(feature, name, new Font("Arial", Font.BOLD, 80), LabelStyle.NONE, Color.black, null, null);
 			}
 		}
@@ -866,7 +820,7 @@
 			else
 				Renderer.lineVector(feature, new LineStyle(new Color(0x80c48080, true), 20, null, null));
-			AttItem name = feature.atts.get(Att.OBJNAM);
+			String name = Util.getName(feature);
 			if ((zoom >= 10) && (name != null))
-				Renderer.labelText(feature, (String) name.val, new Font("Arial", Font.BOLD, 150), LabelStyle.NONE, new Color(0x80c48080, true), null, null);
+				Renderer.labelText(feature, name, new Font("Arial", Font.BOLD, 150), LabelStyle.NONE, new Color(0x80c48080, true), null, null);
 			break;
 		case TSELNE:
@@ -886,7 +840,7 @@
 	private static void shoreline(Feature feature) {
 		if (zoom >= 12) {
-			switch ((CatSLC) Renderer.getAttVal(feature, feature.type, 0, Att.CATSLC)) {
+			switch ((CatSLC) Util.getAttVal(feature, feature.type, 0, Att.CATSLC)) {
 			case SLC_TWAL:
-				WatLEV lev = (WatLEV) Renderer.getAttVal(feature, feature.type, 0, Att.WATLEV);
+				WatLEV lev = (WatLEV) Util.getAttVal(feature, feature.type, 0, Att.WATLEV);
 				if (lev == WatLEV.LEV_CVRS) {
 					Renderer.lineVector(feature, new LineStyle(Color.black, 10, new float[] { 40, 40 }, null));
@@ -907,5 +861,5 @@
 			case SISTAT:
 			case SISTAW:
-				Renderer.symbol(feature, Harbours.SignalStation, null, null, null);
+				Renderer.symbol(feature, Harbours.SignalStation);
 				String str = "SS";
 				//  Append (cat) to str
@@ -913,20 +867,20 @@
 				break;
 			case RDOSTA:
-				Renderer.symbol(feature, Harbours.SignalStation, null, null, null);
-				Renderer.symbol(feature, Beacons.RadarStation, null, null, null);
+				Renderer.symbol(feature, Harbours.SignalStation);
+				Renderer.symbol(feature, Beacons.RadarStation);
 				break;
 			case RADSTA:
-				Renderer.symbol(feature, Harbours.SignalStation, null, null, null);
-				Renderer.symbol(feature, Beacons.RadarStation, null, null, null);
+				Renderer.symbol(feature, Harbours.SignalStation);
+				Renderer.symbol(feature, Beacons.RadarStation);
 				break;
 			case PILBOP:
-				Renderer.symbol(feature, Harbours.Pilot, null, null, null);
+				Renderer.symbol(feature, Harbours.Pilot);
 				break;
 			case CGUSTA:
-				Renderer.symbol(feature, Harbours.SignalStation, null, null, null);
+				Renderer.symbol(feature, Harbours.SignalStation);
 				Renderer.labelText(feature, "CG", new Font("Arial", Font.PLAIN, 40), LabelStyle.NONE, Color.black, null, new Delta(Handle.LC, AffineTransform.getTranslateInstance(30, 0)));
 				break;
 			case RSCSTA:
-				Renderer.symbol(feature, Harbours.Rescue, null, null, null);
+				Renderer.symbol(feature, Harbours.Rescue);
 				break;
 			}
@@ -942,7 +896,7 @@
 	  if (zoom >= 15) {
 	  	String str = "";
-			AttItem name = feature.atts.get(Att.OBJNAM);
-			if (name != null) str += (String)name.val + " ";
-			Double ort = (Double) Renderer.getAttVal(feature, feature.type, 0, Att.ORIENT);
+			String name = Util.getName(feature);
+			if (name != null) str += name + " ";
+			Double ort = (Double) Util.getAttVal(feature, feature.type, 0, Att.ORIENT);
 			if (ort != null) str += ort.toString() + "\u0152";
 			if (!str.isEmpty()) Renderer.lineText(feature, str, new Font("Arial", Font.PLAIN, 80), Color.black, 0.5, -20);
@@ -950,19 +904,20 @@
 	}
 	private static void waterways(Feature feature) {
+		
 	}
 	
 	private static void wrecks(Feature feature) {
 		if (zoom >= 14) {
-			CatWRK cat = (CatWRK) Renderer.getAttVal(feature, feature.type, 0, Att.CATWRK);
+			CatWRK cat = (CatWRK) Util.getAttVal(feature, feature.type, 0, Att.CATWRK);
 			switch (cat) {
 			case WRK_DNGR:
 			case WRK_MSTS:
-				Renderer.symbol(feature, Areas.WreckD, null, null, null);
+				Renderer.symbol(feature, Areas.WreckD);
 				break;
 			case WRK_HULS:
-				Renderer.symbol(feature, Areas.WreckS, null, null, null);
+				Renderer.symbol(feature, Areas.WreckS);
 				break;
 			default:
-				Renderer.symbol(feature, Areas.WreckND, null, null, null);
+				Renderer.symbol(feature, Areas.WreckND);
 			}
 		}
Index: /applications/editors/josm/plugins/smed2/src/seamap/Signals.java
===================================================================
--- /applications/editors/josm/plugins/smed2/src/seamap/Signals.java	(revision 30035)
+++ /applications/editors/josm/plugins/smed2/src/seamap/Signals.java	(revision 30036)
@@ -40,6 +40,6 @@
 
 	public static void radarStations(Feature feature) {
-		Renderer.symbol(feature, Beacons.RadarStation, null, null, null);
-		ArrayList<CatROS> cats = (ArrayList<CatROS>)Renderer.getAttVal(feature, Obj.RDOSTA, 0, Att.CATROS);
+		Renderer.symbol(feature, Beacons.RadarStation);
+		ArrayList<CatROS> cats = (ArrayList<CatROS>)Util.getAttVal(feature, Obj.RDOSTA, 0, Att.CATROS);
 		String str = "";
 		for (CatROS ros : cats) {
@@ -101,41 +101,41 @@
 			case ROS_VANC:
 				Renderer.labelText(feature, " V-AIS", new Font("Arial", Font.PLAIN, 40), LabelStyle.NONE, Color.black, null, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, 70)));
-				Renderer.symbol(feature, Topmarks.TopNorth, null, null, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, -25)));
+				Renderer.symbol(feature, Topmarks.TopNorth, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, -25)));
 				break;
 			case ROS_VASC:
 				Renderer.labelText(feature, " V-AIS", new Font("Arial", Font.PLAIN, 40), LabelStyle.NONE, Color.black, null, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, 70)));
-				Renderer.symbol(feature, Topmarks.TopSouth, null, null, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, -25)));
+				Renderer.symbol(feature, Topmarks.TopSouth, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, -25)));
 				break;
 			case ROS_VAEC:
 				Renderer.labelText(feature, " V-AIS", new Font("Arial", Font.PLAIN, 40), LabelStyle.NONE, Color.black, null, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, 70)));
-				Renderer.symbol(feature, Topmarks.TopEast, null, null, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, -25)));
+				Renderer.symbol(feature, Topmarks.TopEast, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, -25)));
 				break;
 			case ROS_VAWC:
 				Renderer.labelText(feature, " V-AIS", new Font("Arial", Font.PLAIN, 40), LabelStyle.NONE, Color.black, null, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, 70)));
-				Renderer.symbol(feature, Topmarks.TopWest, null, null, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, -25)));
+				Renderer.symbol(feature, Topmarks.TopWest, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, -25)));
 				break;
 			case ROS_VAPL:
 				Renderer.labelText(feature, " V-AIS", new Font("Arial", Font.PLAIN, 40), LabelStyle.NONE, Color.black, null, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, 70)));
-				Renderer.symbol(feature, Topmarks.TopCan, null, null, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, -25)));
+				Renderer.symbol(feature, Topmarks.TopCan, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, -25)));
 				break;
 			case ROS_VASL:
 				Renderer.labelText(feature, " V-AIS", new Font("Arial", Font.PLAIN, 40), LabelStyle.NONE, Color.black, null, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, 70)));
-				Renderer.symbol(feature, Topmarks.TopCone, null, null, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, -25)));
+				Renderer.symbol(feature, Topmarks.TopCone, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, -25)));
 				break;
 			case ROS_VAID:
 				Renderer.labelText(feature, " V-AIS", new Font("Arial", Font.PLAIN, 40), LabelStyle.NONE, Color.black, null, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, 70)));
-				Renderer.symbol(feature, Topmarks.TopIsol, null, null, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, -25)));
+				Renderer.symbol(feature, Topmarks.TopIsol, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, -25)));
 				break;
 			case ROS_VASW:
 				Renderer.labelText(feature, " V-AIS", new Font("Arial", Font.PLAIN, 40), LabelStyle.NONE, Color.black, null, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, 70)));
-				Renderer.symbol(feature, Topmarks.TopSphere, null, null, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, -25)));
+				Renderer.symbol(feature, Topmarks.TopSphere, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, -25)));
 				break;
 			case ROS_VASP:
 				Renderer.labelText(feature, " V-AIS", new Font("Arial", Font.PLAIN, 40), LabelStyle.NONE, Color.black, null, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, 70)));
-				Renderer.symbol(feature, Topmarks.TopX, null, null, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, -25)));
+				Renderer.symbol(feature, Topmarks.TopX, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, -25)));
 				break;
 			case ROS_VAWK:
 				Renderer.labelText(feature, " V-AIS", new Font("Arial", Font.PLAIN, 40), LabelStyle.NONE, Color.black, null, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, 70)));
-				Renderer.symbol(feature, Topmarks.TopCross, null, null, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, -25)));
+				Renderer.symbol(feature, Topmarks.TopCross, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, -25)));
 				break;
 			default:
Index: /applications/editors/josm/plugins/smed2/src/seamap/Util.java
===================================================================
--- /applications/editors/josm/plugins/smed2/src/seamap/Util.java	(revision 30036)
+++ /applications/editors/josm/plugins/smed2/src/seamap/Util.java	(revision 30036)
@@ -0,0 +1,131 @@
+/* Copyright 2013 Malcolm Herring
+ *
+ * This is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 3 of the License.
+ *
+ * For a copy of the GNU General Public License, see <http://www.gnu.org/licenses/>.
+ */
+
+package seamap;
+
+import java.awt.Color;
+import java.util.ArrayList;
+import java.util.EnumMap;
+import java.util.HashMap;
+
+import s57.S57val;
+import s57.S57val.*;
+import s57.S57att.*;
+import s57.S57obj.*;
+import seamap.SeaMap.*;
+import symbols.Symbols.*;
+
+public class Util {
+
+	static final EnumMap<ColCOL, Color> bodyColours = new EnumMap<ColCOL, Color>(ColCOL.class);
+	static {
+		bodyColours.put(ColCOL.COL_UNK, new Color(0, true));
+		bodyColours.put(ColCOL.COL_WHT, new Color(0xffffff));
+		bodyColours.put(ColCOL.COL_BLK, new Color(0x000000));
+		bodyColours.put(ColCOL.COL_RED, new Color(0xd40000));
+		bodyColours.put(ColCOL.COL_GRN, new Color(0x00d400));
+		bodyColours.put(ColCOL.COL_BLU, Color.blue);
+		bodyColours.put(ColCOL.COL_YEL, new Color(0xffd400));
+		bodyColours.put(ColCOL.COL_GRY, Color.gray);
+		bodyColours.put(ColCOL.COL_BRN, new Color(0x8b4513));
+		bodyColours.put(ColCOL.COL_AMB, new Color(0xfbf00f));
+		bodyColours.put(ColCOL.COL_VIO, new Color(0xee82ee));
+		bodyColours.put(ColCOL.COL_ORG, Color.orange);
+		bodyColours.put(ColCOL.COL_MAG, new Color(0xf000f0));
+		bodyColours.put(ColCOL.COL_PNK, Color.pink);
+	}
+
+	static final EnumMap<ColPAT, Patt> pattMap = new EnumMap<ColPAT, Patt>(ColPAT.class);
+	static {
+		pattMap.put(ColPAT.PAT_UNKN, Patt.Z);
+		pattMap.put(ColPAT.PAT_HORI, Patt.H);
+		pattMap.put(ColPAT.PAT_VERT, Patt.V);
+		pattMap.put(ColPAT.PAT_DIAG, Patt.D);
+		pattMap.put(ColPAT.PAT_BRDR, Patt.B);
+		pattMap.put(ColPAT.PAT_SQUR, Patt.S);
+		pattMap.put(ColPAT.PAT_CROS, Patt.C);
+		pattMap.put(ColPAT.PAT_SALT, Patt.X);
+		pattMap.put(ColPAT.PAT_STRP, Patt.H);
+	}
+	
+	static String getName(Feature feature) {
+		AttItem name = feature.atts.get(Att.OBJNAM);
+		if (name == null) {
+			name = feature.objs.get(feature.type).get(0).get(Att.OBJNAM);
+		}
+		if (name != null) return (String)name.val;
+		return null;
+	}
+
+	static AttMap getAtts(Feature feature, Obj obj, int idx) {
+		HashMap<Integer, AttMap> 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) {
+		AttMap atts = null;
+		HashMap<Integer, AttMap> objs = feature.objs.get(obj);
+		if (objs != null)
+			atts = objs.get(idx);
+		if (atts == null)
+			return S57val.nullVal(att);
+		else {
+			AttItem item = atts.get(att);
+			if (item == null)
+				return S57val.nullVal(att);
+			return item.val;
+		}
+	}
+	
+	static Scheme getScheme(Feature feature, Obj obj) {
+		ArrayList<Color> colours = new ArrayList<Color>();
+		for (ColCOL col : (ArrayList<ColCOL>)getAttVal(feature, obj, 0, Att.COLOUR)) {
+			colours.add(bodyColours.get(col));
+		}
+		ArrayList<Patt> patterns = new ArrayList<Patt>();
+		for(ColPAT pat: (ArrayList<ColPAT>) getAttVal(feature, obj, 0, Att.COLPAT)) {
+			patterns.add(pattMap.get(pat));
+		}
+		return new Scheme(patterns, colours);
+	}
+	
+	static boolean hasObject(Feature feature, Obj obj) {
+		return (feature.objs.containsKey(obj));
+	}
+	
+	static boolean hasAttribute(Feature feature, Obj obj, Att att) {
+		AttMap atts = getAtts(feature, obj, 0);
+		return ((atts != null) && (atts.containsKey(att)));
+	}
+	
+	static boolean testAttribute(Feature feature, Obj obj, Att att, Object val) {
+		AttMap atts = getAtts(feature, obj, 0);
+		if (atts != null) {
+			AttItem item = atts.get(att);
+			if (item != null) {
+				switch (item.conv) {
+				case S:
+				case A:
+					return ((String)item.val).equals(val);
+				case L:
+					return ((ArrayList<?>)item.val).contains(val);
+				case E:
+				case F:
+				case I:
+					return item.val.equals(val);
+				}
+			}
+		}
+		return false;
+	}
+	
+}
Index: /applications/editors/josm/plugins/smed2/src/symbols/Topmarks.java
===================================================================
--- /applications/editors/josm/plugins/smed2/src/symbols/Topmarks.java	(revision 30035)
+++ /applications/editors/josm/plugins/smed2/src/symbols/Topmarks.java	(revision 30036)
@@ -228,17 +228,17 @@
 		 Shapes.put(TopSHP.TOP_SALT, TopX);
 	}
-	public static final EnumMap<BoySHP, Delta> Buoys = new EnumMap<BoySHP, Delta>(BoySHP.class);
-	static {
-		Buoys.put(BoySHP.BOY_PILR, new Delta(Handle.BC, new AffineTransform(0.948324, 0.317305, -0.3173047, 0.948324, 31.5, -95.0))); 
-		Buoys.put(BoySHP.BOY_SPAR, new Delta(Handle.BC, new AffineTransform(0.948324, 0.317305, -0.3173047, 0.948324, 31.5, -95.0))); 
-		Buoys.put(BoySHP.BOY_CAN, new Delta(Handle.BC, new AffineTransform(0.948324, 0.317305, -0.3173047, 0.948324, 12.7, -37.9))); 
-		Buoys.put(BoySHP.BOY_CONE, new Delta(Handle.BC, new AffineTransform(0.948324, 0.317305, -0.3173047, 0.948324, 12.7, -37.9))); 
-		Buoys.put(BoySHP.BOY_SPHR, new Delta(Handle.BC, new AffineTransform(0.948324, 0.317305, -0.3173047, 0.948324, 12.7, -37.9))); 
-		Buoys.put(BoySHP.BOY_BARL, new Delta(Handle.BC, new AffineTransform(0.948324, 0.317305, -0.3173047, 0.948324, 12.7, -37.9))); 
-		Buoys.put(BoySHP.BOY_SUPR, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0.0, -42.0))); 
-		Buoys.put(BoySHP.BOY_ICE, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0.0, -25.0))); 
-	}
-	public static final Delta Floats = new Delta(Handle.BC, AffineTransform.getTranslateInstance(0.0, -42.0));
-	public static final Delta Beacons = new Delta(Handle.BC, AffineTransform.getTranslateInstance(0.0, -70.0));
+	public static final EnumMap<BoySHP, Delta> BuoyDeltas = new EnumMap<BoySHP, Delta>(BoySHP.class);
+	static {
+		BuoyDeltas.put(BoySHP.BOY_PILR, new Delta(Handle.BC, new AffineTransform(0.948324, 0.317305, -0.3173047, 0.948324, 31.5, -95.0))); 
+		BuoyDeltas.put(BoySHP.BOY_SPAR, new Delta(Handle.BC, new AffineTransform(0.948324, 0.317305, -0.3173047, 0.948324, 31.5, -95.0))); 
+		BuoyDeltas.put(BoySHP.BOY_CAN, new Delta(Handle.BC, new AffineTransform(0.948324, 0.317305, -0.3173047, 0.948324, 12.7, -37.9))); 
+		BuoyDeltas.put(BoySHP.BOY_CONE, new Delta(Handle.BC, new AffineTransform(0.948324, 0.317305, -0.3173047, 0.948324, 12.7, -37.9))); 
+		BuoyDeltas.put(BoySHP.BOY_SPHR, new Delta(Handle.BC, new AffineTransform(0.948324, 0.317305, -0.3173047, 0.948324, 12.7, -37.9))); 
+		BuoyDeltas.put(BoySHP.BOY_BARL, new Delta(Handle.BC, new AffineTransform(0.948324, 0.317305, -0.3173047, 0.948324, 12.7, -37.9))); 
+		BuoyDeltas.put(BoySHP.BOY_SUPR, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0.0, -42.0))); 
+		BuoyDeltas.put(BoySHP.BOY_ICE, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0.0, -25.0))); 
+	}
+	public static final Delta FloatDelta = new Delta(Handle.BC, AffineTransform.getTranslateInstance(0.0, -42.0));
+	public static final Delta BeaconDelta = new Delta(Handle.BC, AffineTransform.getTranslateInstance(0.0, -70.0));
 
 }
