diff --git a/client/options.c b/client/options.c
index 9a45028..b8a3c28 100644
--- a/client/options.c
+++ b/client/options.c
@@ -4531,6 +4531,9 @@ static void save_cma_presets(struct section_file *file)
 /* The first version the new option name appeared (2.2). */
 #define FIRST_MAJOR_NEW_OPTION_FILE_NAME 2
 #define FIRST_MINOR_NEW_OPTION_FILE_NAME 2
+/* The first version the new boolean values appeared (2.3). */
+#define FIRST_MAJOR_NEW_BOOLEAN 2
+#define FIRST_MINOR_NEW_BOOLEAN 3
 /****************************************************************
   Returns pointer to static memory containing name of the current
   option file.  Usually used for saving.
@@ -4565,19 +4568,21 @@ static const char *get_current_option_file_name(void)
   return name_buffer;
 }
 
-/****************************************************************
-  Check the last option file we saved.  Usually used to load.
-  Ie, based on FREECIV_OPT env var, and home dir. (or a
-  OPTION_FILE_NAME define defined in config.h)
-  Or NULL if not found.
-*****************************************************************/
-static const char *get_last_option_file_name(void)
+/****************************************************************************
+  Check the last option file we saved. Usually used to load. Ie, based on
+  FREECIV_OPT env var, and home dir. (or a OPTION_FILE_NAME define defined
+  in config.h), or NULL if not found.
+
+  Set in allow_digital_boolean if we should look for old boolean values
+  (saved as 0 and 1), so if the rc file version is older than 2.3.0.
+****************************************************************************/
+static const char *get_last_option_file_name(bool *allow_digital_boolean)
 {
   static char name_buffer[256];
   const char *name;
 
+  *allow_digital_boolean = FALSE;
   name = getenv("FREECIV_OPT");
-
   if (name) {
     sz_strlcpy(name_buffer, name);
   } else {
@@ -4608,6 +4613,11 @@ static const char *get_last_option_file_name(void)
                        get_current_option_file_name() + strlen(name) + 1,
                        name_buffer + strlen(name) + 1);
           }
+          if (FIRST_MAJOR_NEW_BOOLEAN > major
+              || (FIRST_MAJOR_NEW_BOOLEAN == major
+                  && FIRST_MINOR_NEW_BOOLEAN > minor)) {
+            *allow_digital_boolean = TRUE;
+          }
           return name_buffer;
         }
       }
@@ -4621,6 +4631,7 @@ static const char *get_last_option_file_name(void)
                    "loading from '%s' instead."),
                  get_current_option_file_name() + strlen(name) + 1,
                  OLD_OPTION_FILE_NAME);
