 +    /* Look at city owner, not tile owner (the two should be the same, if
 +     * borders are in use). */
 +    struct player *owner = city_owner(pcity);
++    const char *improvements[improvement_count()];
 +    int has_improvements = 0;
-+    struct impr_type *prev_impr = NULL;
 +
 +    get_full_username(username, sizeof(username), owner);
 +    get_full_nation(nation, sizeof(nation), owner);

+      astr_add_line(&str, _("City: %s | %s (%s)"),
+                    city_name(pcity), username, nation);
+    } else {
+      const struct player_diplstate *ds = *pplayer->diplstates;
+
+      if (ds[player_index(owner)].type == DS_CEASEFIRE) {
+	int turns = ds[player_index(owner)].turns_left;
+
+        /* TRANS:  "City: <city name> | <username>
+         * (<nation + team>, <number> turn cease-fire)" */

+     Q_("?nation:Neutral"),
+     Q_("?city:Peaceful"), Q_("?city:Friendly"), Q_("?city:Mysterious"),
+     Q_("?city:Friendly(team)")};
+  static struct astring str = ASTRING_INIT;
+  char username[MAX_LEN_NAME + 32];
+  char nation[2 * MAX_LEN_NAME + 32];
+  int tile_x, tile_y, nat_x, nat_y;
+
+  astr_clear(&str);
+  index_to_map_pos(&tile_x, &tile_y, tile_index(ptile));
+  astr_add_line(&str, _("Location: (%d, %d) [%d]"),
+                tile_x, tile_y, tile_continent(ptile));
+  index_to_native_pos(&nat_x, &nat_y, tile_index(ptile));
+  astr_add_line(&str, _("Native coordinates: (%d, %d)"),
+                nat_x, nat_y);
+
+  astr_add_line(&str, _("Terrain: %s"),  tile_get_info_text(ptile, 0));
+  astr_add_line(&str, _("Food/Prod/Trade: %s"),
+		get_tile_output_text(ptile, pplayer));
+  if (tile_has_special(ptile, S_HUT)) {
+    astr_add_line(&str, _("Minor Tribe Village"));
+  }
+  if (BORDERS_DISABLED != game.info.borders && !pcity) {
+    struct player *owner = tile_owner(ptile);
+
+    get_full_username(username, sizeof(username), owner);
