diff --git a/gtk/gtkcellrendererpixbuf.c b/gtk/gtkcellrendererpixbuf.c
index f689784..d4b8b41 100644
--- a/gtk/gtkcellrendererpixbuf.c
+++ b/gtk/gtkcellrendererpixbuf.c
@@ -497,6 +497,7 @@ gtk_cell_renderer_pixbuf_create_themed_pixbuf (GtkCellRendererPixbuf *cellpixbuf
   GtkIconTheme *icon_theme;
   GtkSettings *settings;
   gint width, height;
+  GtkIconInfo *info;
 
   priv = GTK_CELL_RENDERER_PIXBUF_GET_PRIVATE (cellpixbuf);
 
@@ -519,24 +520,26 @@ gtk_cell_renderer_pixbuf_create_themed_pixbuf (GtkCellRendererPixbuf *cellpixbuf
     }
 
   if (priv->icon_name)
-    cellpixbuf->pixbuf = gtk_icon_theme_load_icon (icon_theme,
-			                           priv->icon_name,
-			                           MIN (width, height), 
-                                                   GTK_ICON_LOOKUP_USE_BUILTIN,
-                                                   NULL);
+    info = gtk_icon_theme_lookup_icon (icon_theme,
+                                       priv->icon_name,
+                                       MIN (width, height),
+                                       GTK_ICON_LOOKUP_USE_BUILTIN);
   else if (priv->gicon)
-    {
-      GtkIconInfo *info;
+    info = gtk_icon_theme_lookup_by_gicon (icon_theme,
+                                           priv->gicon,
+                                           MIN (width, height),
+                                           GTK_ICON_LOOKUP_USE_BUILTIN);
+  else
+    info = NULL;
 
-      info = gtk_icon_theme_lookup_by_gicon (icon_theme,
-                                             priv->gicon,
-			                     MIN (width, height), 
-                                             GTK_ICON_LOOKUP_USE_BUILTIN);
-      if (info)
-        {
-          cellpixbuf->pixbuf = gtk_icon_info_load_icon (info, NULL);
-          gtk_icon_info_free (info);
-        }
+  if (info)
+    {
+      GtkStyle *style = gtk_widget_get_style (widget);
+      cellpixbuf->pixbuf = gtk_icon_info_load_symbolic (info,
+                                                        &style->fg[GTK_STATE_NORMAL],
+                                                        &style->bg[GTK_STATE_NORMAL],
+                                                        NULL);
+      gtk_icon_info_free (info);
     }
 
   g_object_notify (G_OBJECT (cellpixbuf), "pixbuf");
diff --git a/gtk/gtkicontheme.c b/gtk/gtkicontheme.c
index 67ed420..71d9900 100644
--- a/gtk/gtkicontheme.c
+++ b/gtk/gtkicontheme.c
@@ -3079,6 +3079,69 @@ gtk_icon_info_load_icon (GtkIconInfo *icon_info,
   return g_object_ref (icon_info->pixbuf);
 }
 
+static gchar *
+gdk_color_to_css (GdkColor *color)
+{
+  return g_strdup_printf ("rgb(%d,%d,%d)",
+                          color->red >> 8,
+                          color->green >> 8,
+                          color->blue >> 8);
+}
+
+GdkPixbuf *
+gtk_icon_info_load_symbolic (GtkIconInfo  *info,
+                             GdkColor     *fg,
+                             GdkColor     *bg,
+                             GError      **error)
+{
+  GdkPixbuf *pixbuf;
+  GInputStream *stream;
+  gchar *data;
+  gchar *css_fg;
+  gchar *css_bg;
+
+  if (!info->filename || !g_str_has_suffix (info->filename, "-symbolic.svg"))
+    {
+      return gtk_icon_info_load_icon (info, error);
+    }
+
+  css_fg = gdk_color_to_css (fg);
+  css_bg = gdk_color_to_css (bg);
+
+  data = g_strconcat (
+"<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n"
+"<svg version=\"1.1\"\n"
+"     xmlns=\"http://www.w3.org/2000/svg\"\n"
+"     xmlns:xi=\"http://www.w3.org/2001/XInclude\"\n"
+"     width=\"16\"\n"
+"     height=\"16\">\n"
+"  <style type=\"text/css\">\n"
+"    .fg {\n"
+"      color: ", css_fg, ";\n"
+"     }\n"
+"    .bg {\n"
+"      color: ", css_bg, ";\n"
+"     }\n"
+"  </style>\n"
+"  <xi:include href=\"", info->filename, "\"/>\n"
+"</svg>",
+         NULL);
+  g_free (css_fg);
+  g_free (css_bg);
+
+  stream = g_memory_input_stream_new_from_data (data, -1, g_free);
+
+  pixbuf = gdk_pixbuf_new_from_stream_at_scale (stream,
+                                                info->desired_size,
+                                                info->desired_size,
+                                                TRUE,
+                                                NULL,
+                                                error);
+  g_object_unref (stream);
+
+  return pixbuf;
+}
+
 /**
  * gtk_icon_info_set_raw_coordinates:
  * @icon_info: a #GtkIconInfo
diff --git a/gtk/gtkicontheme.h b/gtk/gtkicontheme.h
index b6d7d31..cf7d3c2 100644
--- a/gtk/gtkicontheme.h
+++ b/gtk/gtkicontheme.h
@@ -179,6 +179,10 @@ G_CONST_RETURN gchar *gtk_icon_info_get_filename       (GtkIconInfo   *icon_info
 GdkPixbuf *           gtk_icon_info_get_builtin_pixbuf (GtkIconInfo   *icon_info);
 GdkPixbuf *           gtk_icon_info_load_icon          (GtkIconInfo   *icon_info,
 							GError       **error);
+GdkPixbuf *           gtk_icon_info_load_symbolic      (GtkIconInfo   *icon_info,
+                                                        GdkColor      *fg,
+                                                        GdkColor      *bg,
+                                                        GError       **error);
 void                  gtk_icon_info_set_raw_coordinates (GtkIconInfo  *icon_info,
 							 gboolean      raw_coordinates);
 
diff --git a/gtk/gtkimage.c b/gtk/gtkimage.c
index 6654f0d..3032f54 100644
--- a/gtk/gtkimage.c
+++ b/gtk/gtkimage.c
@@ -1655,6 +1655,7 @@ ensure_pixbuf_for_icon_name (GtkImage *image)
   GtkSettings *settings;
   gint width, height;
   gint *sizes, *s, dist;
+  GtkIconInfo *info;
   GtkIconLookupFlags flags;
   GError *error = NULL;
 
@@ -1714,13 +1715,22 @@ ensure_pixbuf_for_icon_name (GtkImage *image)
 	      width = height = 24;
 	    }
 	}
-      image->data.name.pixbuf =
-	gtk_icon_theme_load_icon (icon_theme,
-				  image->data.name.icon_name,
-				  MIN (width, height), flags, &error);
+
+      info = gtk_icon_theme_lookup_icon (icon_theme,
+                                         image->data.name.icon_name,
+                                         MIN (width, height), flags);
+      if (info)
+        {
+          GtkStyle *style = gtk_widget_get_style (GTK_WIDGET (image));
+          image->data.name.pixbuf = gtk_icon_info_load_symbolic (info,
+                                                                 &style->fg[GTK_STATE_NORMAL],
+                                                                 &style->bg[GTK_STATE_NORMAL],
+                                                                 NULL);
+          gtk_icon_info_free (info);
+        }
+
       if (image->data.name.pixbuf == NULL)
 	{
-	  g_error_free (error);
 	  image->data.name.pixbuf =
 	    gtk_widget_render_icon (GTK_WIDGET (image),
 				    GTK_STOCK_MISSING_IMAGE,
@@ -1773,7 +1783,11 @@ ensure_pixbuf_for_gicon (GtkImage *image)
 					     MIN (width, height), flags);
       if (info)
         {
-          image->data.gicon.pixbuf = gtk_icon_info_load_icon (info, NULL);
+          GtkStyle *style = gtk_widget_get_style (GTK_WIDGET (image));
+          image->data.gicon.pixbuf = gtk_icon_info_load_symbolic (info,
+                                                                  &style->fg[GTK_STATE_NORMAL],
+                                                                  &style->bg[GTK_STATE_NORMAL],
+                                                                  NULL);
           gtk_icon_info_free (info);
         }
 
