Index: applications/editors/josm/plugins/smed2/src/seamap/LightRender.java
===================================================================
--- applications/editors/josm/plugins/smed2/src/seamap/LightRender.java	(revision 29286)
+++ applications/editors/josm/plugins/smed2/src/seamap/LightRender.java	(revision 29286)
@@ -0,0 +1,451 @@
+/* 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;
+
+public class LightRender {
+
+/*
+XY_t radial(XY_t centre, double radius, double angle) {
+  XY_t position;
+  position.x = centre.x - (radius * mile * sin(d2r(angle)));
+  position.y = centre.y - (radius * mile * cos(d2r(angle)));
+  return position;
+}
+
+void renderFlare(Item_t *item) {
+  char *col = light_colours[COL_MAG];
+  Obj_t *obj = getObj(item, LIGHTS, 0);
+  Att_t *att;
+  if (((att = getAtt(obj, COLOUR)) != NULL) && (att->val.val.l->next == NULL)) {
+    col = light_colours[att->val.val.l->val];
+  }
+  renderSymbol(item, LIGHTS, "light", "", col, CC, 0, 0, 120);
+}
+
+void renderSector(Item_t *item, int s, char *text, char *style, double offset, int dy) {
+  Obj_t *sector;
+  double start, end;
+  Att_t *att;
+  XY_t p0, p1;
+  double r0, r1;
+  double b0, b1, span;
+  char *col;
+  XY_t pos = findCentroid(item);
+  if ((sector = getObj(item, LIGHTS, s)) != NULL) {
+    strcpy(string1, (att = getAtt(sector, LITRAD)) != NULL ? att->val.val.a : "0.2");
+    if (((att = getAtt(sector, CATLIT)) != NULL) && (testAtt(att, LIT_DIR)) && ((att = getAtt(sector, ORIENT)) != NULL)) {
+      b0 = fmod(540.0 - att->val.val.f, 360.0);
+      if ((att = getAtt(sector, COLOUR)) != NULL) {
+        col = light_colours[att->val.val.l->val];
+        r0 = atof(string1);
+        p0 = radial(pos, r0, b0);
+        printf("<path d=\"M %g,%g L %g,%g\" style=\"fill:none;stroke:#808080;stroke-width:%g;stroke-dasharray:%g\"/>\n",
+               pos.x, pos.y, p0.x, p0.y, (4 * symbolScale[zoom]), (20 * symbolScale[zoom]));
+        start = fmod(b0 + 2.0, 360.0);
+        end = fmod(360.0 + b0 - 2.0, 360.0);
+        Obj_t *adj;
+        for (int i = s-1; i <= s+1; i++) {
+          if (i == s) continue;
+          if ((adj = getObj(item, LIGHTS, i)) == NULL) continue;
+          Att_t *att;
+          if (((att = getAtt(adj, CATLIT)) != NULL) && (testAtt(att, LIT_DIR)) && ((att = getAtt(adj, ORIENT)) != NULL)) {
+            b1 = fmod(540.0 - att->val.val.f, 360.0);
+            if (fabs(b0 - b1) > 180.0) {
+              if (b0 < b1) b0 += 360.0;
+              else b1 += 360.0;
+            }
+            if (fabs(b0 - b1) < 4.0) {
+              if (b1 > b0) start = fmod((720.0 + b0 + b1) / 2.0, 360.0);
+              else end = fmod((720.0 + b0 + b1) / 2.0, 360.0);
+            }
+          }
+        }
+        p0 = radial(pos, r0, start);
+        p1 = radial(pos, r0, end);
+        printf("<path id=\"%d\" d=\"M %g,%g A %g,%g,0,0,1,%g,%g\" style=\"fill:none;stroke:%s;stroke-width:%g\"/>\n",
+               ++ref, p0.x, p0.y, r0*mile, r0*mile, p1.x, p1.y, col, (20 * symbolScale[zoom]));
+        if (att->val.val.l->next != NULL) {
+          char *col = light_colours[att->val.val.l->next->val];
+          r1 = r0 - (20 * symbolScale[zoom]/mile);
+          p0 = radial(pos, r1, start);
+          p1 = radial(pos, r1, end);
+          printf("<path d=\"M %g,%g A %g,%g,0,0,1,%g,%g\" style=\"fill:none;stroke:%s;stroke-width:%g\"/>\n",
+                 p0.x, p0.y, r1*mile, r1*mile, p1.x, p1.y, col, (20 * symbolScale[zoom]));
+        }
+      }
+    } else if ((att = getAtt(sector, SECTR1)) != NULL) {
+      start = fmod(540.0 - att->val.val.f, 360.0);
+      if ((att = getAtt(sector, SECTR2)) != NULL) {
+        end = fmod(540.0 - att->val.val.f, 360.0);
+        start += start < end ? 360.0 : 0.0;
+        if ((att = getAtt(sector, COLOUR)) != NULL) {
+          char *ttok, *etok;
+          char *radstr = strdup(string1);
+          int arc = 0;
+          col = light_colours[att->val.val.l->val];
+          r0 = 0.0;
+          b0 = b1 = start;
+          for (char *tpl = strtok_r(radstr, ";", &ttok); tpl != NULL; tpl = strtok_r(NULL, ";", &ttok)) {
+            p0 = radial(pos, r0, b0);
+            span = 0.0;
+            char *ele = strtok_r(tpl, ":", &etok);
+            if ((*tpl == ':') && (r0 == 0.0)) {
+              r1 = 0.2;
+            } else if (*tpl != ':') {
+              r1 = atof(tpl);
+              ele = strtok_r(NULL, ":", &etok);
+            }
+            while (ele != NULL) {
+              if (isalpha(*ele)) {
+                if (strcmp(ele, "suppress") == 0) arc = 2;
+                else if (strcmp(ele, "dashed") == 0) arc = 1;
+                else arc = 0;
+              } else {
+                span = atof(ele);
+              }
+              ele = strtok_r(NULL, ":", &etok);
+            }
+            if (span == 0.0) {
+              char *back = (ttok != NULL) ? strstr(ttok, "-") : NULL;
+              if (back != NULL) {
+                span = b0 - end + atof(back);
+              } else {
+                span = b0 - end;
+              }
+            }
+            if (r1 != r0) {
+              p1 = radial(pos, r1, b0);
+              if (!((start == 180.0) && (end == 180.0)))
+                printf("<path d=\"M %g,%g L %g,%g\" style=\"fill:none;stroke:#808080;stroke-width:%g;stroke-dasharray:%g\"/>\n",
+                       p0.x, p0.y, p1.x, p1.y, (4 * symbolScale[zoom]), (20 * symbolScale[zoom]));
+              r0 = r1;
+              p0 = p1;
+            }
+            if (span < 0.0) {
+              b1 = end - span;
+              b1 = b1 > b0 ? b0 : b1;
+              b0 = b1;
+              b1 = end;
+              p0 = radial(pos, r0, b0);
+            } else {
+              b1 = b0 - span;
+              b1 = b1 < end ? end : b1;
+            }
+            p1 = radial(pos, r1, b1);
+            if ((b0 == 180.0) && (b1 == 180.0)) {
+              span = 360.0;
+              p1 = radial(pos, r1, b1+0.01);
+            }
+            if (arc == 0) {
+              if (p0.x < p1.x)
+                printf("<path id=\"%d\" d=\"M %g,%g A %g,%g,0,%d,1,%g,%g\" style=\"fill:none;stroke:%s;stroke-width:%g\"/>\n",
+                       ++ref, p0.x, p0.y, r1*mile, r1*mile, span>180.0, p1.x, p1.y, col, (20 * symbolScale[zoom]));
+              else
+                printf("<path id=\"%d\" d=\"M %g,%g A %g,%g,0,%d,0,%g,%g\" style=\"fill:none;stroke:%s;stroke-width:%g\"/>\n",
+                       ++ref, p1.x, p1.y, r1*mile, r1*mile, span>180.0, p0.x, p0.y, col, (20 * symbolScale[zoom]));
+              if (text != NULL) {
+                double chord = sqrt(pow((p0.x - p1.x), 2) + pow((p0.y - p1.y), 2));
+                if ((chord > (strlen(text) * textScale[zoom] * 50)) || ((b0 == 180.0) && (b1 == 180.0)))
+                  drawLineText(item, text, style, offset, dy, ref);
+              }
+            } else if (arc == 1) {
+              printf("<path d=\"M %g,%g A %g,%g,0,%d,1,%g,%g\" style=\"fill:none;stroke:%s;stroke-width:%g;stroke-opacity:0.5;stroke-dasharray:%g\"/>\n",
+                     p0.x, p0.y, r1*mile, r1*mile, span>180.0, p1.x, p1.y, col, (10 * symbolScale[zoom]), (30 * symbolScale[zoom]));
+            }
+            if ((arc == 0) && (att->val.val.l->next != NULL)) {
+              char *col = light_colours[att->val.val.l->next->val];
+              double r2 = r1 - (20 * symbolScale[zoom]/mile);
+              XY_t p2 = radial(pos, r2, b0);
+              XY_t p3 = radial(pos, r2, b1);
+              printf("<path d=\"M %g,%g A %g,%g,0,%d,1,%g,%g\" style=\"fill:none;stroke:%s;stroke-width:%g\"/>\n",
+                     p2.x, p2.y, r1*mile, r1*mile, span>180.0, p3.x, p3.y, col, (20 * symbolScale[zoom]));
+            }
+            b0 = b1;
+            if (b0 == end) break;
+          }
+          if (!((start == 180.0) && (end == 180.0)))
+            printf("<path d=\"M %g,%g L %g,%g\" style=\"fill:none;stroke:#808080;stroke-width:%g;stroke-dasharray:%g\"/>\n",
+                   pos.x, pos.y, p1.x, p1.y, (4 * symbolScale[zoom]), (20 * symbolScale[zoom]));
+          free(radstr);
+        }
+      }
+    }
+  }
+}
+char *charString(Item_t *item, char *type, int idx) {
+  strcpy(string1, "");
+  Att_t *att = NULL;
+  Obj_t *obj = getObj(item, enumType(type), idx);
+  switch (enumType(type)) {
+    case CGUSTA:
+      strcpy(string1, "CG");
+      if ((obj != NULL) && (att = getAtt(obj, COMCHA)) != NULL)
+        sprintf(strchr(string1, 0), " Ch.%s", stringValue(att->val));
+      break;
+    case FOGSIG:
+      if (obj != NULL) {
+        if ((att = getAtt(obj, CATFOG)) != NULL)
+          strcat(string1, fog_signals[att->val.val.e]);
+        if ((att = getAtt(obj, SIGGRP)) != NULL)
+          sprintf(strchr(string1, 0), "(%s)", stringValue(att->val));
+        else 
+          strcat(string1, " ");
+        if ((att = getAtt(obj, SIGPER)) != NULL)
+          sprintf(strchr(string1, 0), "%ss ", stringValue(att->val));
+        if ((att = getAtt(obj, VALMXR)) != NULL)
+          sprintf(strchr(string1, 0), "%sM", stringValue(att->val));
+      }
+      break;
+    case RTPBCN:
+      if (obj != NULL) {
+        if ((att = getAtt(obj, CATRTB)) != NULL)
+          strcat(string1, rtb_map[att->val.val.e]);
+        if ((att = getAtt(obj, SIGGRP)) != NULL)
+          sprintf(strchr(string1, 0), "(%s)", stringValue(att->val));
+        else 
+          strcat(string1, " ");
+        if ((att = getAtt(obj, SIGPER)) != NULL)
+          sprintf(strchr(string1, 0), "%ss ", stringValue(att->val));
+        if ((att = getAtt(obj, VALMXR)) != NULL)
+          sprintf(strchr(string1, 0), "%sM", stringValue(att->val));
+      }
+      break;
+    case SISTAT:
+      strcpy(string1, "SS");
+      if (obj != NULL) {
+        if ((att = getAtt(obj, CATSIT)) != NULL)
+          strcat(string1, sit_map[att->val.val.l->val]);
+        if ((att = getAtt(obj, COMCHA)) != NULL)
+          sprintf(strchr(string1, 0), "\nCh.%s", stringValue(att->val));
+      }
+      break;
+    case SISTAW:
+      strcpy(string1, "SS");
+      if (obj != NULL) {
+        if ((att = getAtt(obj, CATSIW)) != NULL)
+          strcat(string1, siw_map[att->val.val.l->val]);
+        if ((att = getAtt(obj, COMCHA)) != NULL)
+          sprintf(strchr(string1, 0), "\nCh.%s", stringValue(att->val));
+      }
+      break;
+    case LIGHTS:
+    {
+      int secmax = countObjects(item, "light");
+      if ((idx == 0) && (secmax > 0)) {
+        struct SECT {
+          struct SECT *next;
+          int dir;
+          LitCHR_t chr;
+          ColCOL_t col;
+          ColCOL_t alt;
+          char *grp;
+          double per;
+          double rng;
+        } *lights = NULL;
+        for (int i = secmax; i > 0; i--) {
+          struct SECT *tmp = calloc(1, sizeof(struct SECT));
+          tmp->next = lights;
+          lights = tmp;
+          obj = getObj(item, LIGHTS, i);
+          if ((att = getAtt(obj, CATLIT)) != NULL) {
+            lights->dir = testAtt(att, LIT_DIR);
+          }
+          if ((att = getAtt(obj, LITCHR)) != NULL) {
+            lights->chr = att->val.val.e;
+            switch (lights->chr) {
+              case CHR_AL:
+                lights->chr = CHR_F;
+                break;
+              case CHR_ALOC:
+                lights->chr = CHR_OC;
+                break;
+              case CHR_ALLFL:
+                lights->chr = CHR_LFL;
+                break;
+              case CHR_ALFL:
+                lights->chr = CHR_FL;
+                break;
+              case CHR_ALFFL:
+                lights->chr = CHR_FFL;
+                break;
+              default:
+                break;
+            }
+          }
+          if ((att = getAtt(obj, SIGGRP)) != NULL) {
+            lights->grp = att->val.val.a;
+          } else {
+            lights->grp = "";
+          }
+          if ((att = getAtt(obj, SIGPER)) != NULL) {
+            lights->per = att->val.val.f;
+          }
+          if ((att = getAtt(obj, VALNMR)) != NULL) {
+            lights->rng = att->val.val.f;
+          }
+          if ((att = getAtt(obj, COLOUR)) != NULL) {
+            lights->col = att->val.val.l->val;
+            if (att->val.val.l->next != NULL)
+              lights->alt = att->val.val.l->next->val;
+          }
+        }
+        struct COLRNG {
+          int col;
+          double rng;
+        } colrng[14];
+        while (lights != NULL) {
+          strcpy(string2, "");
+          bzero(colrng, 14*sizeof(struct COLRNG));
+          colrng[lights->col].col = 1;
+          colrng[lights->col].rng = lights->rng;
+          struct SECT *this = lights;
+          struct SECT *next = lights->next;
+          while (next != NULL) {
+            if ((this->dir == next->dir) && (this->chr == next->chr) &&
+                (strcmp(this->grp, next->grp) == 0) && (this->per == next->per)) {
+              colrng[next->col].col = 1;
+              if (next->rng > colrng[next->col].rng)
+                colrng[next->col].rng = next->rng;
+              struct SECT *tmp = lights;
+              while (tmp->next != next) tmp = tmp->next;
+              tmp->next = next->next;
+              free(next);
+              next = tmp->next;
+            } else {
+              next = next->next;
+            }
+          }
+          if (this->chr != CHR_UNKN) {
+            if (this->dir) strcpy(string2, "Dir.");
+            strcat(string2, light_characters[this->chr]);
+            if (strcmp(this->grp, "") != 0) {
+              if (this->grp[0] == '(')
+                sprintf(strchr(string2, 0), "%s", this->grp);
+              else
+                sprintf(strchr(string2, 0), "(%s)", this->grp);
+            } else {
+              if (strlen(string2) > 0) strcat(string2, ".");
+            }
+            int n = 0;
+            for (int i = 0; i < 14; i++) if (colrng[i].col) n++;
+            double max = 0.0;
+            for (int i = 0; i < 14; i++) if (colrng[i].col && (colrng[i].rng > max)) max = colrng[i].rng;
+            double min = max;
+            for (int i = 0; i < 14; i++) if (colrng[i].col && (colrng[i].rng > 0.0) && (colrng[i].rng < min)) min = colrng[i].rng;
+            if (min == max) {
+              for (int i = 0; i < 14; i++) if (colrng[i].col) strcat(string2, light_letters[i]);
+            } else {
+              for (int i = 0; i < 14; i++) if (colrng[i].col && (colrng[i].rng == max)) strcat(string2, light_letters[i]);
+              for (int i = 0; i < 14; i++) if (colrng[i].col && (colrng[i].rng < max) && (colrng[i].rng > min)) strcat(string2, light_letters[i]);
+              for (int i = 0; i < 14; i++) if (colrng[i].col && colrng[i].rng == min) strcat(string2, light_letters[i]);
+            }
+            strcat(string2, ".");
+            if (this->per > 0.0) sprintf(strchr(string2, 0), "%gs", this->per);
+            if (max > 0.0) {
+              sprintf(strchr(string2, 0), "%g", max);
+              if (min != max) {
+                if (n == 2) strcat(string2, "/");
+                else if (n > 2) strcat(string2, "-");
+                if (min < max) sprintf(strchr(string2, 0), "%g", min);
+              }
+              strcat(string2, "M");
+            }
+            if (strlen(string1) > 0) strcat(string1, "\n");
+            strcat(string1, string2);
+          }
+          lights = this->next;
+          free(this);
+          this = lights;
+        }
+      } else {
+        if ((att = getAtt(obj, CATLIT)) != NULL) {
+          if (testAtt(att, LIT_DIR))
+            strcat(string1, "Dir");
+        }
+        if ((att = getAtt(obj, MLTYLT)) != NULL)
+          sprintf(strchr(string1, 0), "%s", stringValue(att->val));
+        if ((att = getAtt(obj, LITCHR)) != NULL) {
+          char *chrstr = strdup(stringValue(att->val));
+          Att_t *grp = getAtt(obj, SIGGRP);
+          if (grp != NULL) {
+            char *strgrp = strdup(stringValue(grp->val));
+            char *grpstr = strtok(strgrp, "()");
+            switch (att->val.val.e) {
+              case CHR_QLFL:
+                sprintf(strchr(string1, 0), "Q(%s)+LFl", grpstr);
+                break;
+              case CHR_VQLFL:
+                sprintf(strchr(string1, 0), "VQ(%s)+LFl", grpstr);
+                break;
+              case CHR_UQLFL:
+                sprintf(strchr(string1, 0), "UQ(%s)+LFl", grpstr);
+                break;
+              default:
+                sprintf(strchr(string1, 0), "%s(%s)", chrstr, grpstr);
+                break;
+            }
+            free(strgrp);
+          } else {
+            sprintf(strchr(string1, 0), "%s", chrstr);
+          }
+          free(chrstr);
+        }
+        if ((att = getAtt(obj, COLOUR)) != NULL) {
+          int n = countValues(att);
+          if (!((n == 1) && (idx == 0) && (testAtt(att, COL_WHT)))) {
+            if ((strlen(string1) > 0) && ((string1[strlen(string1)-1] != ')')))
+              strcat(string1, ".");
+            Lst_t *lst = att->val.val.l;
+            while (lst != NULL) {
+              strcat(string1, light_letters[lst->val]);
+              lst = lst->next;
+            }
+          }
+        }
+        if ((idx == 0) && (att = getAtt(obj, CATLIT)) != NULL) {
+          if (testAtt(att, LIT_VERT))
+            strcat(string1, "(vert)");
+          if (testAtt(att, LIT_HORI))
+            strcat(string1, "(hor)");
+        }
+        if ((strlen(string1) > 0) &&
+            ((getAtt(obj, SIGPER) != NULL) ||
+             (getAtt(obj, HEIGHT) != NULL) ||
+             (getAtt(obj, VALMXR) != NULL)) &&
+            (string1[strlen(string1)-1] != ')'))
+          strcat(string1, ".");
+        if ((att = getAtt(obj, SIGPER)) != NULL)
+          sprintf(strchr(string1, 0), "%ss", stringValue(att->val));
+        if ((idx == 0) && (item->objs.obj != LITMIN)) {
+          if ((att = getAtt(obj, HEIGHT)) != NULL)
+            sprintf(strchr(string1, 0), "%sm", stringValue(att->val));
+          if ((att = getAtt(obj, VALNMR)) != NULL)
+            sprintf(strchr(string1, 0), "%sM", stringValue(att->val));
+        }
+        if ((idx == 0) && (att = getAtt(obj, CATLIT)) != NULL) {
+          if (testAtt(att, LIT_FRNT))
+            strcat(string1, "(Front)");
+          if (testAtt(att, LIT_REAR))
+            strcat(string1, "(Rear)");
+          if (testAtt(att, LIT_UPPR))
+            strcat(string1, "(Upper)");
+          if (testAtt(att, LIT_LOWR))
+            strcat(string1, "(Lower)");
+        }
+      }
+    }
+      break;
+    default: break;
+ }
+  return string1;
+}
+*/
+	
+}
Index: applications/editors/josm/plugins/smed2/src/seamap/NoticeRender.java
===================================================================
--- applications/editors/josm/plugins/smed2/src/seamap/NoticeRender.java	(revision 29286)
+++ applications/editors/josm/plugins/smed2/src/seamap/NoticeRender.java	(revision 29286)
@@ -0,0 +1,216 @@
+/* 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;
+
+public class NoticeRender {
+	/*void renderNotice(Item_t *item) {
+  double dx = 0.0, dy = 0.0;
+  int n = countObjects(item, "notice");
+  if (n > 2) {
+    renderCluster(item, "notice");
+    return;
+  }
+  switch (item->objs.obj) {
+    case BCNCAR:
+    case BCNISD:
+    case BCNLAT:
+    case BCNSAW:
+    case BCNSPP:
+    case BCNWTW:
+      dy = 45.0;
+      break;
+    case NOTMRK:
+      dy = 0.0;
+      break;
+    default:
+      return;
+  }
+  bool swap = false;
+  if (n == 2) {
+    for (int i = 0; i <=2; i++) {
+      Obj_t *obj = getObj(item, NOTMRK, i);
+      if (obj == NULL) continue;
+      Atta_t add;
+      int idx = 0;
+      while ((add = getAttEnum(obj, ADDMRK, idx++)) != MRK_UNKN) {
+        if ((add == MRK_LTRI) && (i == 2)) swap = true;
+        if ((add == MRK_RTRI) && (i != 2)) swap = true;
+      }
+    }
+  }
+  for (int i = 0; i <=2; i++) {
+    Obj_t *obj = getObj(item, NOTMRK, i);
+    if (obj == NULL) continue;
+    Atta_t category = getAttEnum(obj, CATNMK, i);
+    Atta_t add;
+    int idx = 0;
+    int top=0, bottom=0, left=0, right=0;
+    while ((add = getAttEnum(obj, ADDMRK, idx++)) != MRK_UNKN) {
+      switch (add) {
+        case MRK_TOPB:
+          top = add;
+          break;
+        case MRK_BOTB:
+        case MRK_BTRI:
+          bottom = add;
+          break;
+        case MRK_LTRI:
+          left = add;
+          break;
+        case MRK_RTRI:
+          right = add;
+          break;
+        default:
+          break;
+      }
+    }
+    double orient = getAtt(obj, ORIENT) != NULL ? getAtt(obj, ORIENT)->val.val.f : 0.0;
+    int system = getAtt(obj, MARSYS) != NULL ? getAtt(obj, MARSYS)->val.val.e : 0;
+    double flip = 0.0;
+    char *symb = "";
+    char *base = "";
+    char *colour = "black";
+    if ((system == SYS_BWR2) || (system == SYS_BNWR)) {
+      symb = bniwr_map[category];
+      switch (category) {
+        case NMK_NANK:
+        case NMK_LMHR:
+        case NMK_KTPM...NMK_RSPD:
+        {
+          int bank = getAtt(obj, BNKWTW) != NULL ? getAtt(obj, BNKWTW)->val.val.e : 0;
+          switch (bank) {
+            case BWW_LEFT:
+              base = "notice_blb";
+              colour = "red";
+              break;
+            case BWW_RGHT:
+              base = "notice_brb";
+              colour = "green";
+              break;
+            default:
+              base = "notice_bsi";
+              colour = "black";
+              break;
+          }
+        }
+        default:
+          break;
+      }
+    } else if (system == SYS_PPWB) {
+      int bank = getAtt(obj, BNKWTW) != NULL ? getAtt(obj, BNKWTW)->val.val.e : 0;
+      if (bank != 0) {
+        switch (category) {
+          case NMK_WLAR:
+            if (bank == BNK_LEFT)
+              base = "notice_pwlarl";
+            else
+              base = "notice_pwlarr";
+            break;
+          case NMK_WRAL:
+            if (bank == BNK_LEFT)
+              base = "notice_pwrall";
+            else
+              base = "notice_pwralr";
+            break;
+          case NMK_KTPM:
+            if (bank == BNK_LEFT)
+              base = "notice_ppml";
+            else
+              base = "notice_ppmr";
+            break;
+          case NMK_KTSM:
+            if (bank == BNK_LEFT)
+              base = "notice_psml";
+            else
+              base = "notice_psmr";
+            break;
+          case NMK_KTMR:
+            if (bank == BNK_LEFT)
+              base = "notice_pmrl";
+            else
+              base = "notice_pmrr";
+            break;
+          case NMK_CRTP:
+          if (bank == BNK_LEFT)
+              base = "notice_pcpl";
+            else
+              base = "notice_pcpr";
+            break;
+          case NMK_CRTS:
+            if (bank == BNK_LEFT)
+              base = "notice_pcsl";
+            else
+              base = "notice_pcsr";
+            break;
+          default:
+            break;
+        }
+      }
+    } else {
+      symb = notice_map[category];
+      switch (category) {
+        case NMK_NOVK...NMK_NWSH:
+        case NMK_NMTC...NMK_NLBG:
+          base = "notice_a";
+          break;
+        case NMK_MVTL...NMK_CHDR:
+          base = "notice_b";
+          break;
+        case NMK_PRTL...NMK_PRTR:
+        case NMK_OVHC...NMK_LBGP:
+          base = "notice_e";
+          colour = "white";
+          break;
+        default:
+          break;
+      }
+      switch (category) {
+        case NMK_MVTL:
+        case NMK_ANKP:
+        case NMK_PRTL:
+        case NMK_MWAL:
+        case NMK_MWAR:
+          flip = 180.0;
+          break;
+        case NMK_SWWR:
+        case NMK_WRSL:
+        case NMK_WARL:
+          flip = -90.0;
+          break;
+        case NMK_SWWC:
+        case NMK_SWWL:
+        case NMK_WLSR:
+        case NMK_WALR:
+          flip = 90.0;
+          break;
+        default:
+          break;
+      }
+    }
+    if (n == 2) {
+      dx = (((i != 2) && swap) || ((i == 2) && !swap)) ? -30.0 : 30.0;
+    }
+    if (top == MRK_TOPB)
+      renderSymbol(item, NOTMRK, "notice_board", "", "", BC, dx, dy, orient);
+    if (bottom == MRK_BOTB)
+      renderSymbol(item, NOTMRK, "notice_board", "", "", BC, dx, dy, orient+180);
+    if (bottom == MRK_BTRI)
+      renderSymbol(item, NOTMRK, "notice_triangle", "", "", BC, dx, dy, orient+180);
+    if (left == MRK_LTRI)
+      renderSymbol(item, NOTMRK, "notice_triangle", "", "", BC, dx, dy, orient-90);
+    if (right == MRK_RTRI)
+      renderSymbol(item, NOTMRK, "notice_triangle", "", "", BC, dx, dy, orient+90);
+    renderSymbol(item, NOTMRK, base, "", "", CC, dx, dy, orient);
+    renderSymbol(item, NOTMRK, symb, "", colour, CC, dx, dy, orient+flip);
+  }
+}
+*/
+
+}
Index: applications/editors/josm/plugins/smed2/src/seamap/Rules.java
===================================================================
--- applications/editors/josm/plugins/smed2/src/seamap/Rules.java	(revision 29281)
+++ applications/editors/josm/plugins/smed2/src/seamap/Rules.java	(revision 29286)
@@ -101,63 +101,4 @@
 	}
 	
