Index: /applications/editors/josm/plugins/smed/plugs/oseam/src/oseam/panels/PanelChan.java
===================================================================
--- /applications/editors/josm/plugins/smed/plugs/oseam/src/oseam/panels/PanelChan.java	(revision 26552)
+++ /applications/editors/josm/plugins/smed/plugs/oseam/src/oseam/panels/PanelChan.java	(revision 26553)
@@ -67,5 +67,5 @@
 			if (prefPortButton.isSelected()) {
 				dlg.mark.setCategory(Cat.LAT_PREF_PORT);
-				if (panelPort.shapes.containsKey(shp) && (shp != Shp.PERCH)) {
+				if (panelPort.shapes.containsKey(shp)) {
 					panelPort.shapes.get(shp).doClick();
 				} else {
@@ -82,10 +82,4 @@
 				prefPortButton.setBorderPainted(true);
 				panelPort.setVisible(true);
-				panelPort.perchButton.setVisible(false);
-				panelPort.stakeButton.setVisible(false);
-				if (dlg.mark.getShape() == Shp.PERCH || dlg.mark.getShape() == Shp.STAKE) {
-					dlg.mark.setShape(Shp.UNKNOWN);
-					panelPort.clearSelections();
-				}
 			} else {
 				prefPortButton.setBorderPainted(false);
@@ -118,5 +112,5 @@
 			if (prefStbdButton.isSelected()) {
 				dlg.mark.setCategory(Cat.LAT_PREF_STBD);
-				if (panelStbd.shapes.containsKey(shp) && (shp != Shp.PERCH)) {
+				if (panelStbd.shapes.containsKey(shp)) {
 					panelStbd.shapes.get(shp).doClick();
 				} else {
@@ -133,10 +127,4 @@
 				prefStbdButton.setBorderPainted(true);
 				panelStbd.setVisible(true);
-				panelStbd.perchButton.setVisible(false);
-				panelStbd.stakeButton.setVisible(false);
-				if (dlg.mark.getShape() == Shp.PERCH || dlg.mark.getShape() == Shp.STAKE) {
-					dlg.mark.setShape(Shp.UNKNOWN);
-					panelStbd.clearSelections();
-				}
 			} else {
 				prefStbdButton.setBorderPainted(false);
Index: /applications/editors/josm/plugins/smed/plugs/oseam/src/oseam/seamarks/SeaMark.java
===================================================================
--- /applications/editors/josm/plugins/smed/plugs/oseam/src/oseam/seamarks/SeaMark.java	(revision 26552)
+++ /applications/editors/josm/plugins/smed/plugs/oseam/src/oseam/seamarks/SeaMark.java	(revision 26553)
@@ -165,5 +165,5 @@
 
 	public enum Shp {
-		UNKNOWN, PILLAR, SPAR, CAN, CONE, SPHERE, BARREL, FLOAT, SUPER, BEACON, TOWER, STAKE, PERCH
+		UNKNOWN, PILLAR, SPAR, CAN, CONE, SPHERE, BARREL, FLOAT, SUPER, BUOYANT, CAIRN, PILE, LATTICE, TOWER, STAKE, POLE, POST, PERCH, BUOY, BEACON
 	}
 
@@ -178,5 +178,8 @@
 		ShpMAP.put(Shp.FLOAT, "float");
 		ShpMAP.put(Shp.SUPER, "super-buoy");
-		ShpMAP.put(Shp.BEACON, "beacon");
+		ShpMAP.put(Shp.BUOYANT, "buoyant");
+		ShpMAP.put(Shp.CAIRN, "cairn");
+		ShpMAP.put(Shp.PILE, "pile");
+		ShpMAP.put(Shp.LATTICE, "lattice");
 		ShpMAP.put(Shp.TOWER, "tower");
 		ShpMAP.put(Shp.STAKE, "stake");
@@ -331,9 +334,9 @@
 	public static final EnumMap<Pat, String> PatMAP = new EnumMap<Pat, String>(Pat.class);
 	static {
-		PatMAP.put(Pat.HORIZ, "horizontal_stripes");
-		PatMAP.put(Pat.VERT, "vertical_stripes");
-		PatMAP.put(Pat.DIAG, "diagonal_stripes");
+		PatMAP.put(Pat.HORIZ, "horizontal stripes");
+		PatMAP.put(Pat.VERT, "vertical stripes");
+		PatMAP.put(Pat.DIAG, "diagonal stripes");
 		PatMAP.put(Pat.SQUARE, "squared");
-		PatMAP.put(Pat.BORDER, "border_stripe");
+		PatMAP.put(Pat.BORDER, "border stripe");
 	}
 
@@ -592,4 +595,6 @@
 		}
 		if (getShape() == Shp.UNKNOWN) {
+			if (EntMAP.get(getObject()) == Ent.BUOY)
+				setShape(Shp.BUOY);
 			if (EntMAP.get(getObject()) == Ent.BEACON)
 				setShape(Shp.BEACON);
@@ -634,27 +639,45 @@
 					setRegion(Reg.C);
 			} else if (GrpMAP.get(object) == Grp.LAT) {
-				if (getCategory() != Cat.UNKNOWN) {
-					switch (getCategory()) {
-					case LAT_PORT:
-					case LAT_PREF_PORT:
-						if (getColour(Ent.BODY, 0) == Col.RED) {
+				switch (getCategory()) {
+				case LAT_PORT:
+					if (getColour(Ent.BODY, 0) == Col.RED) {
+						if (getColour(Ent.BODY, 1) == Col.WHITE)
+							setRegion(Reg.C);
+						else
 							setRegion(Reg.A);
-							if (getColour(Ent.BODY, 1) == Col.WHITE)
-								setRegion(Reg.C);
-						}
-						if (getColour(Ent.BODY, 0) == Col.GREEN)
+					}
+					if (getColour(Ent.BODY, 0) == Col.GREEN)
+						setRegion(Reg.B);
+					break;
+				case LAT_PREF_PORT:
+					if (getColour(Ent.BODY, 0) == Col.RED) {
+						if (getColour(Ent.BODY, 3) == Col.GREEN)
+							setRegion(Reg.C);
+						else
+							setRegion(Reg.A);
+					}
+					if (getColour(Ent.BODY, 0) == Col.GREEN)
+						setRegion(Reg.B);
+					break;
+				case LAT_STBD:
+					if (getColour(Ent.BODY, 0) == Col.GREEN) {
+						if (getColour(Ent.BODY, 1) == Col.WHITE)
+							setRegion(Reg.C);
+						else
+							setRegion(Reg.A);
+					}
+					if (getColour(Ent.BODY, 0) == Col.RED)
+						setRegion(Reg.B);
+					break;
+				case LAT_PREF_STBD:
+					if (getColour(Ent.BODY, 0) == Col.GREEN)
+						setRegion(Reg.A);
+					if (getColour(Ent.BODY, 0) == Col.RED) {
+						if (getColour(Ent.BODY, 3) == Col.GREEN)
+							setRegion(Reg.C);
+						else
 							setRegion(Reg.B);
-						break;
-					case LAT_STBD:
-					case LAT_PREF_STBD:
-						if (getColour(Ent.BODY, 0) == Col.GREEN) {
-							setRegion(Reg.A);
-							if (getColour(Ent.BODY, 1) == Col.WHITE)
-								setRegion(Reg.C);
-						}
-						if (getColour(Ent.BODY, 0) == Col.RED)
-							setRegion(Reg.B);
-						break;
-					}
+					}
+					break;
 				}
 			}
@@ -702,29 +725,43 @@
 				if (getColour(Ent.FLOAT, 1) == Col.WHITE)
 					if (getColour(Ent.FLOAT, 2) == Col.RED) {
+						setRegion(Reg.C);
 						dlg.panelMain.panelChan.portButton.doClick();
+					} else {
+						dlg.panelMain.panelChan.safeWaterButton.doClick();
+					}
+				else if (getColour(Ent.FLOAT, 1) == Col.GREEN) {
+					if (getColour(Ent.FLOAT, 3) == Col.GREEN) {
 						setRegion(Reg.C);
-					} else
-						dlg.panelMain.panelChan.safeWaterButton.doClick();
-				else if (getColour(Ent.FLOAT, 1) == Col.GREEN)
+					}
+					if (getRegion().equals("B")) {
+						dlg.panelMain.panelChan.prefStbdButton.doClick();
+					} else {
+						dlg.panelMain.panelChan.prefPortButton.doClick();
+					}
+				} else {
 					if (getRegion().equals("B"))
-						dlg.panelMain.panelChan.prefStbdButton.doClick();
+						dlg.panelMain.panelChan.stbdButton.doClick();
 					else
-						dlg.panelMain.panelChan.prefPortButton.doClick();
-				if (getRegion().equals("B"))
-					dlg.panelMain.panelChan.stbdButton.doClick();
-				else
-					dlg.panelMain.panelChan.portButton.doClick();
+						dlg.panelMain.panelChan.portButton.doClick();
+				}
 				break;
 			case GREEN:
 				dlg.panelMain.chanButton.doClick();
-				if (getColour(Ent.FLOAT, 1) == Col.RED)
-					if (getRegion().equals("B"))
+				if (getColour(Ent.FLOAT, 1) == Col.RED) {
+					if (getRegion().equals("B")) {
 						dlg.panelMain.panelChan.prefPortButton.doClick();
-					else
+					} else {
 						dlg.panelMain.panelChan.prefStbdButton.doClick();
-				if (getRegion().equals("B"))
-					dlg.panelMain.panelChan.portButton.doClick();
-				else
+					}
+				} else if (getColour(Ent.FLOAT, 1) == Col.WHITE) {
+					setRegion(Reg.C);
 					dlg.panelMain.panelChan.stbdButton.doClick();
+				} else {
+					if (getRegion().equals("B")) {
+						dlg.panelMain.panelChan.portButton.doClick();
+					} else {
+						dlg.panelMain.panelChan.stbdButton.doClick();
+					}
+				}
 				break;
 			case BLACK:
@@ -759,4 +796,5 @@
 			imgStr += "Tower";
 			break;
+		case BUOY:
 		case PILLAR:
 			imgStr += "Pillar";
@@ -778,4 +816,8 @@
 			break;
 		case BEACON:
+		case CAIRN:
+		case PILE:
+		case LATTICE:
+		case BUOYANT:
 			imgStr += "Beacon";
 			break;
@@ -784,11 +826,8 @@
 			break;
 		case STAKE:
+		case POLE:
+		case POST:
 			imgStr += "Stake";
 			break;
-		default:
-			if (EntMAP.get(getObject()) == Ent.BEACON)
-				imgStr += "Beacon";
-			if (EntMAP.get(getObject()) == Ent.BUOY)
-				imgStr += "Pillar";
 		}
 		if (!imgStr.equals("/images/")) {
@@ -865,5 +904,5 @@
 					if (str != null)
 						Main.main.undoRedo.add(new ChangePropertyCommand(node, "seamark:" + objStr + ":category", str));
-					if (getShape() != Shp.BEACON)
+					if ((getShape() != Shp.BUOY) && (getShape() != Shp.BEACON))
 						Main.main.undoRedo.add(new ChangePropertyCommand(node, "seamark:" + objStr + ":shape", ShpMAP.get(getShape())));
 				}
@@ -878,8 +917,9 @@
 
 				if (getPattern(Ent.BODY) != Pat.NONE) {
-					Main.main.undoRedo.add(new ChangePropertyCommand(node, "seamark:" + objStr + ":colour_pattern", PatMAP.get(getPattern(Ent.BODY))));
-				}
-
-				if (((GrpMAP.get(object) == Grp.LAT) && getShape() != Shp.PERCH) || getShape() == Shp.FLOAT) {
+					Main.main.undoRedo.add(new ChangePropertyCommand(node, "seamark:" + objStr + ":colour_pattern", PatMAP
+							.get(getPattern(Ent.BODY))));
+				}
+
+				if ((GrpMAP.get(object) == Grp.LAT) && (getShape() != Shp.PERCH) || (getObject() == Obj.FLTLAT)) {
 					switch (region) {
 					case A:
