Index: gui-gtk-3.0/citydlg.c
===================================================================
--- gui-gtk-3.0/citydlg.c	(revision 21621)
+++ gui-gtk-3.0/citydlg.c	(working copy)
@@ -192,8 +192,6 @@
   int cwidth;
 };
 
-static GtkRcStyle *info_label_style[NUM_INFO_STYLES] = { NULL, NULL, NULL };
-
 static struct dialog_list *dialog_list;
 static bool city_dialogs_have_been_initialised;
 static int canvas_width, canvas_height;
@@ -306,10 +304,6 @@
 *****************************************************************/
 static void initialize_city_dialogs(void)
 {
-  int i;
-  GdkColor orange = { 0, 65535, 32768, 0 };	/* not currently used */
-  GdkColor red = { 0, 65535, 0, 0 };
-
   fc_assert_ret(!city_dialogs_have_been_initialised);
 
   dialog_list = dialog_list_new();
@@ -317,15 +311,6 @@
 
   /* make the styles */
 
-  for (i = 0; i < NUM_INFO_STYLES; i++) {
-    info_label_style[i] = gtk_rc_style_new();
-  }
-  /* info_syle[NORMAL] is normal, don't change it */
-  info_label_style[ORANGE]->color_flags[GTK_STATE_NORMAL] |= GTK_RC_FG;
-  info_label_style[ORANGE]->fg[GTK_STATE_NORMAL] = orange;
-  info_label_style[RED]->color_flags[GTK_STATE_NORMAL] |= GTK_RC_FG;
-  info_label_style[RED]->fg[GTK_STATE_NORMAL] = red;
-
   city_dialogs_have_been_initialised = TRUE;
 }
 
@@ -1543,10 +1528,12 @@
 					   GtkWidget **info_label,
                                            struct city_dialog *pdialog)
 {
-  int i, style, illness = 0;
+  int i, illness = 0;
   char buf[NUM_INFO_FIELDS][512];
   struct city *pcity = pdialog->pcity;
   int granaryturns;
+  GdkRGBA red = {1.0, 0, 0, 1.0};
+  GdkRGBA *color;
 
   enum { FOOD, SHIELD, TRADE, GOLD, LUXURY, SCIENCE,
          GRANARY, GROWTH, CORRUPTION, WASTE, POLLUTION, ILLNESS
@@ -1607,21 +1594,21 @@
    * Special style stuff for granary, growth and pollution below. The
    * "4" below is arbitrary. 3 turns should be enough of a warning.
    */
-  style = (granaryturns > -4 && granaryturns < 0) ? RED : NORMAL;
-  gtk_widget_modify_style(info_label[GRANARY], info_label_style[style]);
+  color = (granaryturns > -4 && granaryturns < 0) ? &red : NULL;
+  gtk_widget_override_color(info_label[GRANARY], GTK_STATE_FLAG_NORMAL, color);
 
-  style = (granaryturns == 0 || pcity->surplus[O_FOOD] < 0) ? RED : NORMAL;
-  gtk_widget_modify_style(info_label[GROWTH], info_label_style[style]);
+  color = (granaryturns == 0 || pcity->surplus[O_FOOD] < 0) ? &red : NULL;
+  gtk_widget_override_color(info_label[GROWTH], GTK_STATE_FLAG_NORMAL, color);
 
   /* someone could add the info_label_style[ORANGE]
    * style for better granularity here */
 
-  style = (pcity->pollution >= 10) ? RED : NORMAL;
-  gtk_widget_modify_style(info_label[POLLUTION], info_label_style[style]);
+  color = (pcity->pollution >= 10) ? &red : NULL;
+  gtk_widget_override_color(info_label[POLLUTION], GTK_STATE_FLAG_NORMAL, color);
 
   /* illness is in tenth of percent, i.e 100 != 10.0% */
-  style = (illness >= 100) ? RED : NORMAL;
-  gtk_widget_modify_style(info_label[ILLNESS], info_label_style[style]);
+  color = (illness >= 100) ? &red : NULL;
+  gtk_widget_override_color(info_label[ILLNESS], GTK_STATE_FLAG_NORMAL, color);
 }
 
 /****************************************************************
Index: gui-gtk-3.0/canvas.c
===================================================================
--- gui-gtk-3.0/canvas.c	(revision 21621)
+++ gui-gtk-3.0/canvas.c	(working copy)
@@ -319,14 +319,14 @@
 
 static PangoLayout *layout;
 static struct {
-  GtkStyle **styles;
+  PangoFontDescription **styles;
   bool shadowed;
 } fonts[FONT_COUNT] = {
   {&city_names_style, TRUE},
   {&city_productions_style, TRUE},
   {&reqtree_text_style, FALSE}
 };
-#define FONT(font) ((*fonts[font].styles)->font_desc)
+#define FONT(font) (*fonts[font].styles)
 
 /****************************************************************************
   Return the size of the given text in the given font.  This size should
Index: gui-gtk-3.0/gui_main.c
===================================================================
--- gui-gtk-3.0/gui_main.c	(revision 21621)
+++ gui-gtk-3.0/gui_main.c	(working copy)
@@ -125,9 +125,9 @@
 static GtkWidget *bottom_hpaned;
 
 int city_names_font_size = 0, city_productions_font_size = 0;
-GtkStyle *city_names_style = NULL;
-GtkStyle *city_productions_style = NULL;
-GtkStyle *reqtree_text_style = NULL;
+PangoFontDescription *city_names_style = NULL;
+PangoFontDescription *city_productions_style = NULL;
+PangoFontDescription *reqtree_text_style = NULL;
 
 GtkWidget *main_frame_civ_name;
 GtkWidget *main_label_info;
@@ -220,11 +220,11 @@
   city_names_font_size = my_city_names_font_size;
   city_productions_font_size = my_city_productions_font_size;
   if (city_names_style) {
-    pango_font_description_set_size(city_names_style->font_desc,
+    pango_font_description_set_size(city_names_style,
                                     PANGO_SCALE * city_names_font_size);
   }
   if (city_productions_style) {
-    pango_font_description_set_size(city_productions_style->font_desc,
+    pango_font_description_set_size(city_productions_style,
                                     PANGO_SCALE * city_productions_font_size);
   }
 }
@@ -1558,6 +1557,8 @@
 **************************************************************************/
 void ui_main(int argc, char **argv)
 {
+  GtkSettings *settings;
+  const gchar *def_font_name;
   guint sig;
 
   parse_options(argc, argv);
@@ -1607,16 +1608,19 @@
     }
   } options_iterate_end;
 