-	private static void shoreline(Feature feature) {
-		if (zoom >= 12) {
-			switch ((CatSLC) Renderer.getAttVal(feature, feature.type, 0, Att.CATSLC)) {
-			case SLC_TWAL:
-				WatLEV lev = (WatLEV) Renderer.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));
-					if (zoom >= 15)
-						Renderer.lineText(feature, "(covers)", new Font("Arial", Font.PLAIN, 80), 0.5, 20);
-				} else {
-					Renderer.lineVector(feature, new LineStyle(Color.black, 10, null, null));
-				}
-				if (zoom >= 15)
-					Renderer.lineText(feature, "Training Wall", new Font("Arial", Font.PLAIN, 80), 0.5, -20);
-			}
-		}
-	}
-	private static void pipelines(Feature feature) {
-		if (zoom >= 14) {
-			if (feature.type == Obj.PIPSOL) {
-				Renderer.lineSymbols(feature, Areas.Pipeline, 1.0, null, 0);
-			} else if (feature.type == Obj.PIPOHD) {
-
-			}
-		}
-	}
-	private static void cables(Feature feature) {
-		if (zoom >= 14) {
-			if (feature.type == Obj.CBLSUB) {
-				Renderer.lineSymbols(feature, Areas.Cable, 0.0, null, 0);
-			} else if (feature.type == Obj.CBLOHD) {
-
-			}
-		}
-	}
-	private static void separation(Feature feature) {
-		switch (feature.type) {
-		case TSEZNE:
-		case TSSCRS:
-		case TSSRON:
-			if (zoom <= 15)
-				Renderer.lineVector(feature, new LineStyle(null, 0, null, new Color(0x80c480ff, true)));
-			else
-				Renderer.lineVector(feature, new LineStyle(new Color(0x80c480ff, true), 20, null, null));
-			AttItem name = feature.atts.get(Att.OBJNAM);
-			if ((zoom >= 10) && (name != null))
-				Renderer.labelText(feature, (String) name.val, new Font("Arial", Font.BOLD, 150), new Color(0x80c480ff), null);
-			break;
-		case TSELNE:
-			Renderer.lineVector(feature, new LineStyle(new Color(0x80c480ff, true), 20, null, null));
-			break;
-		case TSSLPT:
-			Renderer.lineSymbols(feature, Areas.LaneArrow, 0.5, null, 0);
-			break;
-		case TSSBND:
-			Renderer.lineVector(feature, new LineStyle(new Color(0x80c480ff, true), 20, new float[] { 40, 40 }, null));
-			break;
-		}
-	}
 	private static void areas(Feature feature) {
 		AttItem name = feature.atts.get(Att.OBJNAM);
@@ -264,28 +205,102 @@
  */
 	}
