Index: server/srv_main.c
===================================================================
--- server/srv_main.c	(révision 16597)
+++ server/srv_main.c	(copie de travail)
@@ -1989,6 +1989,10 @@
   /* We may as well reset is_new_game now. */
   game.info.is_new_game = FALSE;
 
+  freelog(LOG_VERBOSE,
+          "srv_running() mostly redundant send_server_settings()");
+  send_server_settings(NULL);
+
   eot_timer = new_timer_start(TIMER_CPU, TIMER_ACTIVE);
 
   /* 
@@ -2279,9 +2283,6 @@
   set_server_state(S_S_RUNNING);
   (void) send_server_info_to_metaserver(META_INFO);
 
-  freelog(LOG_VERBOSE, "srv_ready() mostly redundant send_server_settings()");
-  send_server_settings(NULL);
-
   if (game.info.is_new_game) {
     /* If we're starting a new game, reset the max_players to be at
      * least the number of players currently in the game. */
Index: server/stdinhand.c
===================================================================
--- server/stdinhand.c	(révision 16597)
+++ server/stdinhand.c	(copie de travail)
@@ -3802,7 +3802,11 @@
     return FALSE;
   }
 
-  send_server_settings(NULL);
+  /* FIXME: Send server settings one by one to don't send the control
+   * packet. */
+  settings_iterate(pset) {
+    send_server_setting(NULL, pset);
+  } settings_iterate_end;
   notify_conn(NULL, NULL, E_SETTING, ftc_server,
               _("Settings re-initialized."));
   return TRUE;
Index: client/options.h
===================================================================
--- client/options.h	(révision 16597)
+++ client/options.h	(copie de travail)
@@ -220,7 +220,8 @@
 /** Desired settable options. **/
 struct options_settable;
 void desired_settable_options_update(void);
-void desired_settable_option_update(const char *op_name, const char *op_value,
+void desired_settable_option_update(const char *op_name,
+                                    const char *op_value,
                                     bool allow_replace);
 void desired_settable_option_send(struct options_settable *pset);
 
Index: client/options.c
===================================================================
--- client/options.c	(révision 16597)
+++ client/options.c	(copie de travail)
@@ -1808,9 +1808,9 @@
 *****************************************************************/
 void desired_settable_options_update(void)
 {
-  char buf[64];
+  char val_buf[64], def_buf[64];
   struct options_settable *pset;
-  const char *value;
+  const char *value, *def_val;
   int i;
 
   RETURN_IF_FAIL(NULL != settable_options_hash);
@@ -1818,29 +1818,41 @@
   for (i = 0; i < num_settable_options; i++) {
     pset = settable_options + i;
     if (!pset->is_visible) {
-      /* Cannot know the value of this setting in this case, don't overwrite. */
+      /* Cannot know the value of this setting in this case,
+       * don't overwrite. */
       continue;
     }
 
     value = NULL;
+    def_val = NULL;
     switch (pset->stype) {
     case SSET_BOOL:
     case SSET_INT:
-      my_snprintf(buf, sizeof(buf), "%d", pset->val);
-      value = buf;
+      my_snprintf(val_buf, sizeof(val_buf), "%d", pset->val);
+      value = val_buf;
+      my_snprintf(def_buf, sizeof(def_buf), "%d", pset->default_val);
+      def_val = def_buf;
       break;
     case SSET_STRING:
       value = pset->strval;
+      def_val = pset->default_strval;
       break;
     }
 
-    if (NULL == value) {
+    if (NULL == value || NULL == def_val) {
       freelog(LOG_ERROR, "Wrong setting type (%d) for '%s'.",
               pset->stype, pset->name);
       continue;
     }
 
-    hash_replace(settable_options_hash, mystrdup(pset->name), mystrdup(value));
+    if (0 == strcmp(value, def_val)) {
+      /* Not set, using default... */
+      hash_delete_entry(settable_options_hash, pset->name);
+    } else {
+      /* Really desired. */
+      hash_replace(settable_options_hash,
+                   mystrdup(pset->name), mystrdup(value));
+    }
   }
 }
 
@@ -1848,7 +1860,8 @@
   Update a desired settable option in the hash table from a value
   which can be different of the current consiguration.
 *****************************************************************/
-void desired_settable_option_update(const char *op_name, const char *op_value,
+void desired_settable_option_update(const char *op_name,
+                                    const char *op_value,
                                     bool allow_replace)
 {
   RETURN_IF_FAIL(NULL != settable_options_hash);
