diff --git a/src/hb-buffer.cc b/src/hb-buffer.cc
index 6d0d4d456..7e79eefd2 100644
--- a/src/hb-buffer.cc
+++ b/src/hb-buffer.cc
@@ -152,6 +152,12 @@ hb_buffer_create (unsigned int pre_alloc_size)
   return buffer;
 }
 
+hb_buffer_t *
+hb_buffer_get_empty (void)
+{
+  return &_hb_buffer_nil;
+}
+
 hb_buffer_t *
 hb_buffer_reference (hb_buffer_t *buffer)
 {
diff --git a/src/hb-buffer.h b/src/hb-buffer.h
index 47a212395..020a12079 100644
--- a/src/hb-buffer.h
+++ b/src/hb-buffer.h
@@ -62,6 +62,9 @@ typedef struct _hb_glyph_position_t {
 hb_buffer_t *
 hb_buffer_create (unsigned int pre_alloc_size);
 
+hb_buffer_t *
+hb_buffer_get_empty (void);
+
 hb_buffer_t *
 hb_buffer_reference (hb_buffer_t *buffer);
 
diff --git a/src/hb-font.cc b/src/hb-font.cc
index 6cd436d77..bb8f84c25 100644
--- a/src/hb-font.cc
+++ b/src/hb-font.cc
@@ -159,6 +159,12 @@ hb_font_funcs_create (void)
   return ffuncs;
 }
 
+hb_font_funcs_t *
+hb_font_funcs_get_empty (void)
+{
+  return &_hb_font_funcs_nil;
+}
+
 hb_font_funcs_t *
 hb_font_funcs_reference (hb_font_funcs_t *ffuncs)
 {
@@ -404,6 +410,12 @@ hb_face_create_for_data (hb_blob_t    *blob,
 				    (hb_destroy_func_t) _hb_face_for_data_closure_destroy);
 }
 
+hb_face_t *
+hb_face_get_empty (void)
+{
+  return &_hb_face_nil;
+}
+
 
 hb_face_t *
 hb_face_reference (hb_face_t *face)
@@ -533,6 +545,12 @@ hb_font_create_sub_font (hb_font_t *parent)
   return font;
 }
 
+hb_font_t *
+hb_font_get_empty (void)
+{
+  return &_hb_font_nil;
+}
+
 hb_font_t *
 hb_font_reference (hb_font_t *font)
 {
diff --git a/src/hb-font.h b/src/hb-font.h
index ce81985c5..7f05144cf 100644
--- a/src/hb-font.h
+++ b/src/hb-font.h
@@ -52,6 +52,9 @@ hb_face_create_for_tables (hb_get_table_func_t  get_table,
 			   void                *user_data,
 			   hb_destroy_func_t    destroy);
 
+hb_face_t *
+hb_face_get_empty (void);
+
 hb_face_t *
 hb_face_reference (hb_face_t *face);
 
@@ -87,6 +90,9 @@ typedef struct _hb_font_funcs_t hb_font_funcs_t;
 hb_font_funcs_t *
 hb_font_funcs_create (void);
 
+hb_font_funcs_t *
+hb_font_funcs_get_empty (void);
+
 hb_font_funcs_t *
 hb_font_funcs_reference (hb_font_funcs_t *ffuncs);
 
@@ -206,6 +212,9 @@ hb_font_create (hb_face_t *face);
 hb_font_t *
 hb_font_create_sub_font (hb_font_t *parent);
 
+hb_font_t *
+hb_font_get_empty (void);
+
 hb_font_t *
 hb_font_reference (hb_font_t *font);
 
diff --git a/src/hb-unicode.cc b/src/hb-unicode.cc
index 943d7a774..c2d7311c1 100644
--- a/src/hb-unicode.cc
+++ b/src/hb-unicode.cc
@@ -125,6 +125,12 @@ hb_unicode_funcs_create (hb_unicode_funcs_t *parent)
   return ufuncs;
 }
 