-
-	private static void obstructions(Feature feature) {
-		if ((zoom >= 14) && (feature.type == Obj.UWTROC)) {
-			WatLEV lvl = (WatLEV) Renderer.getAttVal(feature, feature.type, 0, Att.WATLEV);
-			switch (lvl) {
-			case LEV_CVRS:
-				Renderer.symbol(feature, Areas.RockC, null, null);
-				break;
-			case LEV_AWSH:
-				Renderer.symbol(feature, Areas.RockA, null, null);
+	private static void beacons(Feature feature) {
+		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, null, null);
+				else
+					Renderer.symbol(feature, Beacons.WithyPort, null, null);
+				break;
+			case LAM_STBD:
+				if (shape == BcnSHP.BCN_PRCH)
+					Renderer.symbol(feature, Beacons.PerchStarboard, null, null);
+				else
+					Renderer.symbol(feature, Beacons.WithyStarboard, null, null);
 				break;
 			default:
-				Renderer.symbol(feature, Areas.Rock, null, null);
+				Renderer.symbol(feature, Beacons.Stake, feature.type, null);
 			}
 		} else {
-			Renderer.symbol(feature, Areas.Rock, null, null);
-		}
-	}
-	private static void waterways(Feature feature) {
-		if ((zoom >= 14) && (feature.atts.get(Att.OBJNAM) != null)) {
-			// lineText(item_attribute("name"), "font-family:Arial;font-weight:bold;font-size:80;text-anchor:middle", 0.5, 15, line("stroke:none;fill:none"));
-		}
-	}
-	private static void transits(Feature feature) {
+			Renderer.symbol(feature, Beacons.Shapes.get(shape), feature.type, 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, Topmarks.Beacons);
+		}
+	}
+	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);
+		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, Topmarks.Buoys.get(shape));
+		}
+	}
+	private static void bridges(Feature feature) {
+		if (zoom >= 16) {
+			
+		}
+/*      Att_t *attv = getAtt(getObj(item, BRIDGE, 0), VERCLR);
+      if (attv == NULL) attv = getAtt(getObj(item, BRIDGE, 0), VERCSA);
+      Att_t *attc = getAtt(getObj(item, BRIDGE, 0), VERCCL);
+      Att_t *atto = getAtt(getObj(item, BRIDGE, 0), VERCOP);
+      if (attv != NULL) {
+        renderSymbol(item, obja, "clear_v", "", "", CC, 0, 0, 0);
+        drawText(item, stringValue(attv->val), "font-family:Arial; font-weight:normal; font-size:70; text-anchor:middle", 0, 12);
+      }
+      else if ((attc != NULL) && (atto == NULL)) {
+        renderSymbol(item, obja, "clear_v", "", "", CC, 0, 0, 0);
+        drawText(item, stringValue(attc->val), "font-family:Arial; font-weight:normal; font-size:70; text-anchor:middle", 0, 12);
+      }
+      else if ((attc != NULL) && (atto != NULL)) {
+        renderSymbol(item, obja, "clear_v", "", "", RC, 5, 0, 0);
+        drawText(item, stringValue(attc->val), "font-family:Arial; font-weight:normal; font-size:70; text-anchor:middle", -35, 12);
+        renderSymbol(item, obja, "clear_v", "", "", LC, -5, 0, 0);
+        drawText(item, stringValue(atto->val), "font-family:Arial; font-weight:normal; font-size:70; text-anchor:middle", 35, 12);
+      }
+    }
+*/
+	}
+	private static void cables(Feature feature) {
+		if (zoom >= 14) {
+			if (feature.type == Obj.CBLSUB) {
+				Renderer.lineSymbols(feature, Areas.Cable, 0.0, null, 0);
+			} else if (feature.type == Obj.CBLOHD) {
+
+			}
+		}
+	}
+	private static void distances(Feature feature) {
+/*object_rules(distances) {
+  if ((zoom>=16) && (has_attribute("category"))) {
+    attribute_switch("category")
+    attribute_case("installed") symbol("distance_i");
+    attribute_default symbol("distance_u");
+    end_switch
+  }
+}
+*/
+	}
+	private static void floats(Feature feature) {
+		switch (feature.type) {
+		case LITVES:
+			Renderer.symbol(feature, Buoys.Super, feature.type, null);
+			break;
+		case LITFLT:
+			Renderer.symbol(feature, Buoys.Float, feature.type, null);
+			break;
+		case BOYINB:
+			Renderer.symbol(feature, Buoys.Storage, feature.type, null);
+			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, Topmarks.Floats);
+	}
+	private static void gauges(Feature feature) {
+/*object_rules(gauge) {
+  if (zoom >= 14) symbol("tide_gauge");
+}
+*/
 	}
 	private static void harbours(Feature feature) {
@@ -304,5 +319,5 @@
 		}
 	}
