diff --git a/libnautilus-private/nautilus-icon-info.c b/libnautilus-private/nautilus-icon-info.c
index 52fc561..b79b3bd 100644
--- a/libnautilus-private/nautilus-icon-info.c
+++ b/libnautilus-private/nautilus-icon-info.c
@@ -39,7 +39,8 @@ struct _NautilusIconInfo
 	gint n_attach_points;
 	GdkPoint *attach_points;
 	char *display_name;
-        char *icon_name;
+	char *icon_name;
+	GIcon *gicon;
 };
 
 struct _NautilusIconInfoClass
@@ -99,6 +100,9 @@ nautilus_icon_info_finalize (GObject *object)
 	if (icon->pixbuf) {
 		g_object_unref (icon->pixbuf);
 	}
+	if (icon->gicon) {
+		g_object_unref (icon->gicon);
+	}
 	g_free (icon->attach_points);
 	g_free (icon->display_name);
 	g_free (icon->icon_name);
@@ -365,6 +369,7 @@ nautilus_icon_info_lookup (GIcon *icon,
 		}
 
 		icon_info = nautilus_icon_info_new_for_pixbuf (pixbuf);
+		icon_info->gicon = g_object_ref (icon);
 
 		key = loadable_icon_key_new (icon, size);
 		g_hash_table_insert (loadable_icon_cache, key, icon_info);
@@ -411,6 +416,7 @@ nautilus_icon_info_lookup (GIcon *icon,
 		}
 		
 		icon_info = nautilus_icon_info_new_for_icon_info (gtkicon_info);
+		icon_info->gicon = g_object_ref (icon);
 		
 		key = themed_icon_key_new (filename, size);
 		g_hash_table_insert (themed_icon_cache, key, icon_info);
@@ -472,6 +478,37 @@ nautilus_icon_info_lookup_from_path (const char *path,
 	return info;
 }
 
+GIcon *
+nautilus_icon_info_glookup_from_name (const char *name,
+				     int size)
+{
+	GIcon *icon;
+	NautilusIconInfo *info;
+
+	icon = g_themed_icon_new (name);
+	info = nautilus_icon_info_lookup (icon, size);
+	g_object_unref (icon);
+
+	return g_object_ref (info->gicon);
+}
+
+GIcon *
+nautilus_icon_info_glookup_from_path (const char *path,
+				     int size)
+{
+	GFile *icon_file;
+	GIcon *icon;
+	NautilusIconInfo *info;
+
+	icon_file = g_file_new_for_path (path);
+	icon = g_file_icon_new (icon_file);
+	info = nautilus_icon_info_lookup (icon, size);
+	g_object_unref (icon);
+	g_object_unref (icon_file);
+
+	return g_object_ref (info->gicon);
+}
+
 GdkPixbuf *
 nautilus_icon_info_get_pixbuf_nodefault (NautilusIconInfo  *icon)
 {
diff --git a/libnautilus-private/nautilus-icon-info.h b/libnautilus-private/nautilus-icon-info.h
index 924918c..d1b34e9 100644
--- a/libnautilus-private/nautilus-icon-info.h
+++ b/libnautilus-private/nautilus-icon-info.h
@@ -60,6 +60,10 @@ NautilusIconInfo *    nautilus_icon_info_lookup_from_name             (const cha
 								       int                size);
 NautilusIconInfo *    nautilus_icon_info_lookup_from_path             (const char        *path,
 								       int                size);
+GIcon            *    nautilus_icon_info_glookup_from_name            (const char        *name,
+								       int                size);
+GIcon            *    nautilus_icon_info_glookup_from_path            (const char        *path,
+								       int                size);
 gboolean              nautilus_icon_info_is_fallback                  (NautilusIconInfo  *icon);
 GdkPixbuf *           nautilus_icon_info_get_pixbuf                   (NautilusIconInfo  *icon);
 GdkPixbuf *           nautilus_icon_info_get_pixbuf_nodefault         (NautilusIconInfo  *icon);
diff --git a/libnautilus-private/nautilus-ui-utilities.c b/libnautilus-private/nautilus-ui-utilities.c
index cf812f2..143854d 100644
--- a/libnautilus-private/nautilus-ui-utilities.c
+++ b/libnautilus-private/nautilus-ui-utilities.c
@@ -120,7 +120,7 @@ nautilus_action_from_menu_item (NautilusMenuItem *item)
 	char *name, *label, *tip, *icon_name;
 	gboolean sensitive, priority;
 	GtkAction *action;
-	GIcon *icon;
+	GIcon *gicon;
 
 	g_object_get (G_OBJECT (item),
 		      "name", &name, "label", &label,
@@ -132,13 +132,14 @@ nautilus_action_from_menu_item (NautilusMenuItem *item)
 	action = gtk_action_new (name,
 				 label,
 				 tip,
-				 icon_name);
+				 NULL);
 
 	if (icon_name != NULL) {
-		icon = g_themed_icon_new_with_default_fallbacks (icon_name);
-		g_object_set_data_full (G_OBJECT (action), "menu-icon",
-					icon,
-					g_object_unref);
+		gicon = nautilus_ui_get_gicon_for_menu (icon_name);
+		if (gicon != NULL) {
+			gtk_action_set_gicon (action, gicon);
+			g_object_unref (gicon);
+		}
 	}
 
 	gtk_action_set_sensitive (action, sensitive);
@@ -157,6 +158,23 @@ nautilus_action_from_menu_item (NautilusMenuItem *item)
 	return action;
 }
 