+hb_unicode_funcs_t *
+hb_unicode_funcs_get_empty (void)
+{
+  return &_hb_unicode_funcs_nil;
+}
+
 hb_unicode_funcs_t *
 hb_unicode_funcs_reference (hb_unicode_funcs_t *ufuncs)
 {
diff --git a/src/hb-unicode.h b/src/hb-unicode.h
index 9e590d806..e7a200565 100644
--- a/src/hb-unicode.h
+++ b/src/hb-unicode.h
@@ -53,6 +53,9 @@ hb_unicode_funcs_get_default (void);
 hb_unicode_funcs_t *
 hb_unicode_funcs_create (hb_unicode_funcs_t *parent);
 
+hb_unicode_funcs_t *
+hb_unicode_funcs_get_empty (void);
+
 hb_unicode_funcs_t *
 hb_unicode_funcs_reference (hb_unicode_funcs_t *ufuncs);
 
diff --git a/test/test-object.c b/test/test-object.c
index 1abe65cd5..1ad3b8885 100644
--- a/test/test-object.c
+++ b/test/test-object.c
@@ -43,7 +43,7 @@ create_blob (void)
 static void *
 create_blob_inert (void)
 {
-  return hb_blob_get_empty ();
+  return hb_blob_create (NULL, 0, HB_MEMORY_MODE_DUPLICATE, NULL, NULL);
 }
 
 static void *
@@ -68,7 +68,7 @@ create_face (void)
 static void *
 create_face_inert (void)
 {
-  return hb_face_create_for_data ((hb_blob_t *) create_blob_inert (), 0);
+  return hb_face_create_for_data (hb_blob_get_empty (), 0);
 }
 
 static void *
@@ -82,7 +82,7 @@ create_font (void)
 static void *
 create_font_inert (void)
 {
-  return hb_font_create (create_face_inert ());
+  return hb_font_create (hb_face_get_empty ());
 }
 
 static void *
@@ -124,6 +124,7 @@ typedef hb_bool_t (*is_immutable_func_t)   (void *obj);
 typedef struct {
   create_func_t          create;
   create_func_t          create_inert;
+  create_func_t          get_empty;
   reference_func_t       reference;
   destroy_func_t         destroy;
   set_user_data_func_t   set_user_data;
@@ -137,6 +138,7 @@ typedef struct {
   { \
     (create_func_t)         create_##name, \
     (create_func_t)         create_##name##_inert, \
+    (create_func_t)         hb_##name##_get_empty, \
     (reference_func_t)      hb_##name##_reference, \
     (destroy_func_t)        hb_##name##_destroy, \
     (set_user_data_func_t)  hb_##name##_set_user_data, \
@@ -149,6 +151,7 @@ typedef struct {
   { \
     (create_func_t)         create_##name, \
     (create_func_t)         create_##name##_inert, \
+    (create_func_t)         hb_##name##_get_empty, \
     (reference_func_t)      hb_##name##_reference, \
     (destroy_func_t)        hb_##name##_destroy, \
     (set_user_data_func_t)  hb_##name##_set_user_data, \
@@ -305,6 +308,31 @@ test_object (void)
       g_assert_cmpuint (global_data, ==, 1000-2);
     }
 
+    {
+      data_t data[2] = {{MAGIC0, FALSE}, {MAGIC1, FALSE}};
+
+      g_test_message ("->get_empty()");
+      obj = o->get_empty ();
+      g_assert (obj);
+
+      g_assert (obj == o->reference (obj));
+      o->destroy (obj);
+
+      if (o->is_immutable)
+	g_assert (o->is_immutable (obj));
+
+      g_assert (!o->set_user_data (obj, &key[0], &data[0], free_up0));
+      g_assert (!o->get_user_data (obj, &key[0]));
+
+      o->destroy (obj);
+      o->destroy (obj);
+      o->destroy (obj);
+      o->destroy (obj);
+      o->destroy (obj);
+
+      g_assert (!data[0].freed);
+    }
+
     {
       data_t data[2] = {{MAGIC0, FALSE}, {MAGIC1, FALSE}};
 
@@ -312,6 +340,8 @@ test_object (void)
       obj = o->create_inert ();
       if (!obj)
 	continue;
+      if (obj == o->get_empty ())
+        continue; /* Tested already */
 
       g_assert (obj == o->reference (obj));
       o->destroy (obj);