diff -r -u old/pango-1.36.6/modules/basic/basic-coretext.c new/pango-1.36.6/modules/basic/basic-coretext.c
--- old/pango-1.36.6/modules/basic/basic-coretext.c	2014-08-16 07:15:21.000000000 -0600
+++ new/pango-1.36.6/modules/basic/basic-coretext.c	2014-08-27 18:47:22.000000000 -0600
@@ -56,7 +56,8 @@
 	   PangoGlyphString *glyphs,
 	   int               i,
 	   int               offset,
-	   PangoGlyph        glyph)
+	   PangoGlyph        glyph,
+           CGSize            *adv)
 {
   PangoRectangle logical_rect;
 
@@ -66,8 +67,13 @@
   glyphs->glyphs[i].geometry.y_offset = 0;
 
   glyphs->log_clusters[i] = offset;
-  pango_font_get_glyph_extents (font, glyphs->glyphs[i].glyph, NULL, &logical_rect);
-  glyphs->glyphs[i].geometry.width = logical_rect.width;
+  if (adv) {
+    /* by using the advances array, we get kerning */
+    glyphs->glyphs[i].geometry.width = adv->width * PANGO_SCALE;
+  } else {
+    pango_font_get_glyph_extents (font, glyphs->glyphs[i].glyph, NULL, &logical_rect);
+    glyphs->glyphs[i].geometry.width = logical_rect.width;
+  }
 }
 
 
@@ -94,6 +100,8 @@
   CFIndex *current_indices;
   const CGGlyph *current_cgglyphs;
   CGGlyph *current_cgglyphs_buffer;
+  const CGSize *current_cgadvs;
+  CGSize *current_cgadvs_buffer;
   CTRunStatus current_run_status;
 };
 
@@ -106,6 +114,9 @@
   if (iter->current_cgglyphs_buffer)
     free (iter->current_cgglyphs_buffer);
   iter->current_cgglyphs_buffer = NULL;
+  if (iter->current_cgadvs_buffer)
+    free (iter->current_cgadvs_buffer);
+  iter->current_cgadvs_buffer = NULL;
   if (iter->current_indices)
     free (iter->current_indices);
   iter->current_indices = NULL;
@@ -133,6 +144,15 @@
       iter->current_cgglyphs = iter->current_cgglyphs_buffer;
     }
 
+  iter->current_cgadvs = CTRunGetAdvancesPtr (iter->current_run);
+  if (!iter->current_cgadvs)
+    {
+      iter->current_cgadvs_buffer = (CGSize *)malloc (sizeof (CGSize) * ct_glyph_count);
+      CTRunGetAdvances (iter->current_run, CFRangeMake (0, ct_glyph_count),
+                        iter->current_cgadvs_buffer);
+      iter->current_cgadvs = iter->current_cgadvs_buffer;
+    }
+
   iter->current_indices = malloc (sizeof (CFIndex) * ct_glyph_count);
   CTRunGetStringIndices (iter->current_run, CFRangeMake (0, ct_glyph_count),
                          iter->current_indices);
@@ -179,7 +199,17 @@
 static gunichar
 run_iterator_get_character (struct RunIterator *iter)
 {
-  return CFStringGetCharacterAtIndex (iter->cstr, iter->current_indices[iter->ct_i]);
+  gunichar c;
+
+  c = CFStringGetCharacterAtIndex (iter->cstr, iter->current_indices[iter->ct_i]);
+  if ((c >= 0xD800) && (c <= 0xDFFF)) {
+    /* surrogate pair */
+    gunichar c2;
+    c2 = CFStringGetCharacterAtIndex (iter->cstr, iter->current_indices[iter->ct_i]+1);
+    c = 0x10000 + (((c & 0x3FF) << 10) | (c2 & 0x3FF));
+  }
+
+  return c;
 }
 
 static CGGlyph
@@ -188,6 +218,12 @@
   return iter->current_cgglyphs[iter->ct_i];
 }
 
