Index: gtk/gtkfilechooserdefault.c
===================================================================
--- gtk/gtkfilechooserdefault.c	(revision 20065)
+++ gtk/gtkfilechooserdefault.c	(working copy)
@@ -6280,7 +6280,7 @@ name_sort_func (GtkTreeModel *model,
 {
   COMPARE_DIRECTORIES;
   else
-    return strcmp (gtk_file_info_get_display_key (info_a), gtk_file_info_get_display_key (info_b));
+    return g_collation_key_cmp (gtk_file_info_get_collation_key (info_a), gtk_file_info_get_collation_key (info_b));
 }
 
 /* Sort callback for the size column */
@@ -8796,7 +8796,7 @@ search_add_hit (GtkFileChooserDefault *i
   GtkFilePath *path;
   char *filename;
   char *tmp;
-  char *collation_key;
+  GCollationKey *collation_key;
   struct stat statbuf;
   struct stat *statbuf_copy;
   GtkTreeIter iter;
@@ -8826,7 +8826,7 @@ search_add_hit (GtkFileChooserDefault *i
   *statbuf_copy = statbuf;
 
   tmp = g_filename_display_name (filename);
-  collation_key = g_utf8_collate_key_for_filename (tmp, -1);
+  collation_key = g_utf8_get_collation_key_for_filename (tmp, -1);
   g_free (tmp);
 
   request = g_new0 (struct SearchHitInsertRequest, 1);
@@ -8934,7 +8934,7 @@ search_clear_model (GtkFileChooserDefaul
       {
         GtkFilePath *path;
         gchar *display_name;
-        gchar *collation_key;
+        GCollationKey *collation_key;
 	struct stat *statbuf;
         GtkFileSystemHandle *handle;
 
@@ -8951,7 +8951,7 @@ search_clear_model (GtkFileChooserDefaul
 
         gtk_file_path_free (path);
         g_free (display_name);
-        g_free (collation_key);
+        g_collation_key_free (collation_key);
 	g_free (statbuf);
       }
     while (gtk_tree_model_iter_next (model, &iter));
@@ -9028,7 +9028,7 @@ search_column_path_sort_func (GtkTreeMod
 {
   GtkFileChooserDefault *impl = user_data;
   GtkTreeIter child_a, child_b;
-  const char *collation_key_a, *collation_key_b;
+  GCollationKey *collation_key_a, *collation_key_b;
   gboolean is_folder_a, is_folder_b;
 
   gtk_tree_model_filter_convert_iter_to_child_iter (GTK_TREE_MODEL_FILTER (model), &child_a, a);
@@ -9053,7 +9053,7 @@ search_column_path_sort_func (GtkTreeMod
   if (is_folder_a != is_folder_b)
     return is_folder_a ? 1 : -1;
 
-  return strcmp (collation_key_a, collation_key_b);
+  return g_collation_key_cmp (collation_key_a, collation_key_b);
 }
 
 /* Sort callback from the modification time column */
Index: gtk/gtk.symbols
===================================================================
--- gtk/gtk.symbols	(revision 20065)
+++ gtk/gtk.symbols	(working copy)
@@ -1469,6 +1469,7 @@ gtk_file_folder_list_children
 gtk_file_info_copy
 gtk_file_info_free
 gtk_file_info_get_display_key
+gtk_file_info_get_collation_key
 gtk_file_info_get_display_name
 gtk_file_info_get_icon_name
 gtk_file_info_get_is_folder
Index: gtk/gtkfilesystem.c
===================================================================
--- gtk/gtkfilesystem.c	(revision 20065)
+++ gtk/gtkfilesystem.c	(working copy)
@@ -35,6 +35,7 @@ struct _GtkFileInfo
   gint64 size;
   gchar *display_name;
   gchar *display_key;
+  GCollationKey *collation_key;
   gchar *mime_type;
   gchar *icon_name;
   guint is_folder : 1;
@@ -88,12 +89,12 @@ gtk_file_info_copy (GtkFileInfo *info)
     new_info->display_name = g_strdup (new_info->display_name);
   if (new_info->display_key)
     new_info->display_key = g_strdup (new_info->display_key);
+  if (new_info->collation_key)
+    new_info->collation_key = g_collation_key_copy (new_info->collation_key);
   if (new_info->mime_type)
     new_info->mime_type = g_strdup (new_info->mime_type);
   if (new_info->icon_name)
     new_info->icon_name = g_strdup (new_info->icon_name);
-  if (new_info->display_key)
-    new_info->display_key = g_strdup (new_info->display_key);
 
   return new_info;
 }
@@ -106,6 +107,7 @@ gtk_file_info_free (GtkFileInfo *info)
   g_free (info->display_name);
   g_free (info->mime_type);
   g_free (info->display_key);
+  g_collation_key_free (info->collation_key);
   g_free (info->icon_name);
 
   g_free (info);
@@ -145,6 +147,21 @@ gtk_file_info_get_display_key (const Gtk
   return info->display_key;
 }
 
+const GCollationKey *
+gtk_file_info_get_collation_key (const GtkFileInfo *info)
+{
+  g_return_val_if_fail (info != NULL, NULL);
+
+  if (!info->collation_key && info->display_name)
+    {
+      /* Since info->collation_key is only a cache, we cast off the const
+       */
+      ((GtkFileInfo *)info)->collation_key = g_utf8_get_collation_key_for_filename (info->display_name, -1);
+    }
+
+  return info->collation_key;
+}
+
 void
 gtk_file_info_set_display_name (GtkFileInfo *info,
 				const gchar *display_name)
@@ -155,11 +172,11 @@ gtk_file_info_set_display_name (GtkFileI
     return;
 
   g_free (info->display_name);
-  if (info->display_key)
-    {
-      g_free (info->display_key);
-      info->display_key = NULL;
-    }
+
+  g_free (info->display_key);
+  info->display_key = NULL;
+  g_collation_key_free (info->collation_key);
+  info->collation_key = NULL;
 
   info->display_name = g_strdup (display_name);
 }
Index: gtk/gtkfilesystem.h
===================================================================
--- gtk/gtkfilesystem.h	(revision 20065)
+++ gtk/gtkfilesystem.h	(working copy)
@@ -89,6 +89,7 @@ void         gtk_file_info_free (GtkFile
 
 G_CONST_RETURN gchar *gtk_file_info_get_display_name      (const GtkFileInfo *info);
 G_CONST_RETURN gchar *gtk_file_info_get_display_key       (const GtkFileInfo *info);
+const GCollationKey  *gtk_file_info_get_collation_key     (const GtkFileInfo *info);
 void                  gtk_file_info_set_display_name      (GtkFileInfo       *info,
 							   const gchar       *display_name);
 gboolean              gtk_file_info_get_is_folder         (const GtkFileInfo *info);
