Index: app/text/gimptext.c
===================================================================
--- app/text/gimptext.c	(revision 22622)
+++ app/text/gimptext.c	(working copy)
@@ -44,6 +44,7 @@ enum
   PROP_0,
   PROP_TEXT,
   PROP_FONT,
+  PROP_FONT_DESC,
   PROP_FONT_SIZE,
   PROP_UNIT,
   PROP_HINTING,
@@ -116,6 +117,10 @@ gimp_text_class_init (GimpTextClass *kla
                                    "font", NULL,
                                    "Sans",
                                    GIMP_PARAM_STATIC_STRINGS);
+  GIMP_CONFIG_INSTALL_PROP_STRING (object_class, PROP_FONT_DESC,
+                                   "font-desc", NULL,
+                                   NULL,
+                                   GIMP_PARAM_STATIC_STRINGS);
   GIMP_CONFIG_INSTALL_PROP_DOUBLE (object_class, PROP_FONT_SIZE,
                                    "font-size", NULL,
                                    0.0, 8192.0, 18.0,
@@ -251,6 +256,11 @@ gimp_text_finalize (GObject *object)
       g_free (text->font);
       text->font = NULL;
     }
+  if (text->font_desc)
+    {
+      g_free (text->font_desc);
+      text->font_desc = NULL;
+    }
   if (text->language)
     {
       g_free (text->language);
@@ -276,6 +286,9 @@ gimp_text_get_property (GObject      *ob
     case PROP_FONT:
       g_value_set_string (value, text->font);
       break;
+    case PROP_FONT_DESC:
+      g_value_set_string (value, (gchar *) text->font_desc);
+      break;
     case PROP_FONT_SIZE:
       g_value_set_double (value, text->font_size);
       break;
@@ -365,6 +378,10 @@ gimp_text_set_property (GObject      *ob
       g_free (text->font);
       text->font = g_value_dup_string (value);
       break;
+    case PROP_FONT_DESC:
+      g_free (text->font_desc);
+      text->font_desc = (guchar *) g_value_dup_string (value);
+      break;
     case PROP_FONT_SIZE:
       text->font_size = g_value_get_double (value);
       break;
@@ -453,6 +470,9 @@ gimp_text_get_memsize (GimpObject *objec
   if (text->font)
     memsize += strlen (text->font) + 1;
 
+  if (text->font_desc)
+    memsize += strlen ((gchar *) text->font_desc) + 1;
+
   if (text->language)
     memsize += strlen (text->language) + 1;
 
Index: app/text/gimptext.h
===================================================================
--- app/text/gimptext.h	(revision 22622)
+++ app/text/gimptext.h	(working copy)
@@ -43,6 +43,7 @@ struct _GimpText
 
   gchar                 *text;
   gchar                 *font;
+  guchar                *font_desc;
   GimpUnit               unit;
   gdouble                font_size;
   gboolean               hinting;
Index: app/text/gimpfontlist.c
===================================================================
--- app/text/gimpfontlist.c	(revision 22622)
+++ app/text/gimpfontlist.c	(working copy)
@@ -54,7 +54,8 @@ typedef char * (* GimpFontDescToStringFu
 
 static void   gimp_font_list_add_font   (GimpFontList         *list,
                                          PangoContext         *context,
-                                         PangoFontDescription *desc);
+                                         PangoFontDescription *desc,
+                                         FcPattern            *fc_pattern);
 
 static void   gimp_font_list_load_names (GimpFontList         *list,
                                          PangoFontMap         *fontmap,
@@ -145,16 +146,21 @@ gimp_font_list_restore (GimpFontList *li
 static void
 gimp_font_list_add_font (GimpFontList         *list,
                          PangoContext         *context,
-                         PangoFontDescription *desc)
+                         PangoFontDescription *desc,
+                         FcPattern            *fc_pattern)
 {
   GimpFont *font;
   gchar    *name;
+  guchar   *fc_desc = NULL;
 
   if (! desc)
     return;
 
   name = font_desc_to_string (desc);
 
+  if (fc_pattern)
+    fc_desc = FcNameUnparse (fc_pattern);
+
   if (! g_utf8_validate (name, -1, NULL))
     {
       g_free (name);
@@ -164,9 +170,12 @@ gimp_font_list_add_font (GimpFontList   
   font = g_object_new (GIMP_TYPE_FONT,
                        "name",          name,
                        "pango-context", context,
+                       "font-desc",     fc_desc,
                        NULL);
 
   g_free (name);
+  if (fc_desc)
+    g_free (fc_desc);
 
   gimp_container_add (GIMP_CONTAINER (list), GIMP_OBJECT (font));
   g_object_unref (font);
@@ -197,7 +206,7 @@ gimp_font_list_make_alias (GimpFontList 
                                      PANGO_WEIGHT_BOLD : PANGO_WEIGHT_NORMAL);
   pango_font_description_set_stretch (desc, PANGO_STRETCH_NORMAL);
 
-  gimp_font_list_add_font (list, context, desc);
+  gimp_font_list_add_font (list, context, desc, NULL);
 
   pango_font_description_free (desc);
 }
@@ -244,7 +253,7 @@ gimp_font_list_load_names (GimpFontList 
       PangoFontDescription *desc;
 
       desc = pango_fc_font_description_from_pattern (fontset->fonts[i], FALSE);
-      gimp_font_list_add_font (list, context, desc);
+      gimp_font_list_add_font (list, context, desc, fontset->fonts[i]);
       pango_font_description_free (desc);
     }
 
@@ -279,7 +288,7 @@ gimp_font_list_load_names (GimpFontList 
           PangoFontDescription *desc;
 
           desc = pango_font_face_describe (faces[j]);
-          gimp_font_list_add_font (list, context, desc);
+          gimp_font_list_add_font (list, context, desc, NULL);
           pango_font_description_free (desc);
         }
     }
Index: app/text/gimptextlayout.c
===================================================================
--- app/text/gimptextlayout.c	(revision 22622)
+++ app/text/gimptextlayout.c	(working copy)
@@ -300,7 +300,32 @@ static void
 gimp_text_ft2_subst_func (FcPattern *pattern,
                           gpointer   data)
 {
-  GimpText *text = GIMP_TEXT (data);
+  GimpText  *text = GIMP_TEXT (data);
+  FcPattern *fontpat;
+  FcValue    value;
+
+  if (text->font_desc)
+    {
+      /* we don't trust the Pango generated pattern */
+      fontpat = FcNameParse (text->font_desc);
+
+      if (FcPatternGet(fontpat, FC_FAMILY, 0, &value) == FcResultMatch)
+        FcPatternAdd (pattern, FC_FAMILY, value, FcFalse);
+
+      if (FcPatternGet(fontpat, FC_STYLE, 0, &value) == FcResultMatch)
+        FcPatternAdd (pattern, FC_STYLE, value, FcFalse);
+
+      if (FcPatternGet(fontpat, FC_SLANT, 0, &value) == FcResultMatch)
+        FcPatternAdd (pattern, FC_SLANT, value, FcFalse);
+
+      if (FcPatternGet(fontpat, FC_WEIGHT, 0, &value) == FcResultMatch)
+        FcPatternAdd (pattern, FC_WEIGHT, value, FcFalse);
+
+      if (FcPatternGet(fontpat, FC_WIDTH, 0, &value) == FcResultMatch)
+        FcPatternAdd (pattern, FC_WIDTH, value, FcFalse);
+
+      FcPatternDestroy (fontpat);
+    }
 
   FcPatternAddBool (pattern, FC_HINTING,   text->hinting);
   FcPatternAddBool (pattern, FC_AUTOHINT,  text->autohint);
Index: app/text/gimpfont.c
===================================================================
--- app/text/gimpfont.c	(revision 22622)
+++ app/text/gimpfont.c	(working copy)
@@ -48,7 +48,8 @@
 enum
 {
   PROP_0,
-  PROP_PANGO_CONTEXT
+  PROP_PANGO_CONTEXT,
+  PROP_FONT_DESC
 };
 
 
@@ -57,6 +58,7 @@ struct _GimpFont
   GimpViewable  parent_instance;
 
   PangoContext *pango_context;
+  guchar       *font_desc;
 
   PangoLayout  *popup_layout;
   gint          popup_width;
@@ -74,6 +76,10 @@ static void      gimp_font_set_property 
                                              guint          property_id,
                                              const GValue  *value,
                                              GParamSpec    *pspec);
+static void      gimp_font_get_property     (GObject       *object,
+                                             guint          property_id,
+                                             GValue        *value,
+                                             GParamSpec    *pspec);
 
 static void      gimp_font_get_preview_size (GimpViewable  *viewable,
                                              gint           size,
@@ -109,6 +115,7 @@ gimp_font_class_init (GimpFontClass *kla
 
   object_class->finalize     = gimp_font_finalize;
   object_class->set_property = gimp_font_set_property;
+  object_class->get_property = gimp_font_get_property;
 
   viewable_class->get_preview_size = gimp_font_get_preview_size;
   viewable_class->get_popup_size   = gimp_font_get_popup_size;
@@ -121,6 +128,11 @@ gimp_font_class_init (GimpFontClass *kla
                                                         NULL, NULL,
                                                         PANGO_TYPE_CONTEXT,
                                                         GIMP_PARAM_WRITABLE));
+  g_object_class_install_property (object_class, PROP_FONT_DESC,
+                                   g_param_spec_string ("font-desc",
+                                                        NULL, NULL,
+                                                        NULL,
+                                                        GIMP_PARAM_READWRITE));
 }
 
 static void
@@ -165,6 +177,32 @@ gimp_font_set_property (GObject       *o
       font->pango_context = (PangoContext *) g_value_dup_object (value);
       break;
 
+    case PROP_FONT_DESC:
+      if (font->font_desc)
+        g_free (font->font_desc);
+      font->font_desc = (guchar *) g_value_dup_string (value);
+      break;
+
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+      break;
+    }
+}
+
+static void
+gimp_font_get_property (GObject       *object,
+                        guint          property_id,
+                        GValue        *value,
+                        GParamSpec    *pspec)
+{
+  GimpFont *font = GIMP_FONT (object);
+
+  switch (property_id)
+    {
+    case PROP_FONT_DESC:
+      g_value_set_string (value, (gchar *) font->font_desc);
+      break;
+
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
       break;
@@ -226,6 +264,38 @@ gimp_font_get_popup_size (GimpViewable *
   return TRUE;
 }
 
+static void
+gimp_font_ft2_subst_func (FcPattern *pattern,
+                          gpointer   data)
+{
+  GimpFont  *font = GIMP_FONT (data);
+  FcPattern *fontpat;
+  FcValue    value;
+
+  if (font->font_desc)
+    {
+      /* we don't trust the Pango generated pattern */
+      fontpat = FcNameParse (font->font_desc);
+
+      if (FcPatternGet(fontpat, FC_FAMILY, 0, &value) == FcResultMatch)
+        FcPatternAdd (pattern, FC_FAMILY, value, FcFalse);
+
+      if (FcPatternGet(fontpat, FC_STYLE, 0, &value) == FcResultMatch)
+        FcPatternAdd (pattern, FC_STYLE, value, FcFalse);
+
+      if (FcPatternGet(fontpat, FC_SLANT, 0, &value) == FcResultMatch)
+        FcPatternAdd (pattern, FC_SLANT, value, FcFalse);
+
+      if (FcPatternGet(fontpat, FC_WEIGHT, 0, &value) == FcResultMatch)
+        FcPatternAdd (pattern, FC_WEIGHT, value, FcFalse);
+
+      if (FcPatternGet(fontpat, FC_WIDTH, 0, &value) == FcResultMatch)
+        FcPatternAdd (pattern, FC_WIDTH, value, FcFalse);
+
+      FcPatternDestroy (fontpat);
+    }
+}
+
 static TempBuf *
 gimp_font_get_new_preview (GimpViewable *viewable,
                            GimpContext  *context,
@@ -251,6 +321,7 @@ gimp_font_get_new_preview (GimpViewable 
   if (! font->popup_layout ||
       font->popup_width != width || font->popup_height != height)
     {
+      PangoFontMap         *fontmap;
       PangoFontDescription *font_desc;
       const gchar          *name;
 
@@ -264,6 +335,11 @@ gimp_font_get_new_preview (GimpViewable 
       pango_font_description_set_size (font_desc,
                                        PANGO_SCALE * height * 2.0 / 3.0);
 
+      fontmap = pango_context_get_font_map (font->pango_context);
+      pango_ft2_font_map_set_default_substitute (PANGO_FT2_FONT_MAP (fontmap),
+                                                 gimp_font_ft2_subst_func,
+                                                 g_object_ref (font),
+                                                 (GDestroyNotify) g_object_unref);
       layout = pango_layout_new (font->pango_context);
 
       pango_layout_set_font_description (layout, font_desc);
Index: app/tools/gimptextoptions.c
===================================================================
--- app/tools/gimptextoptions.c	(revision 22622)
+++ app/tools/gimptextoptions.c	(working copy)
@@ -301,11 +301,24 @@ gimp_text_options_notify_font (GimpConte
                                GParamSpec  *pspec,
                                GimpText    *text)
 {
+  GimpFont *font;
+
   g_signal_handlers_block_by_func (text,
                                    gimp_text_options_notify_text_font,
                                    context);
 
   g_object_set (text, "font", gimp_context_get_font_name (context), NULL);
+  font = gimp_context_get_font (context);
+  if (font)
+    {
+      gchar *font_desc = NULL;
+
+      g_object_get (font, "font-desc", &font_desc, NULL);
+      g_object_set (text, "font-desc", font_desc, NULL);
+
+      if (font_desc)
+        g_free (font_desc);
+    }
 
   g_signal_handlers_unblock_by_func (text,
                                      gimp_text_options_notify_text_font,