+  settings = gtk_settings_get_for_screen(gtk_widget_get_screen(toplevel));
+  g_object_get(settings, "gtk-font-name", &def_font_name, NULL);
+
   if (NULL == city_names_style) {
-    city_names_style = gtk_style_new();
+    city_names_style = pango_font_description_from_string(def_font_name);
     log_error("city_names_style should have been set by options.");
   }
   if (NULL == city_productions_style) {
-    city_productions_style = gtk_style_new();
+    city_productions_style = pango_font_description_from_string(def_font_name);
     log_error("city_productions_style should have been set by options.");
   }
   if (NULL == reqtree_text_style) {
-    reqtree_text_style = gtk_style_new();
+    reqtree_text_style = pango_font_description_from_string(def_font_name);
     log_error("reqtree_text_style should have been set by options.");
   }
 
Index: gui-gtk-3.0/gui_main.h
===================================================================
--- gui-gtk-3.0/gui_main.h	(revision 21621)
+++ gui-gtk-3.0/gui_main.h	(working copy)
@@ -21,9 +21,9 @@
 /* network string charset conversion */
 gchar *ntoh_str(const gchar *netstr);
 
-extern GtkStyle *city_names_style;
-extern GtkStyle *city_productions_style;
-extern GtkStyle *reqtree_text_style;
+extern PangoFontDescription *city_names_style;
+extern PangoFontDescription *city_productions_style;
+extern PangoFontDescription *reqtree_text_style;
 
 #define single_tile_pixmap (mapview.single_tile->pixmap)
 
Index: gui-gtk-3.0/gui_stuff.c
===================================================================
--- gui-gtk-3.0/gui_stuff.c	(revision 21621)
+++ gui-gtk-3.0/gui_stuff.c	(working copy)
@@ -1022,48 +1001,43 @@
 **************************************************************************/
 void gui_update_font(const char *font_name, const char *font_value)
 {
-  char str[512];
+  char *str;
+  GtkCssProvider *provider;
 
-  fc_snprintf(str, sizeof(str),
-              "style \"ext-%s\" {\n"
-              "  font_name = \"%s\"\n"
-              "}\n"
-              "\n"
-              "widget \"Freeciv*.%s\" style \"ext-%s\"",
-              font_name, font_value, font_name, font_name);
+  str = g_strdup_printf("#Freeciv #%s { font: %s;}",
+              font_name, font_value);
 
-  gtk_rc_parse_string(str);
+  provider = gtk_css_provider_new();
+  gtk_css_provider_load_from_data (GTK_CSS_PROVIDER(provider),
+    str, -1, NULL);
+  gtk_style_context_add_provider_for_screen(
+    gtk_widget_get_screen(toplevel),
+    GTK_STYLE_PROVIDER(provider), GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
+  g_free(str);
+
 }
 
 /****************************************************************************
   Update a font option which is not attached to a widget.
 ****************************************************************************/
 void gui_update_font_full(const char *font_name, const char *font_value,
-                          GtkStyle **pstyle)
+                          PangoFontDescription **font_desc)
 {
   GtkSettings *settings;
   GdkScreen *screen;
-  GtkStyle *style;
-  char buf[64];
+  PangoFontDescription *f_desc;
 
   gui_update_font(font_name, font_value);
 
-  screen = gdk_screen_get_default();
+  screen = gtk_widget_get_screen(toplevel);
   settings = gtk_settings_get_for_screen(screen);
 
-  fc_snprintf(buf, sizeof(buf), "Freeciv*.%s", font_name);
-  style = gtk_rc_get_style_by_paths(settings, buf, NULL, G_TYPE_NONE);
+  f_desc = pango_font_description_from_string(font_value);
 
-  if (style) {
-    g_object_ref(style);
-  } else {
-    style = gtk_style_new();
+  if (*font_desc) {
+    pango_font_description_free(*font_desc);
   }
-
-  if (*pstyle) {
-    g_object_unref(*pstyle);
-  }
-  *pstyle = style;
+  *font_desc = f_desc;
 }
 
 /****************************************************************************
Index: gui-gtk-3.0/gui_stuff.h
===================================================================
--- gui-gtk-3.0/gui_stuff.h	(revision 21621)
+++ gui-gtk-3.0/gui_stuff.h	(working copy)
@@ -124,7 +124,7 @@
                                   struct gui_dialog *return_dialog);
 
 void gui_update_font_full(const char *font_name, const char *font_value,
-                          GtkStyle **pstyle);
+                          PangoFontDescription **pstyle);
 
 void disable_gobject_callback(GObject *obj, GCallback cb);
 void enable_gobject_callback(GObject *obj, GCallback cb);
