diff --git Headers/fontconfig/FCFaceInfo.h Headers/fontconfig/FCFaceInfo.h
index e77d2cb..1edda17 100644
--- Headers/fontconfig/FCFaceInfo.h
+++ Headers/fontconfig/FCFaceInfo.h
@@ -46,6 +46,7 @@
 	NSString *_familyName;
 	NSCharacterSet *_characterSet;
 	BOOL _hasNoCharacterSet;
+	BOOL _patternIsResolved;
 }
 
 - (id) initWithfamilyName: (NSString *)familyName 
diff --git Source/fontconfig/FCFaceInfo.m Source/fontconfig/FCFaceInfo.m
index 0aa1365..0d6e624 100644
--- Source/fontconfig/FCFaceInfo.m
+++ Source/fontconfig/FCFaceInfo.m
@@ -133,27 +133,32 @@
 
 - (FcPattern *) matchedPattern
 {
-  FcResult result;
-  FcPattern *resolved;
+  if (!_patternIsResolved)
+    {
+      FcResult result;
+      FcPattern *resolved;
+
+      FcConfigSubstitute(NULL, _pattern, FcMatchPattern); 
+      FcDefaultSubstitute(_pattern);
+      resolved = FcFontMatch(NULL, _pattern, &result);
 
-  FcConfigSubstitute(NULL, _pattern, FcMatchPattern); 
-  FcDefaultSubstitute(_pattern);
-  resolved = FcFontMatch(NULL, _pattern, &result);
+      FcPatternDestroy(_pattern);
+      _pattern = resolved;
+      _patternIsResolved = YES;
+    }
 
-  return resolved;
+  FcPatternReference(_pattern); // caller expects ownership of returned pattern & will destroy
+  return _pattern;
 }
 
 - (NSCharacterSet*)characterSet
 {
   if (_characterSet == nil && !_hasNoCharacterSet)
     {
-      FcResult result;
       FcPattern *resolved;
       FcCharSet *charset;
       
-      FcConfigSubstitute(NULL, _pattern, FcMatchPattern); 
-      FcDefaultSubstitute(_pattern);
-      resolved = FcFontMatch(NULL, _pattern, &result);
+      resolved = [self matchedPattern];
       
       if (FcResultMatch == FcPatternGetCharSet(resolved, FC_CHARSET, 0, &charset))
 	{