+static CGSize
+run_iterator_get_cgadv (struct RunIterator *iter)
+{
+  return iter->current_cgadvs[iter->ct_i];
+}
+
 static CFIndex
 run_iterator_get_index (struct RunIterator *iter)
 {
@@ -218,6 +254,7 @@
   iter->current_indices = NULL;
   iter->current_cgglyphs = NULL;
   iter->current_cgglyphs_buffer = NULL;
+  iter->current_cgadvs_buffer = NULL;
 
   /* Create CTLine */
   attributes = CFDictionaryCreate (kCFAllocatorDefault,
@@ -311,6 +348,7 @@
 {
   CFIndex index;
   CGGlyph cgglyph;
+  CGSize cgadv;
   gunichar wc;
 };
 
@@ -352,6 +390,7 @@
       gi = g_slice_new (struct GlyphInfo);
       gi->index = run_iterator_get_index (&riter);
       gi->cgglyph = run_iterator_get_cgglyph (&riter);
+      gi->cgadv = run_iterator_get_cgadv (&riter);
       gi->wc = run_iterator_get_character (&riter);
 
       glyph_list = g_slist_prepend (glyph_list, gi);
@@ -440,7 +479,7 @@
       if (gi == NULL || gi->index > gs_i)
         {
           /* gs_i is behind, insert empty glyph */
-          set_glyph (font, glyphs, gs_i, p - text, PANGO_GLYPH_EMPTY);
+          set_glyph (font, glyphs, gs_i, p - text, PANGO_GLYPH_EMPTY, NULL);
           continue;
         }
       else if (gi->index < gs_i)
@@ -471,7 +510,7 @@
 
           if (result != PANGO_COVERAGE_NONE)
             {
-              set_glyph (font, glyphs, gs_i, p - text, gi->cgglyph);
+              set_glyph (font, glyphs, gs_i, p - text, gi->cgglyph, &gi->cgadv);
 
               if (g_unichar_type (gi->wc) == G_UNICODE_NON_SPACING_MARK)
                 {
@@ -494,7 +533,7 @@
                 }
             }
           else
-            set_glyph (font, glyphs, gs_i, p - text, PANGO_GET_UNKNOWN_GLYPH (gi->wc));
+            set_glyph (font, glyphs, gs_i, p - text, PANGO_GET_UNKNOWN_GLYPH (gi->wc), NULL);
 
           glyph_iter = g_slist_next (glyph_iter);
         }
diff -r -u old/pango-1.36.6/pango/pangocairo-coretextfont.c new/pango-1.36.6/pango/pangocairo-coretextfont.c
--- old/pango-1.36.6/pango/pangocairo-coretextfont.c	2014-03-05 21:33:55.000000000 -0700
+++ new/pango-1.36.6/pango/pangocairo-coretextfont.c	2014-08-27 18:13:16.000000000 -0600
@@ -147,6 +147,12 @@
   metrics->strikethrough_position = metrics->ascent / 3;
   metrics->strikethrough_thickness = CTFontGetUnderlineThickness (ctfont) * PANGO_SCALE;
 
+  metrics->underline_position = -metrics->underline_position;
+  pango_quantize_line_geometry (&metrics->underline_thickness,
+                                &metrics->underline_position);
+  metrics->underline_position = -(metrics->underline_position 
+                                  + metrics->underline_thickness);
+
   layout = pango_layout_new (context);
   font_desc = pango_font_describe_with_absolute_size ((PangoFont *) font);
   pango_layout_set_font_description (layout, font_desc);
diff -r -u old/pango-1.36.6/pango/pangocairo-coretextfontmap.c new/pango-1.36.6/pango/pangocairo-coretextfontmap.c
--- old/pango-1.36.6/pango/pangocairo-coretextfontmap.c	2014-03-05 21:33:55.000000000 -0700
+++ new/pango-1.36.6/pango/pangocairo-coretextfontmap.c	2014-08-27 18:13:16.000000000 -0600
@@ -186,5 +186,5 @@
 pango_cairo_core_text_font_map_init (PangoCairoCoreTextFontMap *cafontmap)
 {
   cafontmap->serial = 1;
-  cafontmap->dpi = 96.;
+  cafontmap->dpi = 72.;
 }
diff -r -u old/pango-1.36.6/pango/pangocoretext-fontmap.c new/pango-1.36.6/pango/pangocoretext-fontmap.c
--- old/pango-1.36.6/pango/pangocoretext-fontmap.c	2014-08-01 00:49:36.000000000 -0600
+++ new/pango-1.36.6/pango/pangocoretext-fontmap.c	2014-08-27 18:13:16.000000000 -0600
@@ -298,7 +298,8 @@
   cf_number = (CFNumberRef)CFDictionaryGetValue (dict,
                                                  kCTFontWeightTrait);
 
-  if (CFNumberGetValue (cf_number, kCFNumberCGFloatType, &value))
+  weight = PANGO_WEIGHT_NORMAL;
+  if (cf_number && CFNumberGetValue (cf_number, kCFNumberCGFloatType, &value))
     {
       if (value < ct_weight_min || value > ct_weight_max)
 	{
@@ -317,8 +318,6 @@
 	      }
 	}
     }
- else
-   weight = PANGO_WEIGHT_NORMAL;
 
   CFRelease (dict);
 
diff -r -u old/pango-1.36.6/pango/pangocoretext.c new/pango-1.36.6/pango/pangocoretext.c
--- old/pango-1.36.6/pango/pangocoretext.c	2014-03-05 21:33:55.000000000 -0700
+++ new/pango-1.36.6/pango/pangocoretext.c	2014-08-27 18:13:16.000000000 -0600
@@ -97,8 +97,7 @@
   bitmap = CFCharacterSetCreateBitmapRepresentation (kCFAllocatorDefault,
                                                      charset);
 
-  /* We only handle the BMP plane */
-  length = MIN (CFDataGetLength (bitmap), 8192);
+  length = CFDataGetLength (bitmap);
   ptr = CFDataGetBytePtr (bitmap);
 
   /* FIXME: can and should this be done more efficiently? */
