Index: applications/editors/josm/plugins/smed/plugs/oseam/src/oseam/panels/PanelMain.java
===================================================================
--- applications/editors/josm/plugins/smed/plugs/oseam/src/oseam/panels/PanelMain.java	(revision 26546)
+++ applications/editors/josm/plugins/smed/plugs/oseam/src/oseam/panels/PanelMain.java	(revision 26547)
@@ -30,4 +30,5 @@
 	public JTextField nameBox = null;
 	private JButton saveButton = null;
+	private ActionListener alSave = null;
 	public ButtonGroup typeButtons = null;
 	public JRadioButton chanButton = new JRadioButton(new ImageIcon(getClass().getResource("/images/ChanButton.png")));
@@ -240,4 +241,12 @@
 		saveButton.setText(tr("Save"));
 		this.add(saveButton, null);
+		alSave = new ActionListener() {
+			public void actionPerformed(java.awt.event.ActionEvent e) {
+				if (dlg.mark != null) {
+					dlg.mark.saveSign(dlg.node);
+				}
+			}
+		};
+		saveButton.addActionListener(alSave);
 	}
 
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 26546)
+++ applications/editors/josm/plugins/smed/plugs/oseam/src/oseam/seamarks/SeaMark.java	(revision 26547)
@@ -118,9 +118,10 @@
 
 	public enum Grp {
-		LAT, CAR, SAW, ISD, SPP, FLT, LIT, SIS
+		NUL, LAT, CAR, SAW, ISD, SPP, FLT, LIT, SIS
 	}
 
 	public static final EnumMap<Obj, Grp> GrpMAP = new EnumMap<Obj, Grp>(Obj.class);
 	static {
+		GrpMAP.put(Obj.UNKNOWN, Grp.NUL);
 		GrpMAP.put(Obj.BCNCAR, Grp.CAR);
 		GrpMAP.put(Obj.BCNISD, Grp.ISD);
@@ -181,5 +182,5 @@
 		ShpMAP.put(Shp.CAN, "can");
 		ShpMAP.put(Shp.CONE, "conical");
-		ShpMAP.put(Shp.SPHERE, "spherial");
+		ShpMAP.put(Shp.SPHERE, "spherical");
 		ShpMAP.put(Shp.BARREL, "barrel");
 		ShpMAP.put(Shp.FLOAT, "float");
@@ -197,6 +198,6 @@
 	}
 
-	public void setShape(Shp styl) {
-		shape = styl;
+	public void setShape(Shp shp) {
+		shape = shp;
 	}
 
@@ -230,11 +231,19 @@
 		case BEACON:
 		case FLOAT:
-			return bodyColour.get(i);
+			if (i < bodyColour.size())
+				return bodyColour.get(i);
+			break;
 		case TOPMARK:
-			return topColour.get(i);
+			if (i < topColour.size())
+				return topColour.get(i);
+			break;
 		case DAYMARK:
-			return dayColour.get(i);
+			if (i < dayColour.size())
+				return dayColour.get(i);
+			break;
 		case LIGHT:
-			return lightColour.get(i);
+			if (i < lightColour.size())
+				return lightColour.get(i);
+			break;
 		}
 		return Col.UNKNOWN;
@@ -593,5 +602,11 @@
 				}
 			}
