diff -Nurd -x*.[Poa] -x*.orig -x *.rej -x*.bak -x*.pot -x*.deps -x Makefile -xlibintl.h -xFreeciv.h freeciv/server/civserver.c freeciv-mar6+firstlevel/server/civserver.c
--- freeciv/server/civserver.c	Sat Mar  4 16:14:59 2000
+++ freeciv-mar6+firstlevel/server/civserver.c	Tue Mar  7 21:27:16 2000
@@ -1365,6 +1365,7 @@
   sz_strlcpy(pplayer->username, name);
   pplayer->conn = pconn;
   pplayer->is_connected = (pconn!=NULL);
+
   if (pconn) {
     sz_strlcpy(pplayer->addr, pconn->addr); 
     join_game_accept(pplayer, 0);
diff -Nurd -x*.[Poa] -x*.orig -x *.rej -x*.bak -x*.pot -x*.deps -x Makefile -xlibintl.h -xFreeciv.h freeciv/server/sernet.c freeciv-mar6+firstlevel/server/sernet.c
--- freeciv/server/sernet.c	Sun Mar  5 17:52:05 2000
+++ freeciv-mar6+firstlevel/server/sernet.c	Tue Mar  7 21:24:03 2000
@@ -282,7 +282,7 @@
       connections[i].buffer.ndata=0;
       connections[i].first_packet=1;
       connections[i].byte_swap=0;
-      connections[i].access_level=default_access_level;
+      connections[i].access_level=(i?default_access_level:first_access_level);
 
       if (from)
 	sz_strlcpy(connections[i].addr, from->h_name);
diff -Nurd -x*.[Poa] -x*.orig -x *.rej -x*.bak -x*.pot -x*.deps -x Makefile -xlibintl.h -xFreeciv.h freeciv/server/stdinhand.c freeciv-mar6+firstlevel/server/stdinhand.c
--- freeciv/server/stdinhand.c	Tue Feb 15 15:21:10 2000
+++ freeciv-mar6+firstlevel/server/stdinhand.c	Tue Mar  7 21:26:51 2000
@@ -56,6 +56,7 @@
 extern int metaserver_port;
 
 enum cmdlevel_id default_access_level = ALLOW_INFO;
+enum cmdlevel_id   first_access_level = ALLOW_INFO;
 
 static void cut_player_connection(struct player *caller, char *playername);
 static void quit_game(struct player *caller);
@@ -857,6 +858,7 @@
    N_("cmdlevel\n"
       "cmdlevel <level>\n"
       "cmdlevel <level> new\n"
+      "cmdlevel <level> first\n"
       "cmdlevel <level> <player-name>"),
    N_("Query or set command-level access."),
    N_("The command-level controls which server commands are available to "
@@ -868,7 +870,9 @@
       "With no arguments, the current command-levels are reported.\n"
       "With a single argument, the level is set for all existing "
       "connections, and the default is set for future connections.\n"
-      "If 'new' is specified, the default level is set for future connections.\n"
+      "If 'new' is specified, the level is set for newly connecting players.\n"
+      "If 'first' is specified, the level is set for newly connecting players\n"
+      "connecting at a time when nobody else is connected.\n"
       "If a player name is specified, the level is set for that player only.\n"
       "Command-levels do not persist if a player disconnects, "
       "because some untrusted person could reconnect as that player.")
@@ -1510,9 +1514,12 @@
 
     /* first, some state info from commands (we can't save everything) */
 
-    fprintf(script_file, "cmdlevel %s\n",
+    fprintf(script_file, "cmdlevel %s new\n",
 	cmdlevel_name(default_access_level));
 
+    fprintf(script_file, "cmdlevel %s first\n",
+	cmdlevel_name(first_access_level));
+
     fprintf(script_file, "%s\n",
 	(game.skill_level <= 3) ?	"easy" :
 	(game.skill_level >= 6) ?	"hard" :
@@ -1628,8 +1635,11 @@
       }
     }
     cmd_reply(CMD_CMDLEVEL, caller, C_COMMENT,
-	      _("Default command level for new connections: %s"),
+	      _("Command level for new connections: %s"),
 	      cmdlevel_name(default_access_level));
+    cmd_reply(CMD_CMDLEVEL, caller, C_COMMENT,
+	      _("Command level for first connections: %s"),
+	      cmdlevel_name(first_access_level));
     return;
   }
 
@@ -1679,6 +1689,12 @@
 	    pplayer->name);
 	}
       }
+      if (level < first_access_level) {
+        first_access_level = level;
+        cmd_reply(CMD_CMDLEVEL, caller, C_OK,
+		_("first connection command access level also lowered to '%s'"),
+		cmdlevel_name(level));
+      }
     }
     default_access_level = level;
     cmd_reply(CMD_CMDLEVEL, caller, C_OK,
@@ -1694,6 +1710,26 @@
 	      cmdlevel_name(level));
     notify_player(0, _("Game: New connections will have access level '%s'."),
 		  cmdlevel_name(level));
+    if (level < first_access_level) {
+      first_access_level = level;
+      cmd_reply(CMD_CMDLEVEL, caller, C_OK,
+		_("first connection command access level also lowered to '%s'"),
+		cmdlevel_name(level));
+    }
+  }
+  else if (strcmp(arg_name,"first") == 0) {
+    first_access_level = level;
+    cmd_reply(CMD_CMDLEVEL, caller, C_OK,
+	      _("default command access level set to '%s'"),
+	      cmdlevel_name(level));
+    notify_player(0, _("Game: First connections will have access level '%s'."),
+		  cmdlevel_name(level));
+    if (level < default_access_level) {
+      default_access_level = level;
+      cmd_reply(CMD_CMDLEVEL, caller, C_OK,
+		_("default command access level also lowered to '%s'"),
+		cmdlevel_name(level));
+    }
   }
   else if ((pplayer=find_player_by_name_prefix(arg_name,&match_result))) {
     if (!pplayer->conn) {
diff -Nurd -x*.[Poa] -x*.orig -x *.rej -x*.bak -x*.pot -x*.deps -x Makefile -xlibintl.h -xFreeciv.h freeciv/server/stdinhand.h freeciv-mar6+firstlevel/server/stdinhand.h
--- freeciv/server/stdinhand.h	Fri Nov 19 17:30:13 1999
+++ freeciv-mar6+firstlevel/server/stdinhand.h	Tue Mar  7 21:24:54 2000
@@ -24,6 +24,7 @@
 extern void set_ai_level_directer(struct player *pplayer, int level);
 extern void read_init_script(char *script_filename);
 
-extern enum cmdlevel_id default_access_level;
+extern enum cmdlevel_id default_access_level;  /* for sernet.c in */
+extern enum cmdlevel_id   first_access_level;  /* initing a new connection */
 
 #endif /* FC__STDINHAND_H */