Index: app/core/gimp.h
===================================================================
--- app/core/gimp.h	(revision 22832)
+++ app/core/gimp.h	(working copy)
@@ -87,6 +87,9 @@
   GimpContainer          *named_buffers;
 
   GimpContainer          *fonts;
+  GThread                *fonts_thread;
+  GMutex                 *fonts_mutex;
+  GCond                  *fonts_cond;
 
   GimpDataFactory        *brush_factory;
   GimpDataFactory        *pattern_factory;
Index: app/core/gimp.c
===================================================================
--- app/core/gimp.c	(revision 22832)
+++ app/core/gimp.c	(working copy)
@@ -222,6 +222,10 @@
                                "named buffers");
 
   gimp->fonts               = NULL;
+  gimp->fonts_thread        = NULL;
+  gimp->fonts_mutex         = g_mutex_new ();
+  gimp->fonts_cond          = g_cond_new ();
+
   gimp->brush_factory       = NULL;
   gimp->pattern_factory     = NULL;
   gimp->gradient_factory    = NULL;
Index: app/text/gimp-fonts.c
===================================================================
--- app/text/gimp-fonts.c	(revision 22832)
+++ app/text/gimp-fonts.c	(working copy)
@@ -61,12 +61,55 @@
                             G_CALLBACK (gimp_fonts_load), gimp);
 }
 
+static gboolean
+gimp_fonts_load_restore_idle (GimpFontList *list)
+{
+  gimp_font_list_restore (list);
+
+  return FALSE;
+}
+
+typedef struct
+{
+  Gimp     *gimp;
+  FcConfig *config;
+} gimp_fonts_load_func_data;
+
+static gpointer
+gimp_fonts_load_func (gimp_fonts_load_func_data *data)
+{
+  gimp_container_freeze (GIMP_CONTAINER (data->gimp->fonts));
+
+  if (! FcConfigBuildFonts (data->config))
+    {
+      FcConfigDestroy (data->config);
+      goto cleanup;
+    }
+
+  FcConfigSetCurrent (data->config);
+  
+  g_idle_add ((GSourceFunc) gimp_fonts_load_restore_idle, data->gimp->fonts);
+
+ cleanup:
+  g_mutex_lock (data->gimp->fonts_mutex);
+  data->gimp->fonts_thread = NULL;
+  g_cond_signal (data->gimp->fonts_cond);
+  g_mutex_unlock (data->gimp->fonts_mutex);
+
+  gimp_container_thaw (GIMP_CONTAINER (data->gimp->fonts));
+
+  g_free (data);
+
+  return NULL;
+}
+
 void
 gimp_fonts_load (Gimp *gimp)
 {
-  FcConfig *config;
-  gchar    *fonts_conf;
-  gchar    *path;
+  FcConfig                  *config;
+  gchar    		    *fonts_conf;
+  gchar    		    *path;
+  gimp_fonts_load_func_data *data;
 
   g_return_if_fail (GIMP_IS_FONT_LIST (gimp->fonts));
 
@@ -96,16 +139,18 @@
   gimp_fonts_add_directories (config, path);
   g_free (path);
 
-  if (! FcConfigBuildFonts (config))
-    {
-      FcConfigDestroy (config);
-      goto cleanup;
-    }
+  data = g_new (gimp_fonts_load_func_data, 1);
+  data->gimp = gimp;
+  data->config = config;
 
-  FcConfigSetCurrent (config);
+  g_mutex_lock (gimp->fonts_mutex);
+  while (gimp->fonts_thread != NULL)
+    g_cond_wait (gimp->fonts_cond, gimp->fonts_mutex);
 
-  gimp_font_list_restore (GIMP_FONT_LIST (gimp->fonts));
+  gimp->fonts_thread = g_thread_create ((GThreadFunc) gimp_fonts_load_func, data, FALSE, NULL);
 
+  g_mutex_unlock (gimp->fonts_mutex);
+
  cleanup:
   gimp_container_thaw (GIMP_CONTAINER (gimp->fonts));
   gimp_unset_busy (gimp);