-	/*
+/*
 	 *   if ((zoom >= 12) && is_type("anchorage")) {
     symbol("anchorage");
@@ -323,12 +338,5 @@
       text(item_attribute("name"), "font-family:Arial; font-weight:bold; font-size:80; text-anchor:middle", 0, -90);
   }
-
-	 */
-	private static void locks(Feature feature) {
-	}
-	private static void distances(Feature feature) {
-	}
-	private static void ports(Feature feature) {
-	}
+*/
 	private static void landmarks(Feature feature) {
 		ArrayList<CatLMK> cats = (ArrayList<CatLMK>) Renderer.getAttVal(feature, feature.type, 0, Att.CATLMK);
@@ -344,4 +352,91 @@
 		Renderer.symbol(feature, catSym, null, null);
 		Renderer.symbol(feature, fncSym, null, null);
+/*  if (!has_attribute("function") && !has_attribute("category") && has_object("light")) {
+    symbol("lighthouse");
+    if ((zoom >= 15) && has_item_attribute("name"))
+      text(item_attribute("name"), "font-family:Arial; font-weight:bold; font-size:80; text-anchor:middle", 0, -70);
+  } else {
+    if ((zoom >= 15) && has_item_attribute("name"))
+      text(item_attribute("name"), "font-family:Arial; font-weight:bold; font-size:80; text-anchor:start", 60, -50);
+  }
+  if (has_object("fog_signal")) object(fogs);
+  if (has_object("radar_transponder")) object(rtbs);
+  if (has_object("radar_station") && (zoom >= 12)) symbol("radar_station");
+  if (has_object("light")) object(lights);
+}
+*/
+	}
+	private static void lights(Feature feature) {
+		switch (feature.type) {
+		case LITMAJ:
+			Renderer.symbol(feature, Beacons.LightMajor, null, null);
+			break;
+		case LITMIN:
+		case LIGHTS:
+			Renderer.symbol(feature, Beacons.LightMinor, null, null);
+			break;
+		}
+	}
+	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) {
+		if (zoom >= 16) {
+			
+		}
+/*      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) {
@@ -365,10 +460,177 @@
 			break;
 		}
+/*  if (has_object("fog_signal")) object(fogs);
+  if (has_object("radar_transponder")) object(rtbs);
+  if (has_object("light")) object(lights);
+}
+*/
 	}
 	private static void notices(Feature feature) {
-	}
-	private static void marinas(Feature feature) {
-	}
-	private static void bridges(Feature feature) {
+		if (zoom >= 14) {
+		}
+	}
+	private static void obstructions(Feature feature) {
+		if ((zoom >= 14) && (feature.type == Obj.UWTROC)) {
+			WatLEV lvl = (WatLEV) Renderer.getAttVal(feature, feature.type, 0, Att.WATLEV);
+			switch (lvl) {
+			case LEV_CVRS:
+				Renderer.symbol(feature, Areas.RockC, null, null);
+				break;
+			case LEV_AWSH:
+				Renderer.symbol(feature, Areas.RockA, null, null);
+				break;
+			default:
+				Renderer.symbol(feature, Areas.Rock, null, null);
+			}
+		} else {
+			Renderer.symbol(feature, Areas.Rock, null, null);
+		}
+	}
+	private static void pipelines(Feature feature) {
+		if (zoom >= 14) {
+			if (feature.type == Obj.PIPSOL) {
+				Renderer.lineSymbols(feature, Areas.Pipeline, 1.0, null, 0);
+			} else if (feature.type == Obj.PIPOHD) {
+
+			}
+		}
+	}
+	private static void platforms(Feature feature) {
+		Renderer.symbol(feature, Landmarks.Platform, null, null);
+/*object_rules(platforms) {
+  if (has_attribute("category")) {
+    attribute_switch("category")
+    attribute_case("fpso") symbol("storage");
+    attribute_default symbol("platform");
+    end_switch
+  } else {
+    symbol("platform");
+  }
+  if ((zoom >= 15) && has_item_attribute("name"))
+    text(item_attribute("name"), "font-family:Arial; font-weight:bold; font-size:80; text-anchor:start", 60, -50);
+  if (has_object("fog_signal")) object(fogs);
+  if (has_object("radar_transponder")) object(rtbs);
+  if (has_object("light")) object(lights);
+}
+*/
+	}
+	private static void ports(Feature feature) {
+/*object_rules(ports) {
+  if (zoom>=14) {
+    if (is_type("crane")) {
+      if (attribute_test("category", "container_crane")) symbol("container_crane");
+      else symbol("port_crane");
+    }
+    if (is_type("hulk")) {
+      area("fill:#ffe000;fill-opacity:1;stroke:#000000;stroke-width:2;stroke-opacity:1");
+      if ((zoom >= 15) && (has_item_attribute("name")))
+        text(item_attribute("name"), "font-family:Arial; font-weight:bold; font-size:70; text-anchor:middle", 0, 0);
+    }
+  }
+}
+*/
+	}
+	private static void separation(Feature feature) {
+		switch (feature.type) {
+		case TSEZNE:
+		case TSSCRS:
+		case TSSRON:
+			if (zoom <= 15)
+				Renderer.lineVector(feature, new LineStyle(null, 0, null, new Color(0x80c480ff, true)));
+			else
+				Renderer.lineVector(feature, new LineStyle(new Color(0x80c480ff, true), 20, null, null));
+			AttItem name = feature.atts.get(Att.OBJNAM);
+			if ((zoom >= 10) && (name != null))
+				Renderer.labelText(feature, (String) name.val, new Font("Arial", Font.BOLD, 150), new Color(0x80c480ff), null);
+			break;
+		case TSELNE:
+			Renderer.lineVector(feature, new LineStyle(new Color(0x80c480ff, true), 20, null, null));
+			break;
+		case TSSLPT:
+			Renderer.lineSymbols(feature, Areas.LaneArrow, 0.5, null, 0);
+			break;
+		case TSSBND:
+			Renderer.lineVector(feature, new LineStyle(new Color(0x80c480ff, true), 20, new float[] { 40, 40 }, null));
+			break;
+		}
+	}
+	private static void shoreline(Feature feature) {
+		if (zoom >= 12) {
+			switch ((CatSLC) Renderer.getAttVal(feature, feature.type, 0, Att.CATSLC)) {
+			case SLC_TWAL:
+				WatLEV lev = (WatLEV) Renderer.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));
+					if (zoom >= 15)
+						Renderer.lineText(feature, "(covers)", new Font("Arial", Font.PLAIN, 80), 0.5, 20);
+				} else {
+					Renderer.lineVector(feature, new LineStyle(Color.black, 10, null, null));
+				}
+				if (zoom >= 15)
+					Renderer.lineText(feature, "Training Wall", new Font("Arial", Font.PLAIN, 80), 0.5, -20);
+			}
+		}
+	}
+	private static void signals(Feature feature) {
+		switch (feature.type) {
+		case SISTAT:
+		case SISTAW:
+			Renderer.symbol(feature, Harbours.SignalStation, null, null);
+			break;
+		case RDOSTA:
+			Renderer.symbol(feature, Harbours.SignalStation, null, null);
+			break;
+		case RADSTA:
+			Renderer.symbol(feature, Harbours.SignalStation, null, null);
+			Renderer.symbol(feature, Beacons.RadarStation, null, null);
+			break;
+		case PILBOP:
+			Renderer.symbol(feature, Harbours.Pilot, null, null);
+			break;
+		case CGUSTA:
+			Renderer.symbol(feature, Harbours.SignalStation, null, null);
+			break;
+		case RSCSTA:
+			Renderer.symbol(feature, Harbours.Rescue, null, null);
+			break;
+		}
+/*  if (has_object("fog_signal")) object(fogs);
+  if (has_object("radar_transponder")) object(rtbs);
+  if (has_object("light")) object(lights);
+}
+*/
+	}
+	private static void transits(Feature feature) {
+/*object_rules(transits) {
+  int ref;
+  if (zoom >= 12) {
+    if (is_type("recommended_track")) ref = line("stroke-width:8; stroke:#000000; stroke-linecap:butt; fill:none");
+    else if (is_type("navigation_line")) ref = line("stroke-width:8; stroke-dasharray:20,20; stroke:#000000; stroke-linecap:butt; fill:none");
+  }
+  if (zoom >= 15) {
+    make_string("");
+    if (has_object("name")) {
+      add_string(item_attribute("name"));
+      add_string(" ");
+    }
+    if (has_attribute("orientation")) {
+      add_string(attribute("orientation"));
+      add_string("¡");
+    }
+    if (has_attribute("category")) {
+      add_string(" (");
+      add_string(attribute("category"));
+      add_string(")");
+    }
+    line_text(string, "font-family:Arial; font-weight:normal; font-size:80; text-anchor:middle", 0.5, -20, ref);
+    free_string
+  }
+}
+*/
+	}
+	private static void waterways(Feature feature) {
+		if ((zoom >= 14) && (feature.atts.get(Att.OBJNAM) != null)) {
+			// lineText(item_attribute("name"), "font-family:Arial;font-weight:bold;font-size:80;text-anchor:middle", 0.5, 15, line("stroke:none;fill:none"));
+		}
 	}
 	private static void wrecks(Feature feature) {
@@ -390,91 +652,3 @@
 		}
 	}
