diff -r eb8667f2faac libinterp/corefcn/ft-text-renderer.cc
--- a/libinterp/corefcn/ft-text-renderer.cc	Thu Jun 30 18:20:37 2016 +1000
+++ b/libinterp/corefcn/ft-text-renderer.cc	Tue Jul 26 18:22:00 2016 +1000
@@ -343,7 +343,7 @@
     : base_text_renderer (), font (), bbox (1, 4, 0.0), halign (0),
       xoffset (0), line_yoffset (0), yoffset (0), mode (MODE_BBOX),
       color (dim_vector (1, 3), 0)
-  { }
+        { ft_manager::instance_ok (); }
 
   ~ft_text_renderer (void) { }
 
diff -r eb8667f2faac libinterp/corefcn/graphics.cc
--- a/libinterp/corefcn/graphics.cc	Thu Jun 30 18:20:37 2016 +1000
+++ b/libinterp/corefcn/graphics.cc	Tue Jul 26 18:22:00 2016 +1000
@@ -1689,7 +1689,78 @@
 
 // Used to cache dummy graphics objects from which dynamic properties can be
 // cloned.
-static std::map<caseless_str, graphics_object> dprop_obj_map;
+class
+dprop_obj_manager
+{
+public:
+  static bool instance_ok (void)
+  {
+    bool retval = true;
+
+    if (! instance)
+      {
+        instance = new dprop_obj_manager ();
+
+        if (instance)
+          singleton_cleanup_list::add (cleanup_instance);
+      }
+
+    if (! instance)
+      error ("unable to create dprop_obj_manager!");
+
+    return retval;
+  }
+
+  static void cleanup_instance (void) { delete instance; instance = 0; }
+
+  static graphics_object find (caseless_str &go_name)
+  {
+    graphics_object retval;
+    
+    if (instance_ok()) 
+      retval = instance->do_find (go_name);
+
+    return retval;
+  }
+
+private:
+  static dprop_obj_manager *instance;
+  
+  typedef std::map<caseless_str, graphics_object>::const_iterator
+  dprop_obj_const_iterator;
+
+  std::map<caseless_str, graphics_object> dprop_obj_map;
+
+  // No copying!
+  dprop_obj_manager (const dprop_obj_manager&);
+  dprop_obj_manager& operator = (const dprop_obj_manager&);
+ 
+  dprop_obj_manager (void) { };
+
+  graphics_object do_find (caseless_str &go_name)
+  {
+     graphics_object retval;
+
+     dprop_obj_const_iterator it = dprop_obj_map.find (go_name);
+
+     if (it == dprop_obj_map.end ())
+       {
+          base_graphics_object *bgo =
+            make_graphics_object_from_type(go_name);
+          if (bgo)
+            {
+              retval = graphics_object(bgo);
+              dprop_obj_map[go_name] = retval;
+            }
+       }
+     else
+       retval = it->second;
+
+     return retval;
+  }
+};
+
+dprop_obj_manager *dprop_obj_manager::instance = 0;
 
 property
 property::create (const std::string& name, const graphics_handle& h,
@@ -1777,25 +1848,7 @@
         error ("addproperty: unsupported type for dynamic property (= %s)",
                type.c_str ());
 
-      graphics_object go;
-
-      std::map<caseless_str, graphics_object>::const_iterator it =
-        dprop_obj_map.find (go_name);
-
-      if (it == dprop_obj_map.end ())
-        {
-          base_graphics_object *bgo =
-            make_graphics_object_from_type (go_name);
-
-          if (bgo)
-            {
-              go = graphics_object (bgo);
-
-              dprop_obj_map[go_name] = go;
-            }
-        }
-      else
-        go = it->second;
+      graphics_object go(dprop_obj_manager::find(go_name));
 
       if (! go.valid_object ())
         error ("addproperty: invalid object type (= %s)",
@@ -10912,6 +10965,9 @@
 @seealso{available_graphics_toolkits}
 @end deftypefn */)
 {
+  // Instantiate a text_renderer first!
+  text_renderer tr;
+  
   gh_manager::auto_lock guard;
 
   if (args.length () != 1)
diff -r eb8667f2faac libinterp/corefcn/graphics.in.h
--- a/libinterp/corefcn/graphics.in.h	Thu Jun 30 18:20:37 2016 +1000
+++ b/libinterp/corefcn/graphics.in.h	Tue Jul 26 18:22:00 2016 +1000
@@ -2316,7 +2316,7 @@
       create_instance ();
 
     if (! instance)
-      error ("unable to create gh_manager!");
+      error ("unable to create gtk_manager!");
 
     return retval;
   }
diff -r eb8667f2faac libinterp/corefcn/interpreter.cc
--- a/libinterp/corefcn/interpreter.cc	Thu Jun 30 18:20:37 2016 +1000
+++ b/libinterp/corefcn/interpreter.cc	Tue Jul 26 18:22:00 2016 +1000
@@ -63,6 +63,7 @@
 #include "pt-jump.h"
 #include "pt-stmt.h"
 #include "sighandlers.h"
+#include "singleton-cleanup.h"
 #include "sysdep.h"
 #include "unwind-prot.h"
 #include "utils.h"
@@ -1057,17 +1058,7 @@
             OCTAVE_SAFE_CALL (flush_octave_stdout, ());
           }
 