+GIcon *
+nautilus_ui_get_gicon_for_menu (const char *icon_name)
+{
+	GIcon *icon;
+	int size;
+
+	size = nautilus_get_icon_size_for_stock_size (GTK_ICON_SIZE_MENU);
+
+	if (g_path_is_absolute (icon_name)) {
+		icon = nautilus_icon_info_glookup_from_path (icon_name, size);
+	} else {
+		icon = nautilus_icon_info_glookup_from_name (icon_name, size);
+	}
+
+	return icon;
+}
+
 gboolean
 nautilus_event_should_open_in_new_tab (void)
 {
diff --git a/libnautilus-private/nautilus-ui-utilities.h b/libnautilus-private/nautilus-ui-utilities.h
index 0338f6d..0f041e5 100644
--- a/libnautilus-private/nautilus-ui-utilities.h
+++ b/libnautilus-private/nautilus-ui-utilities.h
@@ -38,6 +38,7 @@ void        nautilus_ui_prepare_merge_ui           (GtkUIManager      *ui_manage
 						    GtkActionGroup   **action_group);
 GtkAction * nautilus_action_from_menu_item         (NautilusMenuItem  *item);
 const char *nautilus_ui_string_get                 (const char        *filename);
+GIcon *     nautilus_ui_get_gicon_for_menu         (const char        *icon_name);
 
 gboolean  nautilus_event_should_open_in_new_tab   (void);
 
diff --git a/src/nautilus-view.c b/src/nautilus-view.c
index 399e8f6..c329019 100644
--- a/src/nautilus-view.c
+++ b/src/nautilus-view.c
@@ -4707,8 +4707,8 @@ add_extension_action_for_files (NautilusView *view,
 	char *name, *label, *tip, *icon;
 	gboolean sensitive, priority;
 	GtkAction *action;
-	GdkPixbuf *pixbuf;
 	ExtensionActionCallbackData *data;
+	GIcon *gicon;
 	
 	g_object_get (G_OBJECT (item), 
 		      "name", &name, "label", &label, 
@@ -4720,14 +4720,13 @@ add_extension_action_for_files (NautilusView *view,
 	action = gtk_action_new (name,
 				 label,
 				 tip,
-				 icon);
+				 NULL);
 
 	if (icon != NULL) {
-		pixbuf = get_menu_icon (icon);
-		if (pixbuf != NULL) {
-			g_object_set_data_full (G_OBJECT (action), "menu-icon",
-						pixbuf,
-						g_object_unref);
+		gicon = nautilus_ui_get_gicon_for_menu (icon);
+		if (gicon != NULL) {
+			gtk_action_set_gicon (action, gicon);
+			g_object_unref (gicon);
 		}
 	}
 