+      *allow_digital_boolean = TRUE;
       return name_buffer;
     } else {
       return NULL;
@@ -4634,6 +4645,8 @@ static const char *get_last_option_file_name(void)
 #undef NEW_OPTION_FILE_NAME
 #undef FIRST_MAJOR_NEW_OPTION_FILE_NAME
 #undef FIRST_MINOR_NEW_OPTION_FILE_NAME
+#undef FIRST_MAJOR_NEW_BOOLEAN
+#undef FIRST_MINOR_NEW_BOOLEAN
 
 
 /****************************************************************************
@@ -5069,11 +5082,12 @@ void options_dialogs_set(void)
 void options_load(void)
 {
   struct section_file *sf;
+  bool allow_digital_boolean;
   int i, num;
   const char *name;
   const char * const prefix = "client";
 
-  name = get_last_option_file_name();
+  name = get_last_option_file_name(&allow_digital_boolean);
   if (!name) {
     log_normal(_("Didn't find the option file."));
     options_fully_initialized = TRUE;
@@ -5099,6 +5113,7 @@ void options_load(void)
     options_fully_initialized = TRUE;
     return;
   }
+  secfile_allow_digital_boolean(sf, allow_digital_boolean);
 
   /* a "secret" option for the lazy. TODO: make this saveable */
   sz_strlcpy(password,
diff --git a/client/servers.c b/client/servers.c
index ff98f3b..e684874 100644
--- a/client/servers.c
+++ b/client/servers.c
@@ -125,6 +125,7 @@ static struct server_list *parse_metaserver_data(fz_FILE *f)
   if (!(file = secfile_from_stream(f, TRUE))) {
     return NULL;
   }
+  secfile_allow_digital_boolean(file, TRUE);
 
   latest_ver = secfile_lookup_str_default(file, NULL, "versions." FOLLOWTAG);
 
diff --git a/server/savegame2.c b/server/savegame2.c
index 779d6ef..fb5f944 100644
--- a/server/savegame2.c
+++ b/server/savegame2.c
@@ -617,6 +617,7 @@ void savegame2_load(struct section_file *file)
   if (!has_capabilities("+version2", savefile_options)) {
     /* load old format (freeciv 2.2.x) */
     log_verbose("loading savefile in old format ...");
+    secfile_allow_digital_boolean(file, TRUE);
     legacy_game_load(file);
   } else {
     /* load new format (freeciv 2.2.99 and newer) */
diff --git a/utility/registry.h b/utility/registry.h
index d50e31f..25957f5 100644
--- a/utility/registry.h
+++ b/utility/registry.h
@@ -29,6 +29,9 @@ void secfile_destroy(struct section_file *secfile);
 struct section_file *secfile_load(const char *filename,
                                   bool allow_duplicates);
 
+void secfile_allow_digital_boolean(struct section_file *secfile,
+                                   bool allow_digital_boolean);
+
 const char *secfile_error(void);
 const char *section_name(const struct section *psection);
 
diff --git a/utility/registry_ini.c b/utility/registry_ini.c
index af81c3f..a7a43fe 100644
--- a/utility/registry_ini.c
+++ b/utility/registry_ini.c
@@ -3046,7 +3046,10 @@ bool entry_bool_get(const struct entry *pentry, bool *value)
 
   if (ENTRY_INT == pentry->type
       && (pentry->integer.value == 0
-          || pentry->integer.value == 1)) {
+          || pentry->integer.value == 1)
+      && NULL != pentry->psection
+      && NULL != pentry->psection->secfile
+      && pentry->psection->secfile->allow_digital_boolean) {
     *value = (0 != pentry->integer.value);
     return TRUE;
   }
diff --git a/utility/section_file.c b/utility/section_file.c
index 62430a2..a9b80a4 100644
--- a/utility/section_file.c
+++ b/utility/section_file.c
@@ -78,6 +78,7 @@ struct section_file *secfile_new(bool allow_duplicates)
   secfile->num_entries = 0;
   secfile->sections = section_list_new_full(section_destroy);
   secfile->allow_duplicates = allow_duplicates;
+  secfile->allow_digital_boolean = FALSE; /* Default */
 
   secfile->hash.sections = section_hash_new();
   /* Maybe allocated later. */
@@ -114,6 +115,18 @@ void secfile_destroy(struct section_file *secfile)
 }
 
 /****************************************************************************
+  Set if we could consider values 0 and 1 as boolean. By default, this is
+  not allowed, but we need to keep compatibility with old Freeciv version
+  for savegames, ruleset etc.
+****************************************************************************/
+void secfile_allow_digital_boolean(struct section_file *secfile,
+                                   bool allow_digital_boolean)
+{
+  fc_assert_ret(NULL != secfile);
+  secfile->allow_digital_boolean = allow_digital_boolean;
+}
+
+/****************************************************************************
   Copies a string. Backslash followed by a genuine newline always
   removes the newline.
   If full_escapes is TRUE:
diff --git a/utility/section_file.h b/utility/section_file.h
index 369c63e..377e996 100644
--- a/utility/section_file.h
+++ b/utility/section_file.h
@@ -34,6 +34,7 @@ struct section_file {
   size_t num_entries;
   struct section_list *sections;
   bool allow_duplicates;
+  bool allow_digital_boolean;
   struct {
     struct section_hash *sections;
     struct entry_hash *entries;
