diff -ruN freeciv.orig/common/map.c freeciv/common/map.c
--- freeciv.orig/common/map.c	Sat Jun 17 20:05:20 2000
+++ freeciv/common/map.c	Sun Jun 18 11:27:06 2000
@@ -58,6 +58,16 @@
   "Airbase"
 };
 
+/* Names of terrain flags.
+ * (These must correspond to enum terrain_flag in terrain.h.)
+ */
+static char *terrain_flag_names[] = {
+  "Land",
+  "Ocean",
+  "SweetWater",
+  NULL
+};
+
 /***************************************************************
   Return a (static) string with terrain name;
   eg: "Hills"
@@ -220,6 +230,19 @@
   }
 
   return NULL;
+}
+
+/***************************************************************
+translates string to terrain flag
+***************************************************************/
+enum terrain_flag terrain_flag_from_str (char *s) {
+  int i;
+
+  for (i=0; terrain_flag_names[i]; i++)
+    if ( !strcmp (terrain_flag_names[i], s))
+      return 1<<i;
+  freelog(LOG_FATAL, "Unknown terrain flag: %s", s);
+  exit (1);
 }
 
 /***************************************************************
diff -ruN freeciv.orig/common/map.h freeciv/common/map.h
--- freeciv.orig/common/map.h	Sat Jun 17 20:05:20 2000
+++ freeciv/common/map.h	Sat Jun 17 23:13:53 2000
@@ -84,6 +84,7 @@
   char graphic_str[MAX_LEN_NAME];
   char graphic_alt[MAX_LEN_NAME];
   struct Sprite *sprite[NUM_DIRECTION_NSEW];
+  enum terrain_flag flags;
 
   int movement_cost;
   int defense_bonus;
@@ -202,6 +203,7 @@
 char *get_terrain_name(enum tile_terrain_type type);
 enum tile_special_type get_special_by_name(char * name);
 char *get_special_name(enum tile_special_type type);
+enum terrain_flag terrain_flag_from_str (char *s);
 int is_terrain_near_tile(int x, int y, enum tile_terrain_type t);
 int isnt_terrain_near_tile(int x, int y, enum tile_terrain_type t);
 int count_terrain_near_tile(int x, int y, enum tile_terrain_type t);
diff -ruN freeciv.orig/common/terrain.h freeciv/common/terrain.h
--- freeciv.orig/common/terrain.h	Wed May 24 21:13:02 2000
+++ freeciv/common/terrain.h	Sat Jun 17 22:08:12 2000
@@ -18,6 +18,10 @@
   R_AS_TERRAIN=1, R_AS_SPECIAL=2
 };
 
+enum terrain_flag {
+  TF_LAND=1, TF_OCEAN=2, TF_SWEETWATER=4
+};
+
 enum special_river_move {
   RMV_NORMAL=0, RMV_FAST_STRICT=1, RMV_FAST_RELAXED=2, RMV_FAST_ALWAYS=3
 };
diff -ruN freeciv.orig/server/ruleset.c freeciv/server/ruleset.c
--- freeciv.orig/server/ruleset.c	Thu May 25 13:16:05 2000
+++ freeciv/server/ruleset.c	Sun Jun 18 10:58:09 2000
@@ -1120,7 +1120,7 @@
   struct section_file file;
   char *filename, *datafile_options;
   int nval;
-  char **sec;
+  char *sval, **slist, **sec;
   int i, j;
   struct tile_type *t;
 
@@ -1257,8 +1257,29 @@
       t->transform_time = secfile_lookup_int(&file, "%s.transform_time", sec[i]);
       
       t->helptext = lookup_helptext(&file, sec[i]);
-    }
 
+      slist = secfile_lookup_str_vec (&file, &nval, "%s.flags", sec[i]);
+
+      for (j=0; j<nval; j++) {
+	sval = slist[j];
+	if (!strcmp(sval,""))
+	    continue;
+        t->flags |= terrain_flag_from_str (sval);
+      }
+      free(slist);
+      
+      if (! (t->flags & (TF_OCEAN | TF_LAND))) {
+          freelog ( LOG_FATAL, "Terrain %s is neither Land or Ocean (%s)",
+	            t->terrain_name, filename);
+          exit (1);
+      }
+      /* We will, of course, support it later */
+      if ((t->flags & TF_OCEAN) && (t->flags & TF_LAND)) {
+          freelog ( LOG_FATAL, "Terrain %s is both Land and Ocean (%s)",
+	            t->terrain_name, filename);
+          exit (1);
+      }
+    }
   section_file_check_unused(&file, filename);
   section_file_free(&file);