diff --git a/pango/pangocoretext.c b/pango/pangocoretext.c
index 384b5cc..5023e93 100644
--- a/pango/pangocoretext.c
+++ b/pango/pangocoretext.c
@@ -35,6 +35,8 @@ struct _PangoCoreTextFontPrivate
   CTFontRef font_ref;
   PangoCoreTextFontKey *key;
 
+  PangoCoverage *coverage;
+
   PangoFontMap *fontmap;
 };
 
@@ -48,6 +50,9 @@ pango_core_text_font_finalize (GObject *object)
   g_object_remove_weak_pointer (G_OBJECT (priv->fontmap), (gpointer *) (gpointer) &priv->fontmap);
   priv->fontmap = NULL;
 
+  if (priv->coverage)
+    pango_coverage_unref (priv->coverage);
+
   G_OBJECT_CLASS (pango_core_text_font_parent_class)->finalize (object);
 }
 
@@ -105,12 +110,17 @@ pango_core_text_font_get_coverage (PangoFont     *font,
 {
   PangoCoreTextFont *ctfont = (PangoCoreTextFont *)font;
   PangoCoreTextFontPrivate *priv = ctfont->priv;
-  CTFontDescriptorRef ctfontdesc;
 
-  ctfontdesc = pango_core_text_font_key_get_ctfontdescriptor (priv->key);
+  if (!priv->coverage)
+    {
+      CTFontDescriptorRef ctfontdesc;
 
-  /* FIXME: should this be cached in the font? */
-  return ct_font_descriptor_get_coverage (ctfontdesc);
+      ctfontdesc = pango_core_text_font_key_get_ctfontdescriptor (priv->key);
+
+      priv->coverage = ct_font_descriptor_get_coverage (ctfontdesc);
+    }
+
+  return pango_coverage_ref (priv->coverage);
 }
 
 static PangoEngineShape *
@@ -206,6 +216,12 @@ _pango_core_text_font_set_font_key (PangoCoreTextFont    *font,
   PangoCoreTextFontPrivate *priv = font->priv;
 
   priv->key = key;
+
+  if (priv->coverage)
+    {
+      pango_coverage_unref (priv->coverage);
+      priv->coverage = NULL;
+    }
 }
 
 void