-	private static void gauges(Feature feature) {
-	}
-	private static void lights(Feature feature) {
-		switch (feature.type) {
-		case LITMAJ:
-			Renderer.symbol(feature, Beacons.LightMajor, null, null);
-			break;
-		case LITMIN:
-		case LIGHTS:
-			Renderer.symbol(feature, Beacons.LightMinor, null, null);
-			break;
-		}
-	}
-	private static void signals(Feature feature) {
-		switch (feature.type) {
-		case SISTAT:
-		case SISTAW:
-			Renderer.symbol(feature, Harbours.SignalStation, null, null);
-			break;
-		case RDOSTA:
-			Renderer.symbol(feature, Harbours.SignalStation, null, null);
-			break;
-		case RADSTA:
-			Renderer.symbol(feature, Harbours.SignalStation, null, null);
-			Renderer.symbol(feature, Beacons.RadarStation, null, null);
-			break;
-		case PILBOP:
-			Renderer.symbol(feature, Harbours.Pilot, null, null);
-			break;
-		case CGUSTA:
-			Renderer.symbol(feature, Harbours.SignalStation, null, null);
-			break;
-		case RSCSTA:
-			Renderer.symbol(feature, Harbours.Rescue, null, null);
-			break;
-		}
-	}
-	private static void floats(Feature feature) {
-		switch (feature.type) {
-		case LITVES:
-			Renderer.symbol(feature, Buoys.Super, feature.type, null);
-			break;
-		case LITFLT:
-			Renderer.symbol(feature, Buoys.Float, feature.type, null);
-			break;
-		case BOYINB:
-			Renderer.symbol(feature, Buoys.Storage, feature.type, null);
-			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, Topmarks.Floats);
-	}
-	private static void platforms(Feature feature) {
-		Renderer.symbol(feature, Landmarks.Platform, null, null);
-	}
-	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);
-		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, Topmarks.Buoys.get(shape));
-		}
-	}
-	private static void beacons(Feature feature) {
-		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, null, null);
-				else
-					Renderer.symbol(feature, Beacons.WithyPort, null, null);
-				break;
-			case LAM_STBD:
-				if (shape == BcnSHP.BCN_PRCH)
-					Renderer.symbol(feature, Beacons.PerchStarboard, null, null);
-				else
-					Renderer.symbol(feature, Beacons.WithyStarboard, null, null);
-				break;
-			default:
-				Renderer.symbol(feature, Beacons.Stake, feature.type, null);
-			}
-		} else {
-			Renderer.symbol(feature, Beacons.Shapes.get(shape), feature.type, 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, Topmarks.Beacons);
-		}
-	}
-}
+}
Index: applications/editors/josm/plugins/smed2/src/seamap/SeaMap.java
===================================================================
--- applications/editors/josm/plugins/smed2/src/seamap/SeaMap.java	(revision 29281)
+++ applications/editors/josm/plugins/smed2/src/seamap/SeaMap.java	(revision 29286)
@@ -1,3 +1,3 @@
-/* Copyright 2012 Malcolm Herring
+/* Copyright 2013 Malcolm Herring
  *
  * This is free software: you can redistribute it and/or modify
Index: applications/editors/josm/plugins/smed2/src/smed2/MapImage.java
===================================================================
--- applications/editors/josm/plugins/smed2/src/smed2/MapImage.java	(revision 29281)
+++ applications/editors/josm/plugins/smed2/src/smed2/MapImage.java	(revision 29286)
@@ -1,2 +1,11 @@
+/* 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 smed2;
 
Index: applications/editors/josm/plugins/smed2/src/smed2/Smed2Action.java
===================================================================
--- applications/editors/josm/plugins/smed2/src/smed2/Smed2Action.java	(revision 29281)
+++ applications/editors/josm/plugins/smed2/src/smed2/Smed2Action.java	(revision 29286)
@@ -1,2 +1,11 @@
+/* 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 smed2;
 
@@ -138,4 +147,5 @@
 		showFrame.setResizable(false);
 		showFrame.setAlwaysOnTop(true);
+		showFrame.setEnabled(false);
 		showFrame.setVisible(false);
 
@@ -192,5 +202,5 @@
 						node = nextNode;
 //						showFrame.setVisible(true);
-//						showFrame.showFeature(node, map);
+						showFrame.showFeature(node, map);
 					}
 				} else {
@@ -204,5 +214,5 @@
 						way = nextWay;
 //						showFrame.setVisible(true);
-//						showFrame.showFeature(way, map);
+						showFrame.showFeature(way, map);
 					}
 				} else {
Index: applications/editors/josm/plugins/smed2/src/symbols/Symbols.java
===================================================================
--- applications/editors/josm/plugins/smed2/src/symbols/Symbols.java	(revision 29281)
+++ applications/editors/josm/plugins/smed2/src/symbols/Symbols.java	(revision 29286)
@@ -1,3 +1,3 @@
-/* Copyright 2012 Malcolm Herring
+/* Copyright 2013 Malcolm Herring
  *
  * This is free software: you can redistribute it and/or modify