-        // Don't call singleton_cleanup_list::cleanup until we have the
-        // problems with registering/unregistering types worked out.  For
-        // example, uncomment the following line, then use the make_int
-        // function from the examples directory to create an integer
-        // object and then exit Octave.  Octave should crash with a
-        // segfault when cleaning up the typinfo singleton.  We need some
-        // way to force new octave_value_X types that are created in
-        // .oct files to be unregistered when the .oct file shared library
-        // is unloaded.
-        //
-        // OCTAVE_SAFE_CALL (singleton_cleanup_list::cleanup, ());
+        OCTAVE_SAFE_CALL (singleton_cleanup_list::cleanup, ());
 
         OCTAVE_SAFE_CALL (octave_chunk_buffer::clear, ());
       }
diff -r eb8667f2faac libinterp/octave-value/ov-typeinfo.h
--- a/libinterp/octave-value/ov-typeinfo.h	Thu Jun 30 18:20:37 2016 +1000
+++ b/libinterp/octave-value/ov-typeinfo.h	Tue Jul 26 18:22:00 2016 +1000
@@ -218,7 +218,19 @@
 
   static octave_value_typeinfo *instance;
 
-  static void cleanup_instance (void) { delete instance; instance = 0; }
+  static void cleanup_instance (void) {
+    // Don't call delete until we have the
+    // problems with registering/unregistering types worked out.  For
+    // example, uncomment the following line, then use the make_int
+    // function from the examples directory to create an integer
+    // object and then exit Octave.  Octave should crash with a
+    // segfault when cleaning up the typeinfo singleton.  We need some
+    // way to force new octave_value_X types that are created in
+    // .oct files to be unregistered when the .oct file shared library
+    // is unloaded.
+    //  
+    //    delete instance; instance = 0;
+  }
 
   int num_types;
 
diff -r eb8667f2faac liboctave/util/singleton-cleanup.cc
--- a/liboctave/util/singleton-cleanup.cc	Thu Jun 30 18:20:37 2016 +1000
+++ b/liboctave/util/singleton-cleanup.cc	Tue Jul 26 18:22:00 2016 +1000
@@ -31,9 +31,10 @@
 
 singleton_cleanup_list::~singleton_cleanup_list (void)
 {
-  for (auto fcnptr : fcn_list)
+  while ( ! fcn_list.empty () )
     {
-      fptr fcn = *fcnptr;
+      fptr fcn = fcn_list.top ();
+      fcn_list.pop ();
 
       fcn ();
     }
diff -r eb8667f2faac liboctave/util/singleton-cleanup.h
--- a/liboctave/util/singleton-cleanup.h	Thu Jun 30 18:20:37 2016 +1000
+++ b/liboctave/util/singleton-cleanup.h	Tue Jul 26 18:22:00 2016 +1000
@@ -3,7 +3,7 @@
 
 #include "octave-config.h"
 
-#include <set>
+#include <stack>
 
 class
 OCTAVE_API
@@ -35,11 +35,11 @@
 
   static void cleanup_instance (void) { delete instance; instance = 0; }
 
-  std::set<fptr> fcn_list;
+  std::stack<fptr> fcn_list;
 
   void do_add (fptr f)
   {
-    fcn_list.insert (f);
+    fcn_list.push (f);
   }
 
   // No copying!
