diff -ru freeciv-/common/game.h freeciv/common/game.h
--- freeciv-/common/game.h	Sat Nov 24 00:42:30 2001
+++ freeciv/common/game.h	Sun Nov 25 14:49:33 2001
@@ -120,6 +120,7 @@
   int aqueduct_size;
   int sewer_size;
   int add_to_size_limit;
+  int savepalace;
   int spacerace;
   int turnblock;
   int fixedlength;
diff -ru freeciv-/common/player.c freeciv/common/player.c
--- freeciv-/common/player.c	Sat Nov 24 00:42:31 2001
+++ freeciv/common/player.c	Mon Nov 26 15:58:54 2001
@@ -358,7 +358,28 @@
 }
 
 /**************************************************************************
-Locate the city where the players palace is located, (NULL Otherwise) 
+Move the palace into random city, when our capital was conquered.
+**************************************************************************/
+void move_palace(struct player *pplayer, struct city *pfrom)
+{
+  int size;
+  struct city *pnewcity;
+
+  size = city_list_size(&pplayer->cities);
+  assert(size);
+  if (size == 1)
+    return; /* This is the last city. R.I.P. */
+  
+  while(1) {
+    pnewcity = city_list_get(&pplayer->cities, myrand(size));
+    if (pnewcity == pfrom) continue;
+    city_add_improvement(pnewcity, B_PALACE);
+    break;
+  }
+}
+
+/**************************************************************************
+Locate the city where the players palace is located, (NULL Otherwise)
 **************************************************************************/
 struct city *find_palace(struct player *pplayer)
 {
diff -ru freeciv-/common/player.h freeciv/common/player.h
--- freeciv-/common/player.h	Sat Nov 24 00:42:32 2001
+++ freeciv/common/player.h	Sun Nov 25 14:49:39 2001
@@ -195,6 +195,7 @@
 
 const char *player_addr_hack(struct player *pplayer);
 
+void move_palace(struct player *pplayer, struct city *pfrom);
 struct city *find_palace(struct player *pplayer);
 
 int ai_handicap(struct player *pplayer, enum handicap_type htype);
diff -ru freeciv-/server/citytools.c freeciv/server/citytools.c
--- freeciv-/server/citytools.c	Sat Nov 24 00:42:42 2001
+++ freeciv/server/citytools.c	Sun Nov 25 14:49:42 2001
@@ -699,6 +699,8 @@
   for (i=0;i<game.num_impr_types;i++) {
     if (pcity->improvements[i]!=I_NONE) {
       city_remove_improvement(pcity,i);
+      /* We can't end up w/o palace */
+      if (i == B_PALACE && game.savepalace) move_palace(pgiver, pcity);
       pcity->improvements[i]=I_ACTIVE;
     }
   }
@@ -968,6 +970,8 @@
   for (i=0;i<game.num_impr_types;i++) {
     if (pcity->improvements[i]!=I_NONE) {
       city_remove_improvement(pcity,i);
+      /* We can't end up w/o palace */
+      if (i == B_PALACE && game.savepalace) move_palace(pplayer, pcity);
     }
   }
   update_all_effects();
diff -ru freeciv-/server/savegame.c freeciv/server/savegame.c
--- freeciv-/server/savegame.c	Sat Nov 24 00:42:52 2001
+++ freeciv/server/savegame.c	Sun Nov 25 14:49:46 2001
@@ -1808,6 +1808,8 @@
 						   "game.aqueductloss");
     game.killcitizen = secfile_lookup_int_default(file, game.killcitizen,
 						  "game.killcitizen");
+    game.savepalace = secfile_lookup_int_default(file,game.savepalace,
+						"game.savepalace");
     game.turnblock = secfile_lookup_int_default(file,game.turnblock,
 						"game.turnblock");
     game.fixedlength = secfile_lookup_int_default(file,game.fixedlength,
@@ -2129,6 +2131,7 @@
   secfile_insert_int(file, game.aqueductloss, "game.aqueductloss");
   secfile_insert_int(file, game.killcitizen, "game.killcitizen");
   secfile_insert_int(file, game.turnblock, "game.turnblock");
+  secfile_insert_int(file, game.savepalace, "game.savepalace");
   secfile_insert_int(file, game.fixedlength, "game.fixedlength");
   secfile_insert_int(file, game.barbarianrate, "game.barbarians");
   secfile_insert_int(file, game.onsetbarbarian, "game.onsetbarbs");
diff -ru freeciv-/server/stdinhand.c freeciv/server/stdinhand.c
--- freeciv-/server/stdinhand.c	Sat Nov 24 00:43:09 2001
+++ freeciv/server/stdinhand.c	Sun Nov 25 14:49:49 2001
@@ -759,6 +759,14 @@
        "period elapses. If a client doesn't reply with a PONG before the "
        "next server PING request the client is disconnected.") },
 
+  { "savepalace", &game.savepalace, NULL, NULL,
+    SSET_META, SSET_TO_CLIENT,
+    0, 1, 1,
+    N_("Whether palace is moved when capital is conquered"),
+    N_("If this is set to 1 when the capital is conquered, palace is "
+       "automatically rebuilt in another randomly choosed city, regardless "
+       "on the knowledge of Masonry.") },
+
   { "turnblock", &game.turnblock, NULL, NULL,
     SSET_META, SSET_TO_CLIENT,
     0, 1, 0,