-		}
+		} if (getShape() == Shp.UNKNOWN) {
+			if (EntMAP.get(getObject()) == Ent.BEACON)
+				setShape(Shp.BEACON);
+			if (EntMAP.get(getObject()) == Ent.FLOAT)
+				setShape(Shp.FLOAT);
+		}
+
 
 		for (Obj obj : ObjMAP.keySet()) {
@@ -622,4 +637,7 @@
 		
 		switch (GrpMAP.get(dlg.mark.getObject())) {
+		case NUL:
+			dlg.panelMain.clearSelections();
+			break;
 		case LAT:
 			dlg.panelMain.chanButton.doClick();
@@ -653,4 +671,43 @@
 			dlg.panelMain.lightsButton.doClick();
 			break;
+		case FLT:
+			switch (getColour(Ent.FLOAT, 0)) {
+			case RED:
+				dlg.panelMain.chanButton.doClick();
+				if (getColour(Ent.FLOAT, 1) == Col.WHITE)
+					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();
+				if (getRegion().equals("B"))
+					dlg.panelMain.panelChan.stbdButton.doClick();
+				else
+					dlg.panelMain.panelChan.portButton.doClick();
+				break;
+			case GREEN:
+				dlg.panelMain.chanButton.doClick();
+				if (getColour(Ent.FLOAT, 1) == Col.RED)
+					if (getRegion().equals("B"))
+						dlg.panelMain.panelChan.prefPortButton.doClick();
+					else
+						dlg.panelMain.panelChan.prefStbdButton.doClick();
+				if (getRegion().equals("B"))
+					dlg.panelMain.panelChan.portButton.doClick();
+				else
+					dlg.panelMain.panelChan.stbdButton.doClick();
+				break;
+			case BLACK:
+				dlg.panelMain.hazButton.doClick();
+				break;
+			case YELLOW:
+				if (getColour(Ent.FLOAT, 1) == Col.BLACK)
+					dlg.panelMain.hazButton.doClick();
+				else
+					dlg.panelMain.specButton.doClick();
+				break;
+			}
+			break;
 		}
 
@@ -669,5 +726,5 @@
 
 		String imgStr = "/images/";
-		switch (dlg.mark.getShape()) {
+		switch (getShape()) {
 		case TOWER:
 			imgStr += "Tower";
@@ -689,5 +746,5 @@
 			break;
 		case FLOAT:
-			imgStr += "Float_Minor";
+			imgStr += "Float";
 			break;
 		case BEACON:
@@ -699,7 +756,4 @@
 		case STAKE:
 			imgStr += "Stake";
-			break;
-		case PERCH:
-			imgStr += "Perch";
 			break;
 		default:
@@ -738,4 +792,11 @@
 				imgStr += "_Black";
 				break;
+			}
+		}
+		if (getShape() == Shp.PERCH) {
+			if (getCategory() == Cat.LAT_PORT) {
+				imgStr = "/images/Perch_Port";
+			} else {
+				imgStr = "/images/Perch_Starboard";
 			}
 		}
@@ -755,10 +816,8 @@
 		Main.pref.put("smedplugin.IALA", getRegion() == Reg.C ? "C" : (getRegion() == Reg.B ? "B" : "A"));
 
-		// for (String str : node.getKeys().keySet()) {
-		// if (str.contains("seamark"))
-		// if (!str.equals("seamark")) {
-		// Main.main.undoRedo.add(new ChangePropertyCommand(node, str, null));
-		// }
-		// }
+		for (String str : node.getKeys().keySet()) {
+			if (str.matches("^seamark:"))
+				Main.main.undoRedo.add(new ChangePropertyCommand(node, str, null));
+		}
 
 		if (!name.isEmpty())
@@ -788,5 +847,5 @@
 			 */}
 
-		String str = TopMAP.get(topShape);
+/*		String str = TopMAP.get(topShape);
 		if (str != null) {
 			Main.main.undoRedo.add(new ChangePropertyCommand(node, "seamark:topmark:shape", str));
@@ -856,5 +915,5 @@
 		 * i + ":sector_end", Bearing2[i])); } }
 		 */
-		if (hasRadar()) {
+/*		if (hasRadar()) {
 			Main.main.undoRedo.add(new ChangePropertyCommand(node, "seamark:radar_reflector", "yes"));
 		}
@@ -907,5 +966,5 @@
 				Main.main.undoRedo.add(new ChangePropertyCommand(node, "seamark:fog_signal:period", getFogPeriod()));
 		}
-	}
+*/	}
 
 }
