diff --git a/src/hb-old.cc b/src/hb-old.cc
index 77761e8..f938a9b 100644
--- a/src/hb-old.cc
+++ b/src/hb-old.cc
@@ -248,61 +248,6 @@
  * shaper
  */
 
-
-static hb_user_data_key_t hb_old_data_key;
-
-static HB_Face
-_hb_old_face_get (hb_face_t *face)
-{
-  HB_Face data = (HB_Face) hb_face_get_user_data (face, &hb_old_data_key);
-  if (likely (data)) return data;
-
-  data = _hb_old_shaper_face_data_create (face);
-
-  if (unlikely (!data)) {
-    DEBUG_MSG (OLD, face, "HB_NewFace failed");
-    return NULL;
-  }
-
-  if (unlikely (!hb_face_set_user_data (face, &hb_old_data_key, data,
-                                        (hb_destroy_func_t) _hb_old_shaper_face_data_destroy,
-                                        false)))
-  {
-    _hb_old_shaper_face_data_destroy (data);
-    data = (HB_Face) hb_face_get_user_data (face, &hb_old_data_key);
-    if (data)
-      return data;
-    else
-      return NULL;
-  }
-
-  return data;
-}
-
-
-static HB_Font
-_hb_old_font_get (hb_font_t *font)
-{
-  /* Ouch, check user_data! */
-  HB_Font data = _hb_old_shaper_font_data_create (font);
-  if (!data)
-    return NULL;
-
-  if (unlikely (!hb_font_set_user_data (font, &hb_old_data_key, data,
-                                        (hb_destroy_func_t) _hb_old_shaper_font_data_destroy,
-                                        false)))
-  {
-    _hb_old_shaper_font_data_destroy (data);
-    data = (HB_Font) hb_font_get_user_data (font, &hb_old_data_key);
-    if (data)
-      return data;
-    else
-      return NULL;
-  }
-
-  return data;
-}
-
 hb_bool_t
 _hb_old_shape (hb_shape_plan_t    *shape_plan,
 	       hb_font_t          *font,
@@ -310,27 +255,12 @@
 	       const hb_feature_t *features,
 	       unsigned int        num_features)
 {
-  if (unlikely (!buffer->len))
-    return true;
-
-  buffer->guess_properties ();
+  hb_face_t *face = font->face;
+  HB_Face old_face = HB_SHAPER_DATA_GET (face);
+  HB_Font old_font = HB_SHAPER_DATA_GET (font);
 
   bool backward = HB_DIRECTION_IS_BACKWARD (buffer->props.direction);
 
-#define FAIL(...) \
-  HB_STMT_START { \
-    DEBUG_MSG (OLD, NULL, __VA_ARGS__); \
-    return false; \
-  } HB_STMT_END;
-
-  HB_Face old_face = _hb_old_face_get (font->face);
-  if (unlikely (!old_face))
-    FAIL ("Couldn't get old face");
-
-  HB_Font old_font = _hb_old_font_get (font);
-  if (unlikely (!old_font))
-    FAIL ("Couldn't get old font");
-
 retry:
 
   unsigned int scratch_size;
@@ -398,7 +328,7 @@
     {
       buffer->ensure (buffer->allocated * 2);
       if (buffer->in_error)
-	FAIL ("Buffer resize failed");
+        return false;
       goto retry;
     }
     return false;
@@ -429,7 +359,7 @@
 
   buffer->ensure (num_glyphs);
   if (buffer->in_error)
-    FAIL ("Buffer in error");
+    return false;
 
 
   buffer->len = num_glyphs;
diff --git a/src/hb-shape.cc b/src/hb-shape.cc
index 0087618..fde9cf2 100644
--- a/src/hb-shape.cc
+++ b/src/hb-shape.cc
@@ -82,6 +82,11 @@
 	       unsigned int        num_features,
 	       const char * const *shaper_list)
 {
+  if (unlikely (!buffer->len))
+    return true;
+
+  buffer->guess_properties ();
+
   hb_shape_plan_t *shape_plan = hb_shape_plan_create (font->face, &buffer->props, features, num_features, shaper_list);
   hb_bool_t res = hb_shape_plan_execute (shape_plan, font, buffer, features, num_features);
   hb_shape_plan_destroy (shape_plan);
diff --git a/src/hb-shaper-impl-private.hh b/src/hb-shaper-impl-private.hh
index 91ee14f..7844081 100644
--- a/src/hb-shaper-impl-private.hh
+++ b/src/hb-shaper-impl-private.hh
@@ -36,8 +36,7 @@
 
 
 #ifdef HB_SHAPER
-/* For use in things like font->shaper_data() in the shaper implementations. */
-#define shaper_data() shaper_data.HB_SHAPER
+#define HB_SHAPER_DATA_GET(object) HB_SHAPER_DATA (HB_SHAPER, object)
 #endif
 
 
diff --git a/src/hb-shaper-private.hh b/src/hb-shaper-private.hh
index 9e35ef8..1cf7c5b 100644
--- a/src/hb-shaper-private.hh
+++ b/src/hb-shaper-private.hh
@@ -69,15 +69,11 @@
 
 #define HB_SHAPER_DATA_TYPE(shaper, object)		struct hb_##shaper##_shaper_##object##_data_t
 #define HB_SHAPER_DATA(shaper, object)			(* (HB_SHAPER_DATA_TYPE(shaper, object) **) &(object)->shaper_data.shaper)
-#define HB_SHAPER_DATA_GET_FUNC(shaper, object)		_hb_##shaper##_shaper_get_##object##_data
 #define HB_SHAPER_DATA_CREATE_FUNC(shaper, object)	_hb_##shaper##_shaper_##object##_data_create
 #define HB_SHAPER_DATA_DESTROY_FUNC(shaper, object)	_hb_##shaper##_shaper_##object##_data_destroy
 
 #define HB_SHAPER_DATA_PROTOTYPE(shaper, object) \
 	HB_SHAPER_DATA_TYPE (shaper, object); /* Type forward declaration. */ \
-	static inline HB_SHAPER_DATA_TYPE (shaper, object) * \
-	HB_SHAPER_DATA_GET_FUNC (shaper, object) (hb_##object##_t *object) \
-	{ return HB_SHAPER_DATA (shaper, object); } \
 	extern "C" HB_INTERNAL HB_SHAPER_DATA_TYPE (shaper, object) * \
 	HB_SHAPER_DATA_CREATE_FUNC (shaper, object) (hb_##object##_t *object HB_SHAPER_DATA_CREATE_FUNC_EXTRA_ARGS); \
 	extern "C" HB_INTERNAL void \
diff --git a/src/hb-uniscribe.cc b/src/hb-uniscribe.cc
index a7aa163..67e245c 100644
--- a/src/hb-uniscribe.cc
+++ b/src/hb-uniscribe.cc
@@ -55,38 +55,6 @@
 );
 */
 
-static bool
-populate_log_font (LOGFONTW  *lf,
-		   hb_font_t *font)
-{
-  memset (lf, 0, sizeof (*lf));
-  lf->lfHeight = -font->y_scale;
-  lf->lfCharSet = DEFAULT_CHARSET;
-
-  hb_blob_t *blob = Sanitizer<name>::sanitize (hb_face_reference_table (font->face, HB_TAG ('n','a','m','e')));
-  const name *name_table = Sanitizer<name>::lock_instance (blob);
-  unsigned int len = name_table->get_name (3, 1, 0x409, 4,
-					   lf->lfFaceName,
-					   sizeof (lf->lfFaceName[0]) * LF_FACESIZE)
-					  / sizeof (lf->lfFaceName[0]);
-  hb_blob_destroy (blob);
-
-  if (unlikely (!len)) {
-    DEBUG_MSG (UNISCRIBE, NULL, "Didn't find English name table entry");
-    return false;
-  }
-  if (unlikely (len >= LF_FACESIZE)) {
-    DEBUG_MSG (UNISCRIBE, NULL, "Font name too long");
-    return false;
-  }
-
-  for (unsigned int i = 0; i < len; i++)
-    lf->lfFaceName[i] = hb_be_uint16 (lf->lfFaceName[i]);
-  lf->lfFaceName[len] = 0;
-
-  return true;
-}
-
 
 /*
  * shaper face data
@@ -141,6 +109,38 @@
   SCRIPT_CACHE script_cache;
 };
 
+static bool
+populate_log_font (LOGFONTW  *lf,
+		   hb_font_t *font)
+{
+  memset (lf, 0, sizeof (*lf));
+  lf->lfHeight = -font->y_scale;
+  lf->lfCharSet = DEFAULT_CHARSET;
+
+  hb_blob_t *blob = Sanitizer<name>::sanitize (hb_face_reference_table (font->face, HB_TAG ('n','a','m','e')));
+  const name *name_table = Sanitizer<name>::lock_instance (blob);
+  unsigned int len = name_table->get_name (3, 1, 0x409, 4,
+					   lf->lfFaceName,
+					   sizeof (lf->lfFaceName[0]) * LF_FACESIZE)
+					  / sizeof (lf->lfFaceName[0]);
+  hb_blob_destroy (blob);
+
+  if (unlikely (!len)) {
+    DEBUG_MSG (UNISCRIBE, NULL, "Didn't find English name table entry");
+    return false;
+  }
+  if (unlikely (len >= LF_FACESIZE)) {
+    DEBUG_MSG (UNISCRIBE, NULL, "Font name too long");
+    return false;
+  }
+
+  for (unsigned int i = 0; i < len; i++)
+    lf->lfFaceName[i] = hb_be_uint16 (lf->lfFaceName[i]);
+  lf->lfFaceName[len] = 0;
+
+  return true;
+}
+
 hb_uniscribe_shaper_font_data_t *
 _hb_uniscribe_shaper_font_data_create (hb_font_t *font)
 {
@@ -208,65 +208,18 @@
 /*
  * shaper
  */
-static hb_user_data_key_t hb_uniscribe_data_key;
-
-static hb_uniscribe_shaper_face_data_t *
-_hb_uniscribe_face_get_data (hb_face_t *face)
-{
-  hb_uniscribe_shaper_face_data_t *data = (hb_uniscribe_shaper_face_data_t *) hb_face_get_user_data (face, &hb_uniscribe_data_key);
-  if (likely (data)) return data;
-
-  data = _hb_uniscribe_shaper_face_data_create (face);
-  if (!data) return NULL;
-
-  if (unlikely (!hb_face_set_user_data (face, &hb_uniscribe_data_key, data,
-					(hb_destroy_func_t) _hb_uniscribe_shaper_face_data_destroy,
-					false)))
-  {
-    _hb_uniscribe_shaper_face_data_destroy (data);
-    data = (hb_uniscribe_shaper_face_data_t *) hb_face_get_user_data (face, &hb_uniscribe_data_key);
-  }
-
-  return data;
-}
-
-
-static hb_uniscribe_shaper_font_data_t *
-_hb_uniscribe_font_get_data (hb_font_t *font)
-{
-  hb_uniscribe_shaper_font_data_t *data = (hb_uniscribe_shaper_font_data_t *) hb_font_get_user_data (font, &hb_uniscribe_data_key);
-  if (likely (data)) return data;
-
-  data = _hb_uniscribe_shaper_font_data_create (font);
-  if (unlikely (!data))
-    return NULL;
-
-  if (unlikely (!hb_font_set_user_data (font, &hb_uniscribe_data_key, data,
-					(hb_destroy_func_t) _hb_uniscribe_shaper_font_data_destroy,
-					false)))
-  {
-    _hb_uniscribe_shaper_font_data_destroy (data);
-    data = (hb_uniscribe_shaper_font_data_t *) hb_font_get_user_data (font, &hb_uniscribe_data_key);
-  }
-
-  return data;
-}
 
 LOGFONTW *
 hb_uniscribe_font_get_logfontw (hb_font_t *font)
 {
-  hb_uniscribe_shaper_font_data_t *font_data = _hb_uniscribe_font_get_data (font);
-  if (unlikely (!font_data))
-    return NULL;
+  hb_uniscribe_shaper_font_data_t *font_data =  HB_SHAPER_DATA_GET (font);
   return &font_data->log_font;
 }
 
 HFONT
 hb_uniscribe_font_get_hfont (hb_font_t *font)
 {
-  hb_uniscribe_shaper_font_data_t *font_data = _hb_uniscribe_font_get_data (font);
-  if (unlikely (!font_data))
-    return 0;
+  hb_uniscribe_shaper_font_data_t *font_data =  HB_SHAPER_DATA_GET (font);
   return font_data->hfont;
 }
 
@@ -278,7 +231,9 @@
 		     const hb_feature_t *features,
 		     unsigned int        num_features)
 {
-  buffer->guess_properties ();
+  hb_face_t *face = font->face;
+  hb_uniscribe_shaper_face_data_t *face_data = HB_SHAPER_DATA_GET (face);
+  hb_uniscribe_shaper_font_data_t *font_data = HB_SHAPER_DATA_GET (font);
 
 #define FAIL(...) \
   HB_STMT_START { \
@@ -286,17 +241,6 @@
     return false; \
   } HB_STMT_END;
 
-  hb_uniscribe_shaper_face_data_t *face_data = _hb_uniscribe_face_get_data (font->face);
-  if (unlikely (!face_data->fh))
-    FAIL ("Couldn't get face data");
-
-  hb_uniscribe_shaper_font_data_t *font_data = _hb_uniscribe_font_get_data (font);
-  if (unlikely (!font_data->hfont))
-    FAIL ("Couldn't get font font");
-
-  if (unlikely (!buffer->len))
-    return true;
-
   HRESULT hr;
 
 retry:
