[gnumeric] GnmFunc: make this a GObject.



commit 8dd9f9c48a8317e3ae6982596a7b7d93faa691e9
Author: Morten Welinder <terra gnome org>
Date:   Thu May 24 21:56:20 2018 -0400

    GnmFunc: make this a GObject.
    
    Change GnmFunc from a boxed type with weird ref-counting to a proper
    GObject with normal ref-counting, but also usage counting.
    
    Function descriptor tables in plugins lose two pointers that almost
    nobody was using: usage notifer (use signal notify::in-use instead) and
    the link notifying (use signal link-dep instead).
    
    There is still room for plenty of cleanup here.

 NEWS                                          |   1 +
 plugins/excelplugins/excelplugins.c           |   2 +-
 plugins/fn-christian-date/functions.c         |  10 +-
 plugins/fn-complex/functions.c                |  90 ++---
 plugins/fn-database/functions.c               |  26 +-
 plugins/fn-date/functions.c                   |  54 +--
 plugins/fn-derivatives/options.c              |  58 +--
 plugins/fn-eng/functions.c                    |  50 +--
 plugins/fn-erlang/functions.c                 |   8 +-
 plugins/fn-financial/functions.c              | 114 +++---
 plugins/fn-hebrew-date/functions.c            |  18 +-
 plugins/fn-info/functions.c                   |  48 +--
 plugins/fn-logical/functions.c                |  20 +-
 plugins/fn-lookup/functions.c                 |  44 +-
 plugins/fn-math/functions.c                   | 196 ++++-----
 plugins/fn-numtheory/numtheory.c              |  28 +-
 plugins/fn-r/functions.c                      | 118 +++---
 plugins/fn-r/generate                         |   2 +-
 plugins/fn-random/functions.c                 |  68 ++--
 plugins/fn-stat/functions.c                   | 222 +++++-----
 plugins/fn-string/functions.c                 |  74 ++--
 plugins/fn-tsa/functions.c                    |  10 +-
 plugins/python-loader/py-gnumeric.c           |   4 +-
 plugins/python-loader/python-loader.c         |  60 +--
 plugins/sample_datasource/sample_datasource.c | 145 +++----
 src/consolidate.c                             |   6 +-
 src/dependent.c                               |  14 +-
 src/dialogs/dialog-function-select.c          |   4 +-
 src/expr.c                                    |  17 +-
 src/func-builtin.c                            | 125 +++---
 src/func.c                                    | 561 +++++++++++++++++---------
 src/func.h                                    |  70 ++--
 src/gnm-marshalers.list                       |   1 +
 src/gnm-plugin.c                              | 162 ++++----
 src/gnm-plugin.h                              |   3 +-
 src/gnumeric-fwd.h                            |   2 +-
 src/gutils.c                                  |   2 +-
 src/sheet.c                                   |   2 +-
 src/tools/analysis-anova.c                    |  80 ++--
 src/tools/analysis-auto-expression.c          |   2 +-
 src/tools/analysis-chi-squared.c              |  18 +-
 src/tools/analysis-exp-smoothing.c            | 124 +++---
 src/tools/analysis-frequency.c                |  28 +-
 src/tools/analysis-histogram.c                |  16 +-
 src/tools/analysis-kaplan-meier.c             |  28 +-
 src/tools/analysis-normality.c                |   8 +-
 src/tools/analysis-one-mean-test.c            |  28 +-
 src/tools/analysis-principal-components.c     |  40 +-
 src/tools/analysis-sign-test.c                |  56 +--
 src/tools/analysis-signed-rank-test.c         |  44 +-
 src/tools/analysis-tools.c                    | 360 +++++++++--------
 src/tools/analysis-wilcoxon-mann-whitney.c    |  44 +-
 src/tools/random-generator-cor.c              |  16 +-
 src/wbc-gtk.c                                 |   2 +-
 src/widgets/gnm-expr-entry.c                  |   6 +-
 src/workbook-view.c                           |  17 +-
 56 files changed, 1793 insertions(+), 1563 deletions(-)
---
diff --git a/NEWS b/NEWS
index 41f0bf4d8..913bec017 100644
--- a/NEWS
+++ b/NEWS
@@ -11,6 +11,7 @@ Morten:
        * Makefile improvements.
        * Don't save any configuration when running ssconvert/ssdiff/...
        * Fix crash-on-exit.
+       * Turn GnmFunc into a GObject.
 
 --------------------------------------------------------------------------
 Gnumeric 1.12.41
diff --git a/plugins/excelplugins/excelplugins.c b/plugins/excelplugins/excelplugins.c
index f3314c12d..c21e16114 100644
--- a/plugins/excelplugins/excelplugins.c
+++ b/plugins/excelplugins/excelplugins.c
@@ -574,7 +574,7 @@ free_xll_function_info (gpointer data)
        XLLFunctionInfo *info= (XLLFunctionInfo *)data;
        const guint n = info->number_of_arguments;
        if (NULL != info->gnm_func) {
-               gnm_func_free (info->gnm_func);
+               g_object_unref (info->gnm_func);
                info->gnm_func = NULL;
        }
        delete_string (&info->category);
diff --git a/plugins/fn-christian-date/functions.c b/plugins/fn-christian-date/functions.c
index 29d6784d6..506727ffd 100644
--- a/plugins/fn-christian-date/functions.c
+++ b/plugins/fn-christian-date/functions.c
@@ -229,27 +229,27 @@ gnumeric_ascensionthursday (GnmFuncEvalInfo * ei, GnmValue const * const *argv)
 
 GnmFuncDescriptor const christian_datetime_functions[] = {
        {"ascensionthursday", "|f", help_ascensionthursday,
-        gnumeric_ascensionthursday, NULL, NULL, NULL,
+        gnumeric_ascensionthursday, NULL,
         GNM_FUNC_VOLATILE + GNM_FUNC_AUTO_DATE,
         GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC,
         GNM_FUNC_TEST_STATUS_NO_TESTSUITE},
        {"ashwednesday", "|f", help_ashwednesday,
-        gnumeric_ashwednesday, NULL, NULL, NULL,
+        gnumeric_ashwednesday, NULL,
         GNM_FUNC_VOLATILE + GNM_FUNC_AUTO_DATE,
         GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC,
         GNM_FUNC_TEST_STATUS_NO_TESTSUITE},
        {"eastersunday", "|f", help_eastersunday,
-        gnumeric_eastersunday, NULL, NULL, NULL,
+        gnumeric_eastersunday, NULL,
         GNM_FUNC_VOLATILE + GNM_FUNC_AUTO_DATE,
         GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC,
         GNM_FUNC_TEST_STATUS_NO_TESTSUITE},
        {"goodfriday", "|f", help_goodfriday,
-        gnumeric_goodfriday, NULL, NULL, NULL,
+        gnumeric_goodfriday, NULL,
         GNM_FUNC_VOLATILE + GNM_FUNC_AUTO_DATE,
         GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC,
         GNM_FUNC_TEST_STATUS_NO_TESTSUITE},
        {"pentecostsunday", "|f", help_pentecostsunday,
-        gnumeric_pentecostsunday, NULL, NULL, NULL,
+        gnumeric_pentecostsunday, NULL,
         GNM_FUNC_VOLATILE + GNM_FUNC_AUTO_DATE,
         GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC,
         GNM_FUNC_TEST_STATUS_NO_TESTSUITE},
diff --git a/plugins/fn-complex/functions.c b/plugins/fn-complex/functions.c
index 936e4fdb4..2a7fcef38 100644
--- a/plugins/fn-complex/functions.c
+++ b/plugins/fn-complex/functions.c
@@ -1268,141 +1268,141 @@ gnumeric_imsum (GnmFuncEvalInfo *ei, int argc, GnmExprConstPtr const *argv)
 
 GnmFuncDescriptor const complex_functions[] = {
        { "complex",     "ff|s",  help_complex,
-         gnumeric_complex, NULL, NULL, NULL,
+         gnumeric_complex, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "imabs",       "S",     help_imabs,
-         gnumeric_imabs, NULL, NULL, NULL,
+         gnumeric_imabs, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
        { "imaginary",   "S",     help_imaginary,
-         gnumeric_imaginary, NULL, NULL, NULL,
+         gnumeric_imaginary, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "imargument",  "S",     help_imargument,
-         gnumeric_imargument, NULL, NULL, NULL,
+         gnumeric_imargument, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
        { "imconjugate", "S",     help_imconjugate,
-         gnumeric_imconjugate, NULL, NULL, NULL,
+         gnumeric_imconjugate, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "imcos",       "S",     help_imcos,
-         gnumeric_imcos, NULL, NULL, NULL,
+         gnumeric_imcos, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
        { "imdiv",       "SS",    help_imdiv,
-         gnumeric_imdiv, NULL, NULL, NULL,
+         gnumeric_imdiv, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "imexp",       "S",     help_imexp,
-         gnumeric_imexp, NULL, NULL, NULL,
+         gnumeric_imexp, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
        { "imln",        "S",     help_imln,
-         gnumeric_imln, NULL, NULL, NULL,
+         gnumeric_imln, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
        { "imlog10",     "S",     help_imlog10,
-         gnumeric_imlog10, NULL, NULL, NULL,
+         gnumeric_imlog10, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
        { "imlog2",      "S",     help_imlog2,
-         gnumeric_imlog2, NULL, NULL, NULL,
+         gnumeric_imlog2, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
        { "impower",     "SS",    help_impower,
-         gnumeric_impower, NULL, NULL, NULL,
+         gnumeric_impower, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
        { "imreal",      "S",     help_imreal,
-         gnumeric_imreal, NULL, NULL, NULL,
+         gnumeric_imreal, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "imsin",       "S",     help_imsin,
-         gnumeric_imsin, NULL, NULL, NULL,
+         gnumeric_imsin, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
        { "imsqrt",      "S",     help_imsqrt,
-         gnumeric_imsqrt, NULL, NULL, NULL,
+         gnumeric_imsqrt, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
        { "imsub",       "SS",    help_imsub,
-         gnumeric_imsub, NULL, NULL, NULL,
+         gnumeric_imsub, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "imsum",       NULL,    help_imsum,
-         NULL, gnumeric_imsum, NULL, NULL,
+         NULL, gnumeric_imsum,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
 
        { "iminv",   "S",     help_iminv,
-         gnumeric_iminv, NULL, NULL, NULL,
+         gnumeric_iminv, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_NO_TESTSUITE },
        { "imneg",   "S",     help_imneg,
-         gnumeric_imneg, NULL, NULL, NULL,
+         gnumeric_imneg, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "imtan",       "S",     help_imtan,
-         gnumeric_imtan, NULL, NULL, NULL,
+         gnumeric_imtan, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
        { "improduct",   NULL,    help_improduct,
-         NULL, gnumeric_improduct, NULL, NULL,
+         NULL, gnumeric_improduct,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "imsec",       "S",     help_imsec,
-         gnumeric_imsec, NULL, NULL, NULL,
+         gnumeric_imsec, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
        { "imcsc",       "S",     help_imcsc,
-         gnumeric_imcsc, NULL, NULL, NULL,
+         gnumeric_imcsc, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
        { "imcot",       "S",     help_imcot,
-         gnumeric_imcot, NULL, NULL, NULL,
+         gnumeric_imcot, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
        { "imsinh",       "S",    help_imsinh,
-         gnumeric_imsinh, NULL, NULL, NULL,
+         gnumeric_imsinh, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
        { "imcosh",       "S",    help_imcosh,
-         gnumeric_imcosh, NULL, NULL, NULL,
+         gnumeric_imcosh, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
        { "imtanh",       "S",    help_imtanh,
-         gnumeric_imtanh, NULL, NULL, NULL,
+         gnumeric_imtanh, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
        { "imsech",       "S",    help_imsech,
-         gnumeric_imsech, NULL, NULL, NULL,
+         gnumeric_imsech, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
        { "imcsch",       "S",    help_imcsch,
-         gnumeric_imcsch, NULL, NULL, NULL,
+         gnumeric_imcsch, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
        { "imcoth",       "S",    help_imcoth,
-         gnumeric_imcoth, NULL, NULL, NULL,
+         gnumeric_imcoth, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
        { "imarcsin",     "S",    help_imarcsin,
-         gnumeric_imarcsin, NULL, NULL, NULL,
+         gnumeric_imarcsin, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
        { "imarccos",     "S",    help_imarccos,
-         gnumeric_imarccos, NULL, NULL, NULL,
+         gnumeric_imarccos, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
        { "imarctan",     "S",    help_imarctan,
-         gnumeric_imarctan, NULL, NULL, NULL,
+         gnumeric_imarctan, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
        { "imarcsec",     "S",    help_imarcsec,
-         gnumeric_imarcsec, NULL, NULL, NULL,
+         gnumeric_imarcsec, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
        { "imarccsc",     "S",    help_imarccsc,
-         gnumeric_imarccsc, NULL, NULL, NULL,
+         gnumeric_imarccsc, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
        { "imarccot",     "S",    help_imarccot,
-         gnumeric_imarccot, NULL, NULL, NULL,
+         gnumeric_imarccot, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
        { "imarcsinh",    "S",    help_imarcsinh,
-         gnumeric_imarcsinh, NULL, NULL, NULL,
+         gnumeric_imarcsinh, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
        { "imarccosh",    "S",    help_imarccosh,
-         gnumeric_imarccosh, NULL, NULL, NULL,
+         gnumeric_imarccosh, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
        { "imarctanh",    "S",    help_imarctanh,
-         gnumeric_imarctanh, NULL, NULL, NULL,
+         gnumeric_imarctanh, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
        { "imarcsech",    "S",    help_imarcsech,
-         gnumeric_imarcsech, NULL, NULL, NULL,
+         gnumeric_imarcsech, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
        { "imarccsch",    "S",    help_imarccsch,
-         gnumeric_imarccsch, NULL, NULL, NULL,
+         gnumeric_imarccsch, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
        { "imarccoth",    "S",    help_imarccoth,
-         gnumeric_imarccoth, NULL, NULL, NULL,
+         gnumeric_imarccoth, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
 
        { "imfact",       "S",    help_imfact,
-         gnumeric_imfact, NULL, NULL, NULL,
+         gnumeric_imfact, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
        { "imgamma",      "S",    help_imgamma,
-         gnumeric_imgamma, NULL, NULL, NULL,
+         gnumeric_imgamma, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
        { "imigamma",     "SS|bb",  help_imigamma,
-         gnumeric_imigamma, NULL, NULL, NULL,
+         gnumeric_imigamma, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_NO_TESTSUITE },
 
        {NULL}
diff --git a/plugins/fn-database/functions.c b/plugins/fn-database/functions.c
index 84f800c98..9445170cb 100644
--- a/plugins/fn-database/functions.c
+++ b/plugins/fn-database/functions.c
@@ -807,45 +807,45 @@ gnumeric_getpivotdata (GnmFuncEvalInfo *ei, GnmValue const * const *argv)
 
 const GnmFuncDescriptor database_functions[] = {
        { "daverage", "rSr",
-         help_daverage,   gnumeric_daverage, NULL, NULL, NULL,
+         help_daverage,   gnumeric_daverage, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
        { "dcount",   "rSr",
-         help_dcount,     gnumeric_dcount, NULL, NULL, NULL,
+         help_dcount,     gnumeric_dcount, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
        { "dcounta",  "rSr",
-         help_dcounta,    gnumeric_dcounta, NULL, NULL, NULL,
+         help_dcounta,    gnumeric_dcounta, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
        { "dget",     "rSr",
-         help_dget,       gnumeric_dget, NULL, NULL, NULL,
+         help_dget,       gnumeric_dget, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
        { "dmax",     "rSr",
-         help_dmax,       gnumeric_dmax, NULL, NULL, NULL,
+         help_dmax,       gnumeric_dmax, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
        { "dmin",     "rSr",
-         help_dmin,       gnumeric_dmin, NULL, NULL, NULL,
+         help_dmin,       gnumeric_dmin, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
        { "dproduct", "rSr",
-         help_dproduct,   gnumeric_dproduct, NULL, NULL, NULL,
+         help_dproduct,   gnumeric_dproduct, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
        { "dstdev",   "rSr",
-         help_dstdev,     gnumeric_dstdev, NULL, NULL, NULL,
+         help_dstdev,     gnumeric_dstdev, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
        { "dstdevp",  "rSr",
-         help_dstdevp,    gnumeric_dstdevp, NULL, NULL, NULL,
+         help_dstdevp,    gnumeric_dstdevp, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
        { "dsum",     "rSr",
-         help_dsum,       gnumeric_dsum, NULL, NULL, NULL,
+         help_dsum,       gnumeric_dsum, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
        { "dvar",     "rSr",
-         help_dvar,       gnumeric_dvar, NULL, NULL, NULL,
+         help_dvar,       gnumeric_dvar, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
        { "dvarp",    "rSr",
-         help_dvarp,      gnumeric_dvarp, NULL, NULL, NULL,
+         help_dvarp,      gnumeric_dvarp, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
 
 /* XL stores in lookup */
        { "getpivotdata", "rs",
-         help_getpivotdata, gnumeric_getpivotdata, NULL, NULL, NULL,
+         help_getpivotdata, gnumeric_getpivotdata, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_SUBSET, GNM_FUNC_TEST_STATUS_NO_TESTSUITE },
 
         {NULL}
diff --git a/plugins/fn-date/functions.c b/plugins/fn-date/functions.c
index fb8c4dc43..0917c7388 100644
--- a/plugins/fn-date/functions.c
+++ b/plugins/fn-date/functions.c
@@ -1416,112 +1416,112 @@ gnumeric_days (GnmFuncEvalInfo *ei, GnmValue const * const *argv)
 
 GnmFuncDescriptor const datetime_functions[] = {
        { "date",        "fff",   help_date,
-         gnumeric_date, NULL, NULL, NULL,
+         gnumeric_date, NULL,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_DATE,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "datevalue",   "f",     help_datevalue,
-         gnumeric_datevalue, NULL, NULL, NULL,
+         gnumeric_datevalue, NULL,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_UNITLESS,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "datedif",     "ffs",   help_datedif,
-         gnumeric_datedif, NULL, NULL, NULL,
+         gnumeric_datedif, NULL,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_UNITLESS,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "day",         "f",     help_day,
-         gnumeric_day, NULL, NULL, NULL,
+         gnumeric_day, NULL,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_UNITLESS,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "days360",     "ff|f",  help_days360,
-         gnumeric_days360, NULL, NULL, NULL,
+         gnumeric_days360, NULL,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_UNITLESS,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "edate",       "ff",    help_edate,
-         gnumeric_edate, NULL, NULL, NULL,
+         gnumeric_edate, NULL,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_DATE,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "eomonth",     "f|f",   help_eomonth,
-         gnumeric_eomonth, NULL, NULL, NULL,
+         gnumeric_eomonth, NULL,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_DATE,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "hour",        "f",     help_hour,
-         gnumeric_hour, NULL, NULL, NULL,
+         gnumeric_hour, NULL,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_UNITLESS,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "minute",      "f",     help_minute,
-         gnumeric_minute, NULL, NULL, NULL,
+         gnumeric_minute, NULL,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_UNITLESS,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "month",       "f",     help_month,
-         gnumeric_month, NULL, NULL, NULL,
+         gnumeric_month, NULL,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_UNITLESS,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "networkdays", "ff|?A",
-         help_networkdays, gnumeric_networkdays, NULL, NULL, NULL,
+         help_networkdays, gnumeric_networkdays, NULL,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_UNITLESS,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "now",         "", help_now,
-         gnumeric_now, NULL, NULL, NULL,
+         gnumeric_now, NULL,
          GNM_FUNC_VOLATILE + GNM_FUNC_AUTO_TIME,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "odf.time",        "fff",   help_odf_time,
-         gnumeric_odf_time, NULL, NULL, NULL,
+         gnumeric_odf_time, NULL,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_TIME,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_NO_TESTSUITE },
        { "second",      "f",     help_second,
-         gnumeric_second, NULL, NULL, NULL,
+         gnumeric_second, NULL,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_UNITLESS,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "time",        "fff",   help_time,
-         gnumeric_time, NULL, NULL, NULL,
+         gnumeric_time, NULL,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_TIME,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "timevalue",   "f",     help_timevalue,
-         gnumeric_timevalue, NULL, NULL, NULL,
+         gnumeric_timevalue, NULL,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_UNITLESS,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "today",       "", help_today,
-         gnumeric_today, NULL, NULL, NULL,
+         gnumeric_today, NULL,
          GNM_FUNC_VOLATILE + GNM_FUNC_AUTO_DATE,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "weekday",     "f|f",   help_weekday,
-         gnumeric_weekday, NULL, NULL, NULL,
+         gnumeric_weekday, NULL,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_UNITLESS,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "weeknum",     "f|f",   help_weeknum,
-         gnumeric_weeknum, NULL, NULL, NULL,
+         gnumeric_weeknum, NULL,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_UNITLESS,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "workday",     "ff|?A",  help_workday,
-         gnumeric_workday, NULL, NULL, NULL,
+         gnumeric_workday, NULL,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_DATE,
          GNM_FUNC_IMPL_STATUS_SUBSET, GNM_FUNC_TEST_STATUS_BASIC },
        { "year",        "f",     help_year,
-         gnumeric_year, NULL, NULL, NULL,
+         gnumeric_year, NULL,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_UNITLESS,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "yearfrac",   "ff|f",     help_yearfrac,
-         gnumeric_yearfrac, NULL, NULL, NULL,
+         gnumeric_yearfrac, NULL,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_UNITLESS,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_NO_TESTSUITE },
 
        { "unix2date",   "f",     help_unix2date,
-         gnumeric_unix2date, NULL, NULL, NULL,
+         gnumeric_unix2date, NULL,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_DATE,
          GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_NO_TESTSUITE },
        { "date2unix",   "f",     help_date2unix,
-         gnumeric_date2unix, NULL, NULL, NULL,
+         gnumeric_date2unix, NULL,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_UNITLESS,
          GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_NO_TESTSUITE },
        { "isoweeknum",  "f",     help_isoweeknum,
-         gnumeric_isoweeknum, NULL, NULL, NULL,
+         gnumeric_isoweeknum, NULL,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_UNITLESS,
          GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_NO_TESTSUITE },
        { "isoyear",     "f",     help_isoyear,
-         gnumeric_isoyear, NULL, NULL, NULL,
+         gnumeric_isoyear, NULL,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_UNITLESS,
          GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_NO_TESTSUITE },
        { "days", "ff",
-         help_days, gnumeric_days, NULL, NULL, NULL,
+         help_days, gnumeric_days, NULL,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_UNITLESS,
          GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_NO_TESTSUITE },
         {NULL}
diff --git a/plugins/fn-derivatives/options.c b/plugins/fn-derivatives/options.c
index 2446b257d..0f6d3049f 100644
--- a/plugins/fn-derivatives/options.c
+++ b/plugins/fn-derivatives/options.c
@@ -1971,148 +1971,148 @@ static GnmFuncHelp const help_opt_binomial[] = {
 GnmFuncDescriptor const derivatives_functions [] = {
        { "opt_bs",
          "sfffff|f",
-         help_opt_bs, opt_bs, NULL, NULL, NULL,
+         help_opt_bs, opt_bs, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_BASIC },
 
        { "opt_bs_delta",
          "sfffff|f",
-         help_opt_bs_delta, opt_bs_delta, NULL, NULL, NULL,
+         help_opt_bs_delta, opt_bs_delta, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_BASIC },
 
        { "opt_bs_rho",
          "sfffff|f",
-         help_opt_bs_rho, opt_bs_rho, NULL, NULL, NULL,
+         help_opt_bs_rho, opt_bs_rho, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_BASIC },
 
        { "opt_bs_theta",
          "sfffff|f",
-         help_opt_bs_theta, opt_bs_theta, NULL, NULL, NULL,
+         help_opt_bs_theta, opt_bs_theta, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_BASIC },
 
        { "opt_bs_gamma",
          "fffff|f",
-         help_opt_bs_gamma, opt_bs_gamma, NULL, NULL, NULL,
+         help_opt_bs_gamma, opt_bs_gamma, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_BASIC },
 
        { "opt_bs_vega",
          "fffff|f",
-         help_opt_bs_vega, opt_bs_vega, NULL, NULL, NULL,
+         help_opt_bs_vega, opt_bs_vega, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_BASIC },
 
        { "opt_bs_carrycost",
          "sfffff|f",
-         help_opt_bs_carrycost, opt_bs_carrycost, NULL, NULL, NULL,
+         help_opt_bs_carrycost, opt_bs_carrycost, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_BASIC },
 
        { "cum_biv_norm_dist",
          "fff",
-         help_cum_biv_norm_dist, cum_biv_norm_dist, NULL, NULL, NULL,
+         help_cum_biv_norm_dist, cum_biv_norm_dist, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_NO_TESTSUITE },
 
        { "opt_garman_kohlhagen",
          "sffffff",
-         help_opt_garman_kohlhagen, opt_garman_kohlhagen, NULL, NULL, NULL,
+         help_opt_garman_kohlhagen, opt_garman_kohlhagen, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_BASIC },
 
        { "opt_french",
          "sfffffff",
-         help_opt_french, opt_french, NULL, NULL, NULL,
+         help_opt_french, opt_french, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_BASIC },
 
        { "opt_jump_diff",
          "sfffffff",
-         help_opt_jump_diff, opt_jump_diff, NULL, NULL, NULL,
+         help_opt_jump_diff, opt_jump_diff, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_BASIC },
 
        { "opt_exec",
          "sfffffff",
-         help_opt_exec, opt_exec, NULL, NULL, NULL,
+         help_opt_exec, opt_exec, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_BASIC },
 
        { "opt_bjer_stens",
          "sffffff",
-         help_opt_bjer_stens, opt_bjer_stens, NULL, NULL, NULL,
+         help_opt_bjer_stens, opt_bjer_stens, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_BASIC },
 
        { "opt_miltersen_schwartz",
          "sfffffffffffff",
-         help_opt_miltersen_schwartz, opt_miltersen_schwartz, NULL, NULL, NULL,
+         help_opt_miltersen_schwartz, opt_miltersen_schwartz, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_BASIC },
 
        { "opt_baw_amer",
          "sffffff",
-         help_opt_baw_amer, opt_baw_amer, NULL, NULL, NULL,
+         help_opt_baw_amer, opt_baw_amer, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_BASIC },
 
        { "opt_rgw",
          "fffffff",
-         help_opt_rgw, opt_rgw, NULL, NULL, NULL,
+         help_opt_rgw, opt_rgw, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_BASIC },
 
        { "opt_forward_start",
          "sfffffff",
-         help_opt_forward_start, opt_forward_start, NULL, NULL, NULL,
+         help_opt_forward_start, opt_forward_start, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_BASIC },
 
        { "opt_time_switch",
          "sfffffffff",
-         help_opt_time_switch, opt_time_switch, NULL, NULL, NULL,
+         help_opt_time_switch, opt_time_switch, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_BASIC },
 
        { "opt_simple_chooser",
          "fffffff",
-         help_opt_simple_chooser, opt_simple_chooser, NULL, NULL, NULL,
+         help_opt_simple_chooser, opt_simple_chooser, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_BASIC },
 
        { "opt_complex_chooser",
          "fffffffff",
-         help_opt_complex_chooser, opt_complex_chooser, NULL, NULL, NULL,
+         help_opt_complex_chooser, opt_complex_chooser, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_BASIC },
 
        { "opt_on_options",
          "sffffffff",
-         help_opt_on_options, opt_on_options, NULL, NULL, NULL,
+         help_opt_on_options, opt_on_options, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_BASIC },
 
        { "opt_extendible_writer",
          "sffffffff",
-         help_opt_extendible_writer, opt_extendible_writer, NULL, NULL, NULL,
+         help_opt_extendible_writer, opt_extendible_writer, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_BASIC },
 
        { "opt_2_asset_correlation",
          "sfffffffffff",
-         help_opt_2_asset_correlation, opt_2_asset_correlation, NULL, NULL, NULL,
+         help_opt_2_asset_correlation, opt_2_asset_correlation, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_BASIC },
 
        { "opt_euro_exchange",
          "fffffffffff",
-         help_opt_euro_exchange, opt_euro_exchange, NULL, NULL, NULL,
+         help_opt_euro_exchange, opt_euro_exchange, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_BASIC },
 
        { "opt_amer_exchange",
          "fffffffffff",
-         help_opt_amer_exchange, opt_amer_exchange, NULL, NULL, NULL,
+         help_opt_amer_exchange, opt_amer_exchange, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_BASIC },
 
        { "opt_spread_approx",
          "sffffffff",
-         help_opt_spread_approx, opt_spread_approx, NULL, NULL, NULL,
+         help_opt_spread_approx, opt_spread_approx, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_BASIC },
 
        { "opt_float_strk_lkbk",
          "sfffffff",
-         help_opt_float_strk_lkbk, opt_float_strk_lkbk, NULL, NULL, NULL,
+         help_opt_float_strk_lkbk, opt_float_strk_lkbk, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_BASIC },
 
        { "opt_fixed_strk_lkbk",
          "sffffffff",
-         help_opt_fixed_strk_lkbk, opt_fixed_strk_lkbk, NULL, NULL, NULL,
+         help_opt_fixed_strk_lkbk, opt_fixed_strk_lkbk, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_BASIC },
 
 
        { "opt_binomial",
          "ssffffff|f",
-         help_opt_binomial, opt_binomial, NULL, NULL, NULL,
+         help_opt_binomial, opt_binomial, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_BASIC },
 
        { NULL}
diff --git a/plugins/fn-eng/functions.c b/plugins/fn-eng/functions.c
index c00c4a6fd..e307bc817 100644
--- a/plugins/fn-eng/functions.c
+++ b/plugins/fn-eng/functions.c
@@ -1593,88 +1593,88 @@ gnumeric_invsuminv (GnmFuncEvalInfo *ei, int argc, GnmExprConstPtr const *argv)
 
 GnmFuncDescriptor const engineering_functions[] = {
         { "base",     "Sf|f",    help_base,
-         gnumeric_base, NULL, NULL, NULL,
+         gnumeric_base, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_NO_TESTSUITE },
 
         { "besseli",     "ff",    help_besseli,
-         gnumeric_besseli, NULL, NULL, NULL,
+         gnumeric_besseli, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
         { "besselj",     "ff",    help_besselj,
-         gnumeric_besselj, NULL, NULL, NULL,
+         gnumeric_besselj, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
         { "besselk",     "ff",    help_besselk,
-         gnumeric_besselk, NULL, NULL, NULL,
+         gnumeric_besselk, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
         { "bessely",     "ff",    help_bessely,
-         gnumeric_bessely, NULL, NULL, NULL,
+         gnumeric_bessely, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
 
         { "bin2dec",     "S",     help_bin2dec,
-         gnumeric_bin2dec, NULL, NULL, NULL,
+         gnumeric_bin2dec, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
         { "bin2hex",     "S|f",   help_bin2hex,
-         gnumeric_bin2hex, NULL, NULL, NULL,
+         gnumeric_bin2hex, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
         { "bin2oct",     "S|f",   help_bin2oct,
-         gnumeric_bin2oct, NULL, NULL, NULL,
+         gnumeric_bin2oct, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
 
         { "convert",     "fss",   help_convert,
-         gnumeric_convert, NULL, NULL, NULL,
+         gnumeric_convert, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
         { "dec2bin",     "S|f",   help_dec2bin,
-         gnumeric_dec2bin, NULL, NULL, NULL,
+         gnumeric_dec2bin, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
         { "dec2oct",     "S|f",   help_dec2oct,
-         gnumeric_dec2oct, NULL, NULL, NULL,
+         gnumeric_dec2oct, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
         { "dec2hex",     "S|f",   help_dec2hex,
-         gnumeric_dec2hex, NULL, NULL, NULL,
+         gnumeric_dec2hex, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
         { "decimal",     "Sf",    help_decimal,
-         gnumeric_decimal, NULL, NULL, NULL,
+         gnumeric_decimal, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_NO_TESTSUITE },
 
         { "delta",       "f|f",   help_delta,
-         gnumeric_delta, NULL, NULL, NULL,
+         gnumeric_delta, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
         { "erf",         "f|f",   help_erf,
-         gnumeric_erf , NULL, NULL, NULL,
+         gnumeric_erf , NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
         { "erfc",        "f",     help_erfc,
-         gnumeric_erfc, NULL, NULL, NULL,
+         gnumeric_erfc, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
 
         { "gestep",      "f|f",   help_gestep,
-         gnumeric_gestep, NULL, NULL, NULL,
+         gnumeric_gestep, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
 
         { "hex2bin",     "S|f",   help_hex2bin,
-         gnumeric_hex2bin, NULL, NULL, NULL,
+         gnumeric_hex2bin, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
         { "hex2dec",     "S",     help_hex2dec,
-         gnumeric_hex2dec, NULL, NULL, NULL,
+         gnumeric_hex2dec, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
         { "hex2oct",     "S|f",   help_hex2oct,
-         gnumeric_hex2oct, NULL, NULL, NULL,
+         gnumeric_hex2oct, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
 
         { "hexrep",     "f",   help_hexrep,
-         gnumeric_hexrep, NULL, NULL, NULL,
+         gnumeric_hexrep, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_NO_TESTSUITE },
 
        { "invsuminv",    NULL,            help_invsuminv,
-         NULL, gnumeric_invsuminv, NULL, NULL,
+         NULL, gnumeric_invsuminv,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_NO_TESTSUITE },
 
         { "oct2bin",     "S|f",   help_oct2bin,
-         gnumeric_oct2bin, NULL, NULL, NULL,
+         gnumeric_oct2bin, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
         { "oct2dec",     "S",     help_oct2dec,
-         gnumeric_oct2dec, NULL, NULL, NULL,
+         gnumeric_oct2dec, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
         { "oct2hex",     "S|f",   help_oct2hex,
-         gnumeric_oct2hex, NULL, NULL, NULL,
+         gnumeric_oct2hex, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
 
         {NULL}
diff --git a/plugins/fn-erlang/functions.c b/plugins/fn-erlang/functions.c
index 3f20a987a..88aabfb7d 100644
--- a/plugins/fn-erlang/functions.c
+++ b/plugins/fn-erlang/functions.c
@@ -284,22 +284,22 @@ gnumeric_offcap (GnmFuncEvalInfo *ei, GnmValue const * const *argv)
 
 GnmFuncDescriptor const erlang_functions[] = {
        { "probblock",        "ff",   help_probblock,
-         gnumeric_probblock, NULL, NULL, NULL,
+         gnumeric_probblock, NULL,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_PERCENT,
          GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC,
          GNM_FUNC_TEST_STATUS_NO_TESTSUITE },
        { "offtraf",        "ff",   help_offtraf,
-         gnumeric_offtraf, NULL, NULL, NULL,
+         gnumeric_offtraf, NULL,
          GNM_FUNC_SIMPLE,
          GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC,
          GNM_FUNC_TEST_STATUS_NO_TESTSUITE },
        { "dimcirc",        "ff",   help_dimcirc,
-         gnumeric_dimcirc, NULL, NULL, NULL,
+         gnumeric_dimcirc, NULL,
          GNM_FUNC_SIMPLE,
          GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC,
          GNM_FUNC_TEST_STATUS_NO_TESTSUITE },
        { "offcap",        "ff",   help_offcap,
-         gnumeric_offcap, NULL, NULL, NULL,
+         gnumeric_offcap, NULL,
          GNM_FUNC_SIMPLE,
          GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC,
          GNM_FUNC_TEST_STATUS_NO_TESTSUITE },
diff --git a/plugins/fn-financial/functions.c b/plugins/fn-financial/functions.c
index 4fff02df2..75ac9cee3 100644
--- a/plugins/fn-financial/functions.c
+++ b/plugins/fn-financial/functions.c
@@ -3322,211 +3322,211 @@ gnumeric_vdb (GnmFuncEvalInfo *ei, GnmValue const * const *argv)
 
 GnmFuncDescriptor const financial_functions[] = {
        { "accrint", "ffff|fffb",
-         help_accrint, gnumeric_accrint, NULL, NULL, NULL,
+         help_accrint, gnumeric_accrint, NULL,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_MONETARY,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "accrintm", "fff|ff",
-         help_accrintm, gnumeric_accrintm, NULL, NULL, NULL,
+         help_accrintm, gnumeric_accrintm, NULL,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_MONETARY,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "amordegrc", "fffffff",
-         help_amordegrc, gnumeric_amordegrc, NULL, NULL, NULL,
+         help_amordegrc, gnumeric_amordegrc, NULL,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_MONETARY,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "amorlinc", "fffffff",
-         help_amorlinc, gnumeric_amorlinc, NULL, NULL, NULL,
+         help_amorlinc, gnumeric_amorlinc, NULL,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_MONETARY,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "coupdaybs", "fff|fb",
-         help_coupdaybs, gnumeric_coupdaybs, NULL, NULL, NULL,
+         help_coupdaybs, gnumeric_coupdaybs, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "coupdays", "fff|fb",
-         help_coupdays, gnumeric_coupdays, NULL, NULL, NULL,
+         help_coupdays, gnumeric_coupdays, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "coupdaysnc", "fff|fb",
-         help_coupdaysnc, gnumeric_coupdaysnc, NULL, NULL, NULL,
+         help_coupdaysnc, gnumeric_coupdaysnc, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "coupncd", "fff|fb",
-         help_coupncd, gnumeric_coupncd, NULL, NULL, NULL,
+         help_coupncd, gnumeric_coupncd, NULL,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_DATE,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "coupnum", "fff|fb",
-         help_coupnum, gnumeric_coupnum, NULL, NULL, NULL,
+         help_coupnum, gnumeric_coupnum, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "couppcd", "fff|fb",
-         help_couppcd, gnumeric_couppcd, NULL, NULL, NULL,
+         help_couppcd, gnumeric_couppcd, NULL,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_DATE,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "cumipmt", "ffffff",
-         help_cumipmt, gnumeric_cumipmt, NULL, NULL, NULL,
+         help_cumipmt, gnumeric_cumipmt, NULL,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_MONETARY,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "cumprinc", "ffffff",
-         help_cumprinc, gnumeric_cumprinc, NULL, NULL, NULL,
+         help_cumprinc, gnumeric_cumprinc, NULL,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_MONETARY,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "db", "ffff|f",
-         help_db, gnumeric_db, NULL, NULL, NULL,
+         help_db, gnumeric_db, NULL,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_MONETARY,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "ddb", "ffff|f",
-         help_ddb, gnumeric_ddb, NULL, NULL, NULL,
+         help_ddb, gnumeric_ddb, NULL,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_MONETARY,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "disc", "ffff|f",
-         help_disc, gnumeric_disc, NULL, NULL, NULL,
+         help_disc, gnumeric_disc, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "dollarde", "ff",
-         help_dollarde, gnumeric_dollarde, NULL, NULL, NULL,
+         help_dollarde, gnumeric_dollarde, NULL,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_MONETARY,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "dollarfr", "ff",
-         help_dollarfr, gnumeric_dollarfr, NULL, NULL, NULL,
+         help_dollarfr, gnumeric_dollarfr, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "duration", "fffff|f",
-         help_duration, gnumeric_duration, NULL, NULL, NULL,
+         help_duration, gnumeric_duration, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "effect", "ff",
-         help_effect,    gnumeric_effect, NULL, NULL, NULL,
+         help_effect,    gnumeric_effect, NULL,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_PERCENT,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "euro", "s",
-         help_euro,      gnumeric_euro, NULL, NULL, NULL,
+         help_euro,      gnumeric_euro, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_BASIC },
        { "euroconvert", "fss|bf",
-         help_euroconvert, gnumeric_euroconvert, NULL, NULL, NULL,
+         help_euroconvert, gnumeric_euroconvert, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "fv", "fff|ff",
-         help_fv,        gnumeric_fv, NULL, NULL, NULL,
+         help_fv,        gnumeric_fv, NULL,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_MONETARY,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "fvschedule", "fA",
-         help_fvschedule, gnumeric_fvschedule, NULL, NULL, NULL,
+         help_fvschedule, gnumeric_fvschedule, NULL,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_MONETARY,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "g_duration", "fff",
-         help_g_duration, gnumeric_g_duration, NULL, NULL, NULL,
+         help_g_duration, gnumeric_g_duration, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_BASIC },
        { "intrate", "ffff|f",
-         help_intrate,  gnumeric_intrate, NULL, NULL, NULL,
+         help_intrate,  gnumeric_intrate, NULL,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_PERCENT,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "ipmt", "ffff|ff",
-         help_ipmt,      gnumeric_ipmt, NULL, NULL, NULL,
+         help_ipmt,      gnumeric_ipmt, NULL,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_MONETARY,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "irr", "A|f",
-         help_irr,       gnumeric_irr, NULL, NULL, NULL,
+         help_irr,       gnumeric_irr, NULL,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_PERCENT,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "ispmt", "ffff",
-         help_ispmt,   gnumeric_ispmt, NULL, NULL, NULL,
+         help_ispmt,   gnumeric_ispmt, NULL,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_MONETARY,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "mduration", "fffff|f",
-         help_mduration, gnumeric_mduration, NULL, NULL, NULL,
+         help_mduration, gnumeric_mduration, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "mirr", "Aff",
-         help_mirr,      gnumeric_mirr, NULL, NULL, NULL,
+         help_mirr,      gnumeric_mirr, NULL,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_PERCENT,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "nominal", "ff",
-         help_nominal,  gnumeric_nominal, NULL, NULL, NULL,
+         help_nominal,  gnumeric_nominal, NULL,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_PERCENT,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "nper", "fff|ff",
-         help_nper,      gnumeric_nper, NULL, NULL, NULL,
+         help_nper,      gnumeric_nper, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "npv", NULL,
-         help_npv,       NULL, gnumeric_npv, NULL, NULL,
+         help_npv,       NULL, gnumeric_npv,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_MONETARY,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "oddfprice", "fffffffff",
-         help_oddfprice,  gnumeric_oddfprice, NULL, NULL, NULL,
+         help_oddfprice,  gnumeric_oddfprice, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
 
        { "oddfyield", "fffffffff",
-         help_oddfyield,  gnumeric_oddfyield, NULL, NULL, NULL,
+         help_oddfyield,  gnumeric_oddfyield, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
 
        { "oddlprice", "ffffffff",
-         help_oddlprice,  gnumeric_oddlprice, NULL, NULL, NULL,
+         help_oddlprice,  gnumeric_oddlprice, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "oddlyield", "ffffffff",
-         help_oddlyield,  gnumeric_oddlyield, NULL, NULL, NULL,
+         help_oddlyield,  gnumeric_oddlyield, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "pmt", "fff|ff",
-         help_pmt,       gnumeric_pmt, NULL, NULL, NULL,
+         help_pmt,       gnumeric_pmt, NULL,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_MONETARY,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "ppmt", "ffff|ff",
-         help_ppmt,      gnumeric_ppmt, NULL, NULL, NULL,
+         help_ppmt,      gnumeric_ppmt, NULL,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_MONETARY,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "price", "ffffff|f",
-         help_price, gnumeric_price, NULL, NULL, NULL,
+         help_price, gnumeric_price, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "pricedisc", "ffff|f",
-         help_pricedisc,  gnumeric_pricedisc, NULL, NULL, NULL,
+         help_pricedisc,  gnumeric_pricedisc, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "pricemat", "fffff|f",
-         help_pricemat,  gnumeric_pricemat, NULL, NULL, NULL,
+         help_pricemat,  gnumeric_pricemat, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "pv", "fff|ff",
-         help_pv,        gnumeric_pv, NULL, NULL, NULL,
+         help_pv,        gnumeric_pv, NULL,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_MONETARY,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "rate", "fff|fff",
-         help_rate,      gnumeric_rate, NULL, NULL, NULL,
+         help_rate,      gnumeric_rate, NULL,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_PERCENT,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "rri", "fff",
-         help_rri,       gnumeric_rri, NULL, NULL, NULL,
+         help_rri,       gnumeric_rri, NULL,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_PERCENT,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_NO_TESTSUITE },
        { "received", "ffff|f",
-         help_received,  gnumeric_received, NULL, NULL, NULL,
+         help_received,  gnumeric_received, NULL,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_MONETARY,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "sln", "fff",
-         help_sln,       gnumeric_sln, NULL, NULL, NULL,
+         help_sln,       gnumeric_sln, NULL,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_MONETARY,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "syd", "ffff",
-         help_syd,       gnumeric_syd, NULL, NULL, NULL,
+         help_syd,       gnumeric_syd, NULL,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_MONETARY,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "tbilleq", "fff",
-         help_tbilleq,  gnumeric_tbilleq, NULL, NULL, NULL,
+         help_tbilleq,  gnumeric_tbilleq, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "tbillprice", "fff",
-         help_tbillprice, gnumeric_tbillprice, NULL, NULL, NULL,
+         help_tbillprice, gnumeric_tbillprice, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "tbillyield", "fff",
-         help_tbillyield, gnumeric_tbillyield, NULL, NULL, NULL,
+         help_tbillyield, gnumeric_tbillyield, NULL,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_PERCENT,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "vdb", "fffff|ff",
-         help_vdb, gnumeric_vdb, NULL, NULL, NULL,
+         help_vdb, gnumeric_vdb, NULL,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_MONETARY,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "xirr", "AA|f",
-         help_xirr,      gnumeric_xirr, NULL, NULL, NULL,
+         help_xirr,      gnumeric_xirr, NULL,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_PERCENT,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "xnpv", "fAA",
-         help_xnpv,      gnumeric_xnpv, NULL, NULL, NULL,
+         help_xnpv,      gnumeric_xnpv, NULL,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_MONETARY,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "yield", "ffffff|f",
-         help_yield, gnumeric_yield, NULL, NULL, NULL,
+         help_yield, gnumeric_yield, NULL,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_PERCENT,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "yielddisc", "ffff|f",
-         help_yielddisc,  gnumeric_yielddisc, NULL, NULL, NULL,
+         help_yielddisc,  gnumeric_yielddisc, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "yieldmat", "fffff|f",
-         help_yieldmat,  gnumeric_yieldmat, NULL, NULL, NULL,
+         help_yieldmat,  gnumeric_yieldmat, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
         {NULL}
 };
diff --git a/plugins/fn-hebrew-date/functions.c b/plugins/fn-hebrew-date/functions.c
index 0fa0387c4..13e75a222 100644
--- a/plugins/fn-hebrew-date/functions.c
+++ b/plugins/fn-hebrew-date/functions.c
@@ -364,47 +364,47 @@ gnumeric_date2julian (GnmFuncEvalInfo * ei, GnmValue const * const *argv)
 
 GnmFuncDescriptor const hebrew_datetime_functions[] = {
        {"hdate", "|fff", help_hdate,
-        gnumeric_hdate, NULL, NULL, NULL,
+        gnumeric_hdate, NULL,
         GNM_FUNC_SIMPLE + GNM_FUNC_VOLATILE,
         GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC,
         GNM_FUNC_TEST_STATUS_NO_TESTSUITE},
        {"hdate_heb", "|fff", help_hdate_heb,
-        gnumeric_hdate_heb, NULL, NULL, NULL,
+        gnumeric_hdate_heb, NULL,
         GNM_FUNC_SIMPLE + GNM_FUNC_VOLATILE,
         GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC,
         GNM_FUNC_TEST_STATUS_NO_TESTSUITE},
         {"hdate_day", "|fff", help_hdate_day,
-        gnumeric_hdate_day, NULL, NULL, NULL,
+        gnumeric_hdate_day, NULL,
         GNM_FUNC_SIMPLE + GNM_FUNC_VOLATILE + GNM_FUNC_AUTO_UNITLESS,
         GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC,
         GNM_FUNC_TEST_STATUS_NO_TESTSUITE},
         {"hdate_month", "|fff", help_hdate_month,
-        gnumeric_hdate_month, NULL, NULL, NULL,
+        gnumeric_hdate_month, NULL,
         GNM_FUNC_SIMPLE + GNM_FUNC_VOLATILE + GNM_FUNC_AUTO_UNITLESS,
         GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC,
         GNM_FUNC_TEST_STATUS_NO_TESTSUITE},
         {"hdate_year", "|fff", help_hdate_year,
-        gnumeric_hdate_year, NULL, NULL, NULL,
+        gnumeric_hdate_year, NULL,
         GNM_FUNC_SIMPLE + GNM_FUNC_VOLATILE + GNM_FUNC_AUTO_UNITLESS,
         GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC,
         GNM_FUNC_TEST_STATUS_NO_TESTSUITE},
         {"hdate_julian", "|fff", help_hdate_julian,
-        gnumeric_hdate_julian, NULL, NULL, NULL,
+        gnumeric_hdate_julian, NULL,
         GNM_FUNC_SIMPLE + GNM_FUNC_VOLATILE + GNM_FUNC_AUTO_UNITLESS,
         GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC,
         GNM_FUNC_TEST_STATUS_NO_TESTSUITE},
         {"date2hdate", "|f", help_date2hdate,
-        gnumeric_date2hdate, NULL, NULL, NULL,
+        gnumeric_date2hdate, NULL,
         GNM_FUNC_SIMPLE + GNM_FUNC_VOLATILE,
         GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC,
         GNM_FUNC_TEST_STATUS_NO_TESTSUITE},
         {"date2hdate_heb", "|f", help_date2hdate_heb,
-        gnumeric_date2hdate_heb, NULL, NULL, NULL,
+        gnumeric_date2hdate_heb, NULL,
         GNM_FUNC_SIMPLE + GNM_FUNC_VOLATILE,
         GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC,
         GNM_FUNC_TEST_STATUS_NO_TESTSUITE},
         {"date2julian", "|f", help_date2julian,
-        gnumeric_date2julian, NULL, NULL, NULL,
+        gnumeric_date2julian, NULL,
         GNM_FUNC_SIMPLE + GNM_FUNC_VOLATILE + GNM_FUNC_AUTO_UNITLESS,
         GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC,
         GNM_FUNC_TEST_STATUS_NO_TESTSUITE},
diff --git a/plugins/fn-info/functions.c b/plugins/fn-info/functions.c
index a87b707c8..3a218470a 100644
--- a/plugins/fn-info/functions.c
+++ b/plugins/fn-info/functions.c
@@ -1862,81 +1862,81 @@ gnumeric_get_link (GnmFuncEvalInfo *ei, GnmValue const * const *argv)
 
 GnmFuncDescriptor const info_functions[] = {
        { "cell",       "sr",  help_cell,
-         gnumeric_cell, NULL, NULL, NULL,
+         gnumeric_cell, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_SUBSET_WITH_EXTENSIONS, GNM_FUNC_TEST_STATUS_BASIC },
        { "error.type", "E",  help_error_type,
-         gnumeric_error_type, NULL, NULL, NULL,
+         gnumeric_error_type, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "info",       "s",  help_info,
-         gnumeric_info, NULL, NULL, NULL,
+         gnumeric_info, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "isblank",    "E",  help_isblank,
-         gnumeric_isblank, NULL, NULL, NULL,
+         gnumeric_isblank, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "iserr",      "E",    help_iserr,
-         gnumeric_iserr, NULL, NULL, NULL,
+         gnumeric_iserr, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "iserror",    "E",    help_iserror,
-         gnumeric_iserror, NULL, NULL, NULL,
+         gnumeric_iserror, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "iseven",     "f",  help_iseven,
-         gnumeric_iseven, NULL, NULL, NULL,
+         gnumeric_iseven, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "islogical",  "E",  help_islogical,
-         gnumeric_islogical, NULL, NULL, NULL,
+         gnumeric_islogical, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "isna",       "E",    help_isna,
-         gnumeric_isna, NULL, NULL, NULL,
+         gnumeric_isna, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "isnontext",  "E",  help_isnontext,
-         gnumeric_isnontext, NULL, NULL, NULL,
+         gnumeric_isnontext, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "isnumber",   "E",  help_isnumber,
-         gnumeric_isnumber, NULL, NULL, NULL,
+         gnumeric_isnumber, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "isodd",      "S",  help_isodd,
-         gnumeric_isodd, NULL, NULL, NULL,
+         gnumeric_isodd, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "isref",      NULL,  help_isref,
-         NULL, gnumeric_isref, NULL, NULL,
+         NULL, gnumeric_isref,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "istext",     "E",  help_istext,
-         gnumeric_istext, NULL, NULL, NULL,
+         gnumeric_istext, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "n",          "S",  help_n,
-         gnumeric_n, NULL, NULL, NULL,
+         gnumeric_n, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "na",         "", help_na,
-         gnumeric_na, NULL, NULL, NULL,
+         gnumeric_na, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "type",       "?",  help_type,
-         gnumeric_type, NULL, NULL, NULL,
+         gnumeric_type, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
 
 /* XL stores this in statistical ? */
         { "countblank",        "r",   help_countblank,
-         gnumeric_countblank, NULL, NULL, NULL,
+         gnumeric_countblank, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
 
        { "error",      "s",   help_error,
-         gnumeric_error, NULL, NULL, NULL,
+         gnumeric_error, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_NO_TESTSUITE },
 
        { "expression", "r",    help_expression,
-         gnumeric_expression, NULL, NULL, NULL,
+         gnumeric_expression, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_NO_TESTSUITE },
 /* XLM : looks common in charts */
        { "get.formula", "r",    help_get_formula,
-         gnumeric_get_formula, NULL, NULL, NULL,
+         gnumeric_get_formula, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_NO_TESTSUITE },
        { "get.link", "r",    help_get_link,
-         gnumeric_get_link, NULL, NULL, NULL,
+         gnumeric_get_link, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_NO_TESTSUITE },
        { "isformula", "r",    help_isformula,
-         gnumeric_isformula, NULL, NULL, NULL,
+         gnumeric_isformula, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_NO_TESTSUITE},
        { "getenv",     "s",  help_getenv,
-         gnumeric_getenv, NULL, NULL, NULL,
+         gnumeric_getenv, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_NO_TESTSUITE },
 
         {NULL}
diff --git a/plugins/fn-logical/functions.c b/plugins/fn-logical/functions.c
index a72dd5e25..8d87a5a6c 100644
--- a/plugins/fn-logical/functions.c
+++ b/plugins/fn-logical/functions.c
@@ -402,42 +402,42 @@ gnumeric_false (GnmFuncEvalInfo *ei, GnmValue const * const *args)
 
 GnmFuncDescriptor const logical_functions[] = {
        { "and", NULL,  help_and, NULL,
-         gnumeric_and, NULL, NULL,
+         gnumeric_and,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_UNITLESS,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "or", NULL,  help_or, NULL,
-         gnumeric_or, NULL, NULL,
+         gnumeric_or, 
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_UNITLESS,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "not", "b",  help_not, gnumeric_not,
-         NULL, NULL, NULL,
+         NULL,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_UNITLESS,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "iferror", "EE",  help_iferror,
-         gnumeric_iferror, NULL, NULL, NULL,
+         gnumeric_iferror, NULL,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_SECOND,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_NO_TESTSUITE },
        { "ifna", "EE",  help_ifna,
-         gnumeric_ifna, NULL, NULL, NULL,
+         gnumeric_ifna, NULL,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_SECOND,
          GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC,
          GNM_FUNC_TEST_STATUS_NO_TESTSUITE},
        { "ifs", NULL,  help_ifs,
-         NULL, gnumeric_ifs, NULL, NULL,
+         NULL, gnumeric_ifs,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_NO_TESTSUITE },
        { "switch", NULL,  help_switch,
-         NULL, gnumeric_switch, NULL, NULL,
+         NULL, gnumeric_switch,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_NO_TESTSUITE },
        { "true", "", help_true, gnumeric_true,
-         NULL, NULL, NULL,
+         NULL,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_UNITLESS,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
        { "false", "", help_false, gnumeric_false,
-         NULL, NULL, NULL,
+         NULL,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_UNITLESS,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
        { "xor", NULL,  help_xor, NULL,
-         gnumeric_xor, NULL, NULL,
+         gnumeric_xor,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_UNITLESS,
          GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_BASIC },
         {NULL}
diff --git a/plugins/fn-lookup/functions.c b/plugins/fn-lookup/functions.c
index 722feeb89..d8766c433 100644
--- a/plugins/fn-lookup/functions.c
+++ b/plugins/fn-lookup/functions.c
@@ -1965,70 +1965,70 @@ gnumeric_sort (GnmFuncEvalInfo *ei, GnmValue const * const *argv)
 
 GnmFuncDescriptor const lookup_functions[] = {
        { "address",   "ff|fbs",
-         help_address,  gnumeric_address, NULL, NULL, NULL,
+         help_address,  gnumeric_address, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
        { "areas", NULL,
-         help_areas,   NULL,   gnumeric_areas, NULL, NULL,
+         help_areas,   NULL,   gnumeric_areas,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
         { "choose", NULL,
-         help_choose,  NULL,   gnumeric_choose, NULL, NULL,
+         help_choose,  NULL,   gnumeric_choose,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "column",     "|A",
-         help_column,   gnumeric_column, NULL, NULL, NULL,
+         help_column,   gnumeric_column, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "columnnumber", "s",
-         help_columnnumber, gnumeric_columnnumber, NULL, NULL, NULL,
+         help_columnnumber, gnumeric_columnnumber, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_NO_TESTSUITE },
        { "columns",   "A",
-         help_columns, gnumeric_columns, NULL, NULL, NULL,
+         help_columns, gnumeric_columns, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "hlookup",   "EAf|bb",
-         help_hlookup, gnumeric_hlookup, NULL, NULL, NULL,
+         help_hlookup, gnumeric_hlookup, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "hyperlink", "S|S",
-         help_hyperlink, gnumeric_hyperlink, NULL, NULL, NULL,
+         help_hyperlink, gnumeric_hyperlink, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_SUBSET, GNM_FUNC_TEST_STATUS_BASIC },
        { "indirect",  "s|b",
-         help_indirect, gnumeric_indirect, NULL, NULL, NULL,
+         help_indirect, gnumeric_indirect, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "index",     "A|fff",
-         help_index,    NULL, gnumeric_index, NULL, NULL,
+         help_index,    NULL, gnumeric_index,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "lookup",    "EA|r",
-         help_lookup,   gnumeric_lookup, NULL, NULL, NULL,
+         help_lookup,   gnumeric_lookup, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "match",     "EA|f",
-         help_match,    gnumeric_match, NULL, NULL, NULL,
+         help_match,    gnumeric_match, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "offset",    "rff|ff",
-         help_offset,   gnumeric_offset, NULL, NULL, NULL,
+         help_offset,   gnumeric_offset, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "row",       "|A",
-         help_row,      gnumeric_row, NULL, NULL, NULL,
+         help_row,      gnumeric_row, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "rows",      "A",
-         help_rows,     gnumeric_rows, NULL, NULL, NULL,
+         help_rows,     gnumeric_rows, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "sheets",      "|A",
-         help_sheets,     gnumeric_sheets, NULL, NULL, NULL,
+         help_sheets,     gnumeric_sheets, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_NO_TESTSUITE },
        { "sheet",      "|?",
-         help_sheet,     gnumeric_sheet, NULL, NULL, NULL,
+         help_sheet,     gnumeric_sheet, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_NO_TESTSUITE },
        { "sort",         "r|f",
-         help_sort, gnumeric_sort, NULL, NULL, NULL,
+         help_sort, gnumeric_sort, NULL,
          GNM_FUNC_RETURNS_NON_SCALAR, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, 
GNM_FUNC_TEST_STATUS_NO_TESTSUITE },
        { "transpose", "A",
-         help_transpose, gnumeric_transpose, NULL, NULL, NULL,
+         help_transpose, gnumeric_transpose, NULL,
          GNM_FUNC_RETURNS_NON_SCALAR, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "vlookup",   "EAf|bb",
-         help_vlookup, gnumeric_vlookup, NULL, NULL, NULL,
+         help_vlookup, gnumeric_vlookup, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "array", NULL,
-         help_array, NULL, gnumeric_array, NULL, NULL,
+         help_array, NULL, gnumeric_array,
          GNM_FUNC_RETURNS_NON_SCALAR, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, 
GNM_FUNC_TEST_STATUS_NO_TESTSUITE },
        { "flip", "A|b",
-         help_flip, gnumeric_flip, NULL, NULL, NULL,
+         help_flip, gnumeric_flip, NULL,
          GNM_FUNC_RETURNS_NON_SCALAR, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, 
GNM_FUNC_TEST_STATUS_NO_TESTSUITE },
 
         {NULL}
diff --git a/plugins/fn-math/functions.c b/plugins/fn-math/functions.c
index a092e1f08..333dfb089 100644
--- a/plugins/fn-math/functions.c
+++ b/plugins/fn-math/functions.c
@@ -3413,324 +3413,324 @@ out:
 
 GnmFuncDescriptor const math_functions[] = {
        { "abs",     "f",     help_abs,
-         gnumeric_abs, NULL, NULL, NULL,
+         gnumeric_abs, NULL,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_FIRST,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
        { "acos",    "f",     help_acos,
-         gnumeric_acos, NULL, NULL, NULL,
+         gnumeric_acos, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
        { "acosh",   "f",     help_acosh,
-         gnumeric_acosh, NULL, NULL, NULL,
+         gnumeric_acosh, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
        { "acot",    "f",     help_acot,
-         gnumeric_acot, NULL, NULL, NULL,
+         gnumeric_acot, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_NO_TESTSUITE },
        { "acoth",   "f",     help_acoth,
-         gnumeric_acoth, NULL, NULL, NULL,
+         gnumeric_acoth, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_NO_TESTSUITE },
        { "agm",     "ff",    help_agm,
-         gnumeric_agm, NULL, NULL, NULL,
+         gnumeric_agm, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
        { "arabic",       "S",             help_arabic,
-         gnumeric_arabic, NULL, NULL, NULL,
+         gnumeric_arabic, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_NO_TESTSUITE },
        { "asin",    "f",     help_asin,
-         gnumeric_asin, NULL, NULL, NULL,
+         gnumeric_asin, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
        { "asinh",   "f",     help_asinh,
-         gnumeric_asinh, NULL, NULL, NULL,
+         gnumeric_asinh, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
        { "atan",    "f",     help_atan,
-         gnumeric_atan, NULL, NULL, NULL,
+         gnumeric_atan, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
        { "atanh",   "f",     help_atanh,
-         gnumeric_atanh, NULL, NULL, NULL,
+         gnumeric_atanh, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
        { "atan2",   "ff",  help_atan2,
-         gnumeric_atan2, NULL, NULL, NULL,
+         gnumeric_atan2, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
        { "beta",     "ff",      help_beta,
-         gnumeric_beta, NULL, NULL, NULL,
+         gnumeric_beta, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
        { "betaln",   "ff",      help_betaln,
-         gnumeric_betaln, NULL, NULL, NULL,
+         gnumeric_betaln, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_NO_TESTSUITE },
        { "cholesky","A",      help_cholesky,
-         gnumeric_cholesky, NULL, NULL, NULL,
+         gnumeric_cholesky, NULL,
          GNM_FUNC_RETURNS_NON_SCALAR, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, 
GNM_FUNC_TEST_STATUS_NO_TESTSUITE },
        { "cos",     "f",     help_cos,
-         gnumeric_cos, NULL, NULL, NULL,
+         gnumeric_cos, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
        { "cosh",    "f",     help_cosh,
-         gnumeric_cosh, NULL, NULL, NULL,
+         gnumeric_cosh, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
        { "cospi",   "f",     help_cospi,
-         gnumeric_cospi, NULL, NULL, NULL,
+         gnumeric_cospi, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
        { "cot",     "f",     help_cot,
-         gnumeric_cot, NULL, NULL, NULL,
+         gnumeric_cot, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_NO_TESTSUITE },
        { "cotpi",   "f",     help_cotpi,
-         gnumeric_cotpi, NULL, NULL, NULL,
+         gnumeric_cotpi, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_NO_TESTSUITE },
        { "coth",     "f",     help_coth,
-         gnumeric_coth, NULL, NULL, NULL,
+         gnumeric_coth, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_NO_TESTSUITE },
 
        { "countif", "rS",  help_countif,
-         gnumeric_countif, NULL, NULL, NULL,
+         gnumeric_countif, NULL,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_UNITLESS,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "countifs", NULL,  help_countifs,
-         NULL, gnumeric_countifs, NULL, NULL,
+         NULL, gnumeric_countifs,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_UNITLESS,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
 
        { "ceil",    "f",     help_ceil,
-         gnumeric_ceil, NULL, NULL, NULL,
+         gnumeric_ceil, NULL,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_FIRST,
          GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_NO_TESTSUITE },
        { "ceiling", "f|f",  help_ceiling,
-         gnumeric_ceiling, NULL, NULL, NULL,
+         gnumeric_ceiling, NULL,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_FIRST,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "degrees", "f",     help_degrees,
-         gnumeric_degrees, NULL, NULL, NULL,
+         gnumeric_degrees, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
        { "even",    "f",     help_even,
-         gnumeric_even, NULL, NULL, NULL,
+         gnumeric_even, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "exp",     "f",     help_exp,
-         gnumeric_exp, NULL, NULL, NULL,
+         gnumeric_exp, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
        { "expm1",   "f",     help_expm1,
-         gnumeric_expm1, NULL, NULL, NULL,
+         gnumeric_expm1, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
        { "fact",    "f",     help_fact,
-         gnumeric_fact, NULL, NULL, NULL,
+         gnumeric_fact, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_SUPERSET, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
 
 /* MS Excel puts this in the engineering functions */
        { "factdouble", "f",  help_factdouble,
-         gnumeric_factdouble, NULL, NULL, NULL,
+         gnumeric_factdouble, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
 
        { "fib", "f",  help_fib,
-         gnumeric_fib, NULL, NULL, NULL,
+         gnumeric_fib, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "combin",  "ff",       help_combin,
-         gnumeric_combin, NULL, NULL, NULL,
+         gnumeric_combin, NULL,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_UNITLESS,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
        { "combina",  "ff",       help_combina,
-         gnumeric_combina, NULL, NULL, NULL,
+         gnumeric_combina, NULL,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_UNITLESS,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_NO_TESTSUITE },
        { "csc",     "f",     help_csc,
-         gnumeric_csc, NULL, NULL, NULL,
+         gnumeric_csc, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_NO_TESTSUITE },
        { "csch",     "f",     help_csch,
-         gnumeric_csch, NULL, NULL, NULL,
+         gnumeric_csch, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_NO_TESTSUITE },
        { "floor",   "f|f",   help_floor,
-         gnumeric_floor, NULL, NULL, NULL,
+         gnumeric_floor, NULL,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_FIRST,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "gamma",    "f",     help_gamma,
-         gnumeric_gamma, NULL, NULL, NULL,
+         gnumeric_gamma, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
        { "gammaln",      "f",
-         help_gammaln, gnumeric_gammaln, NULL, NULL, NULL,
+         help_gammaln, gnumeric_gammaln, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "gcd", NULL,  help_gcd,
-         NULL, gnumeric_gcd, NULL, NULL,
+         NULL, gnumeric_gcd,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "gd",   "f",   help_gd,
-         gnumeric_gd, NULL, NULL, NULL,
+         gnumeric_gd, NULL,
          GNM_FUNC_SIMPLE,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "hypot", NULL, help_hypot,
-         NULL, gnumeric_hypot, NULL, NULL,
+         NULL, gnumeric_hypot,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_NO_TESTSUITE },
        { "igamma",    "ff|bbb",  help_igamma,
-         gnumeric_igamma, NULL, NULL, NULL,
+         gnumeric_igamma, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_NO_TESTSUITE },
        { "int",     "f",     help_int,
-         gnumeric_int, NULL, NULL, NULL,
+         gnumeric_int, NULL,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_FIRST,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "lcm", NULL, help_lcm,
-         NULL, gnumeric_lcm, NULL, NULL,
+         NULL, gnumeric_lcm,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "ln",      "f",     help_ln,
-         gnumeric_ln, NULL, NULL, NULL,
+         gnumeric_ln, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
        { "ln1p",    "f",     help_ln1p,
-         gnumeric_ln1p, NULL, NULL, NULL,
+         gnumeric_ln1p, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
        { "log",     "f|f",  help_log,
-         gnumeric_log, NULL, NULL, NULL,
+         gnumeric_log, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
        { "log2",    "f",     help_log2,
-         gnumeric_log2, NULL, NULL, NULL,
+         gnumeric_log2, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
        { "log10",   "f",     help_log10,
-         gnumeric_log10, NULL, NULL, NULL,
+         gnumeric_log10, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
        { "mod",     "ff",  help_mod,
-         gnumeric_mod, NULL, NULL, NULL,
+         gnumeric_mod, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "mround",  "ff",  help_mround,
-         gnumeric_mround, NULL, NULL, NULL,
+         gnumeric_mround, NULL,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_FIRST,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "multinomial", NULL, help_multinomial,
-         NULL, gnumeric_multinomial, NULL, NULL,
+         NULL, gnumeric_multinomial,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "odd" ,    "f",     help_odd,
-         gnumeric_odd, NULL, NULL, NULL,
+         gnumeric_odd, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "power",   "ff|f",       help_power,
-         gnumeric_power, NULL, NULL, NULL,
+         gnumeric_power, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_SUPERSET, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
        { "pochhammer",   "ff",       help_pochhammer,
-         gnumeric_pochhammer, NULL, NULL, NULL,
+         gnumeric_pochhammer, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
        { "g_product", NULL,     help_g_product,
-         NULL, gnumeric_g_product, NULL, NULL,
+         NULL, gnumeric_g_product,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "quotient" , "ff",  help_quotient,
-         gnumeric_quotient, NULL, NULL, NULL,
+         gnumeric_quotient, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "radians", "f",     help_radians,
-         gnumeric_radians, NULL, NULL, NULL,
+         gnumeric_radians, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
        { "reducepi", "ff|f",   help_reducepi,
-         gnumeric_reducepi, NULL, NULL, NULL,
+         gnumeric_reducepi, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_NO_TESTSUITE },
        { "roman",      "f|f",  help_roman,
-         gnumeric_roman, NULL, NULL, NULL,
+         gnumeric_roman, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "round",      "f|f",  help_round,
-         gnumeric_round, NULL, NULL, NULL,
+         gnumeric_round, NULL,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_FIRST,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "rounddown",  "f|f",  help_rounddown,
-         gnumeric_rounddown, NULL, NULL, NULL,
+         gnumeric_rounddown, NULL,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_FIRST,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "roundup",    "f|f",  help_roundup,
-         gnumeric_roundup, NULL, NULL, NULL,
+         gnumeric_roundup, NULL,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_FIRST,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "sec",     "f",     help_sec,
-         gnumeric_sec, NULL, NULL, NULL,
+         gnumeric_sec, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_NO_TESTSUITE },
        { "sech",     "f",     help_sech,
-         gnumeric_sech, NULL, NULL, NULL,
+         gnumeric_sech, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_NO_TESTSUITE },
        { "seriessum", "fffA",  help_seriessum,
-         gnumeric_seriessum, NULL, NULL, NULL,
+         gnumeric_seriessum, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "sign",    "f",     help_sign,
-         gnumeric_sign, NULL, NULL, NULL,
+         gnumeric_sign, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "sin",     "f",     help_sin,
-         gnumeric_sin, NULL, NULL, NULL,
+         gnumeric_sin, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
        { "sinh",    "f",     help_sinh,
-         gnumeric_sinh, NULL, NULL, NULL,
+         gnumeric_sinh, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
        { "sinpi",   "f",     help_sinpi,
-         gnumeric_sinpi, NULL, NULL, NULL,
+         gnumeric_sinpi, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
        { "sqrt",    "f",     help_sqrt,
-         gnumeric_sqrt, NULL, NULL, NULL,
+         gnumeric_sqrt, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
        { "sqrtpi",  "f",     help_sqrtpi,
-         gnumeric_sqrtpi, NULL, NULL, NULL,
+         gnumeric_sqrtpi, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "suma", NULL,  help_suma,
-         NULL, gnumeric_suma, NULL, NULL,
+         NULL, gnumeric_suma,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_FIRST,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "sumif",   "rS|r",  help_sumif,
-         gnumeric_sumif, NULL, NULL, NULL,
+         gnumeric_sumif, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "sumifs", NULL,  help_sumifs,
-         NULL, gnumeric_sumifs, NULL, NULL,
+         NULL, gnumeric_sumifs,
          GNM_FUNC_SIMPLE,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "averageif",   "rS|r",  help_averageif,
-         gnumeric_averageif, NULL, NULL, NULL,
+         gnumeric_averageif, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "averageifs", NULL,  help_averageifs,
-         NULL, gnumeric_averageifs, NULL, NULL,
+         NULL, gnumeric_averageifs,
          GNM_FUNC_SIMPLE,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "minifs", NULL,  help_minifs,
-         NULL, gnumeric_minifs, NULL, NULL,
+         NULL, gnumeric_minifs,
          GNM_FUNC_SIMPLE,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "maxifs", NULL,  help_maxifs,
-         NULL, gnumeric_maxifs, NULL, NULL,
+         NULL, gnumeric_maxifs,
          GNM_FUNC_SIMPLE,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "sumproduct", NULL,  help_sumproduct,
-         NULL, gnumeric_sumproduct, NULL, NULL,
+         NULL, gnumeric_sumproduct,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "odf.sumproduct", NULL,  help_odf_sumproduct,
-         NULL, gnumeric_odf_sumproduct, NULL, NULL,
+         NULL, gnumeric_odf_sumproduct,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_NO_TESTSUITE },
        { "sumsq", NULL,       help_sumsq,
-         NULL, gnumeric_sumsq, NULL, NULL,
+         NULL, gnumeric_sumsq,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "sumx2my2", "AA",  help_sumx2my2,
-         gnumeric_sumx2my2, NULL, NULL, NULL,
+         gnumeric_sumx2my2, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "sumx2py2", "AA",  help_sumx2py2,
-         gnumeric_sumx2py2, NULL, NULL, NULL,
+         gnumeric_sumx2py2, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "sumxmy2",  "AA",  help_sumxmy2,
-         gnumeric_sumxmy2, NULL, NULL, NULL,
+         gnumeric_sumxmy2, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "tan",     "f",     help_tan,
-         gnumeric_tan, NULL, NULL, NULL,
+         gnumeric_tan, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
        { "tanpi",   "f",     help_tanpi,
-         gnumeric_tanpi, NULL, NULL, NULL,
+         gnumeric_tanpi, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
        { "tanh",    "f",     help_tanh,
-         gnumeric_tanh, NULL, NULL, NULL,
+         gnumeric_tanh, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
        { "trunc",   "f|f",  help_trunc,
-         gnumeric_trunc, NULL, NULL, NULL,
+         gnumeric_trunc, NULL,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_FIRST,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "pi",      "", help_pi,
-         gnumeric_pi, NULL, NULL, NULL,
+         gnumeric_pi, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
        { "mmult",   "AA",  help_mmult,
-         gnumeric_mmult, NULL, NULL, NULL,
+         gnumeric_mmult, NULL,
          GNM_FUNC_RETURNS_NON_SCALAR, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "minverse","A",      help_minverse,
-         gnumeric_minverse, NULL, NULL, NULL,
+         gnumeric_minverse, NULL,
          GNM_FUNC_RETURNS_NON_SCALAR, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "mpseudoinverse","A|f", help_mpseudoinverse,
-         gnumeric_mpseudoinverse, NULL, NULL, NULL,
+         gnumeric_mpseudoinverse, NULL,
          GNM_FUNC_RETURNS_NON_SCALAR, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, 
GNM_FUNC_TEST_STATUS_NO_TESTSUITE },
        { "linsolve", "AA",  help_linsolve,
-         gnumeric_linsolve, NULL, NULL, NULL,
+         gnumeric_linsolve, NULL,
          GNM_FUNC_RETURNS_NON_SCALAR, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, 
GNM_FUNC_TEST_STATUS_NO_TESTSUITE },
        { "mdeterm", "A",  help_mdeterm,
-         gnumeric_mdeterm, NULL, NULL, NULL,
+         gnumeric_mdeterm, NULL,
          GNM_FUNC_RETURNS_NON_SCALAR, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "munit","f",      help_munit,
-         gnumeric_munit, NULL, NULL, NULL,
+         gnumeric_munit, NULL,
          GNM_FUNC_RETURNS_NON_SCALAR, GNM_FUNC_IMPL_STATUS_COMPLETE,
          GNM_FUNC_TEST_STATUS_NO_TESTSUITE },
        { "eigen","A",      help_eigen,
-         gnumeric_eigen, NULL, NULL, NULL,
+         gnumeric_eigen, NULL,
          GNM_FUNC_RETURNS_NON_SCALAR, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, 
GNM_FUNC_TEST_STATUS_NO_TESTSUITE},
 #if 0
        { "logmdeterm", "A|si",
diff --git a/plugins/fn-numtheory/numtheory.c b/plugins/fn-numtheory/numtheory.c
index 0adf9ae95..f2ce4e0ef 100644
--- a/plugins/fn-numtheory/numtheory.c
+++ b/plugins/fn-numtheory/numtheory.c
@@ -713,31 +713,31 @@ go_plugin_shutdown (GOPlugin *plugin, GOCmdContext *cc)
 
 const GnmFuncDescriptor num_theory_functions[] = {
        {"ithprime", "f", help_ithprime,
-        &gnumeric_ithprime, NULL, NULL, NULL,
+        &gnumeric_ithprime, NULL,
         GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_BASIC },
        {"pfactor", "f", help_pfactor,
-        &gnumeric_pfactor, NULL, NULL, NULL,
+        &gnumeric_pfactor, NULL,
         GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_BASIC },
        {"nt_omega",   "f", help_nt_omega,
-        &gnumeric_nt_omega,  NULL, NULL, NULL,
+        &gnumeric_nt_omega, NULL,
         GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
        {"nt_phi",   "f", help_phi,
-        &gnumeric_phi,      NULL, NULL, NULL,
+        &gnumeric_phi,      NULL,
         GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
        {"nt_d",     "f", help_d,
-        &gnumeric_d,        NULL, NULL, NULL,
+        &gnumeric_d,        NULL,
         GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
        {"nt_sigma", "f", help_sigma,
-        &gnumeric_sigma,    NULL, NULL, NULL,
+        &gnumeric_sigma,    NULL,
         GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
        {"isprime",  "f", help_isprime,
-        &gnumeric_isprime,  NULL, NULL, NULL,
+        &gnumeric_isprime,  NULL,
         GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_BASIC },
        {"nt_pi",    "f", help_nt_pi,
-        &gnumeric_nt_pi,    NULL, NULL, NULL,
+        &gnumeric_nt_pi,    NULL,
         GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_BASIC },
        {"nt_mu",    "f", help_nt_mu,
-        &gnumeric_nt_mu,    NULL, NULL, NULL,
+        &gnumeric_nt_mu,    NULL,
         GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
 
        {NULL}
@@ -745,19 +745,19 @@ const GnmFuncDescriptor num_theory_functions[] = {
 
 const GnmFuncDescriptor bitwise_functions[] = {
        {"bitor",     "ff", help_bitor,
-        &func_bitor,     NULL, NULL, NULL,
+        &func_bitor,     NULL,
         GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
        {"bitxor",    "ff", help_bitxor,
-        &func_bitxor,    NULL, NULL, NULL,
+        &func_bitxor,    NULL,
         GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
        {"bitand",    "ff", help_bitand,
-        &func_bitand,    NULL, NULL, NULL,
+        &func_bitand,    NULL,
         GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
        {"bitlshift", "ff", help_bitlshift,
-        &func_bitlshift, NULL, NULL, NULL,
+        &func_bitlshift, NULL,
         GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
        {"bitrshift", "ff", help_bitrshift,
-        &func_bitrshift, NULL, NULL, NULL,
+        &func_bitrshift, NULL,
         GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
        {NULL}
 };
diff --git a/plugins/fn-r/functions.c b/plugins/fn-r/functions.c
index 27c658965..8f92a3d73 100644
--- a/plugins/fn-r/functions.c
+++ b/plugins/fn-r/functions.c
@@ -1574,413 +1574,413 @@ GnmFuncDescriptor const rstat_functions[] = {
                "r.dbeta",
                "fff|b",
                help_r_dbeta,
-               gnumeric_r_dbeta, NULL, NULL, NULL,
+               gnumeric_r_dbeta, NULL,
                GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_EXHAUSTIVE,
        },
        {
                "r.pbeta",
                "fff|bb",
                help_r_pbeta,
-               gnumeric_r_pbeta, NULL, NULL, NULL,
+               gnumeric_r_pbeta, NULL,
                GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_EXHAUSTIVE,
        },
        {
                "r.qbeta",
                "fff|bb",
                help_r_qbeta,
-               gnumeric_r_qbeta, NULL, NULL, NULL,
+               gnumeric_r_qbeta, NULL,
                GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_EXHAUSTIVE,
        },
        {
                "r.dbinom",
                "fff|b",
                help_r_dbinom,
-               gnumeric_r_dbinom, NULL, NULL, NULL,
+               gnumeric_r_dbinom, NULL,
                GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_EXHAUSTIVE,
        },
        {
                "r.pbinom",
                "fff|bb",
                help_r_pbinom,
-               gnumeric_r_pbinom, NULL, NULL, NULL,
+               gnumeric_r_pbinom, NULL,
                GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_EXHAUSTIVE,
        },
        {
                "r.qbinom",
                "fff|bb",
                help_r_qbinom,
-               gnumeric_r_qbinom, NULL, NULL, NULL,
+               gnumeric_r_qbinom, NULL,
                GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_NO_TESTSUITE,
        },
        {
                "r.dcauchy",
                "fff|b",
                help_r_dcauchy,
-               gnumeric_r_dcauchy, NULL, NULL, NULL,
+               gnumeric_r_dcauchy, NULL,
                GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_EXHAUSTIVE,
        },
        {
                "r.pcauchy",
                "fff|bb",
                help_r_pcauchy,
-               gnumeric_r_pcauchy, NULL, NULL, NULL,
+               gnumeric_r_pcauchy, NULL,
                GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_EXHAUSTIVE,
        },
        {
                "r.qcauchy",
                "fff|bb",
                help_r_qcauchy,
-               gnumeric_r_qcauchy, NULL, NULL, NULL,
+               gnumeric_r_qcauchy, NULL,
                GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_EXHAUSTIVE,
        },
        {
                "r.dchisq",
                "ff|b",
                help_r_dchisq,
-               gnumeric_r_dchisq, NULL, NULL, NULL,
+               gnumeric_r_dchisq, NULL,
                GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_EXHAUSTIVE,
        },
        {
                "r.pchisq",
                "ff|bb",
                help_r_pchisq,
-               gnumeric_r_pchisq, NULL, NULL, NULL,
+               gnumeric_r_pchisq, NULL,
                GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_EXHAUSTIVE,
        },
        {
                "r.qchisq",
                "ff|bb",
                help_r_qchisq,
-               gnumeric_r_qchisq, NULL, NULL, NULL,
+               gnumeric_r_qchisq, NULL,
                GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_EXHAUSTIVE,
        },
        {
                "r.dexp",
                "ff|b",
                help_r_dexp,
-               gnumeric_r_dexp, NULL, NULL, NULL,
+               gnumeric_r_dexp, NULL,
                GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_EXHAUSTIVE,
        },
        {
                "r.pexp",
                "ff|bb",
                help_r_pexp,
-               gnumeric_r_pexp, NULL, NULL, NULL,
+               gnumeric_r_pexp, NULL,
                GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_EXHAUSTIVE,
        },
        {
                "r.qexp",
                "ff|bb",
                help_r_qexp,
-               gnumeric_r_qexp, NULL, NULL, NULL,
+               gnumeric_r_qexp, NULL,
                GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_EXHAUSTIVE,
        },
        {
                "r.df",
                "fff|b",
                help_r_df,
-               gnumeric_r_df, NULL, NULL, NULL,
+               gnumeric_r_df, NULL,
                GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_EXHAUSTIVE,
        },
        {
                "r.pf",
                "fff|bb",
                help_r_pf,
-               gnumeric_r_pf, NULL, NULL, NULL,
+               gnumeric_r_pf, NULL,
                GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_EXHAUSTIVE,
        },
        {
                "r.qf",
                "fff|bb",
                help_r_qf,
-               gnumeric_r_qf, NULL, NULL, NULL,
+               gnumeric_r_qf, NULL,
                GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_EXHAUSTIVE,
        },
        {
                "r.dgamma",
                "fff|b",
                help_r_dgamma,
-               gnumeric_r_dgamma, NULL, NULL, NULL,
+               gnumeric_r_dgamma, NULL,
                GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_EXHAUSTIVE,
        },
        {
                "r.pgamma",
                "fff|bb",
                help_r_pgamma,
-               gnumeric_r_pgamma, NULL, NULL, NULL,
+               gnumeric_r_pgamma, NULL,
                GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_EXHAUSTIVE,
        },
        {
                "r.qgamma",
                "fff|bb",
                help_r_qgamma,
-               gnumeric_r_qgamma, NULL, NULL, NULL,
+               gnumeric_r_qgamma, NULL,
                GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_EXHAUSTIVE,
        },
        {
                "r.dgeom",
                "ff|b",
                help_r_dgeom,
-               gnumeric_r_dgeom, NULL, NULL, NULL,
+               gnumeric_r_dgeom, NULL,
                GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_NO_TESTSUITE,
        },
        {
                "r.pgeom",
                "ff|bb",
                help_r_pgeom,
-               gnumeric_r_pgeom, NULL, NULL, NULL,
+               gnumeric_r_pgeom, NULL,
                GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_EXHAUSTIVE,
        },
        {
                "r.qgeom",
                "ff|bb",
                help_r_qgeom,
-               gnumeric_r_qgeom, NULL, NULL, NULL,
+               gnumeric_r_qgeom, NULL,
                GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_NO_TESTSUITE,
        },
        {
                "r.dgumbel",
                "fff|b",
                help_r_dgumbel,
-               gnumeric_r_dgumbel, NULL, NULL, NULL,
+               gnumeric_r_dgumbel, NULL,
                GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_NO_TESTSUITE,
        },
        {
                "r.pgumbel",
                "fff|bb",
                help_r_pgumbel,
-               gnumeric_r_pgumbel, NULL, NULL, NULL,
+               gnumeric_r_pgumbel, NULL,
                GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_NO_TESTSUITE,
        },
        {
                "r.qgumbel",
                "fff|bb",
                help_r_qgumbel,
-               gnumeric_r_qgumbel, NULL, NULL, NULL,
+               gnumeric_r_qgumbel, NULL,
                GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_NO_TESTSUITE,
        },
        {
                "r.dhyper",
                "ffff|b",
                help_r_dhyper,
-               gnumeric_r_dhyper, NULL, NULL, NULL,
+               gnumeric_r_dhyper, NULL,
                GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_EXHAUSTIVE,
        },
        {
                "r.phyper",
                "ffff|bb",
                help_r_phyper,
-               gnumeric_r_phyper, NULL, NULL, NULL,
+               gnumeric_r_phyper, NULL,
                GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_EXHAUSTIVE,
        },
        {
                "r.qhyper",
                "ffff|bb",
                help_r_qhyper,
-               gnumeric_r_qhyper, NULL, NULL, NULL,
+               gnumeric_r_qhyper, NULL,
                GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_NO_TESTSUITE,
        },
        {
                "r.dlnorm",
                "fff|b",
                help_r_dlnorm,
-               gnumeric_r_dlnorm, NULL, NULL, NULL,
+               gnumeric_r_dlnorm, NULL,
                GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_EXHAUSTIVE,
        },
        {
                "r.plnorm",
                "fff|bb",
                help_r_plnorm,
-               gnumeric_r_plnorm, NULL, NULL, NULL,
+               gnumeric_r_plnorm, NULL,
                GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_EXHAUSTIVE,
        },
        {
                "r.qlnorm",
                "fff|bb",
                help_r_qlnorm,
-               gnumeric_r_qlnorm, NULL, NULL, NULL,
+               gnumeric_r_qlnorm, NULL,
                GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_EXHAUSTIVE,
        },
        {
                "r.dnbinom",
                "fff|b",
                help_r_dnbinom,
-               gnumeric_r_dnbinom, NULL, NULL, NULL,
+               gnumeric_r_dnbinom, NULL,
                GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_EXHAUSTIVE,
        },
        {
                "r.pnbinom",
                "fff|bb",
                help_r_pnbinom,
-               gnumeric_r_pnbinom, NULL, NULL, NULL,
+               gnumeric_r_pnbinom, NULL,
                GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_EXHAUSTIVE,
        },
        {
                "r.qnbinom",
                "fff|bb",
                help_r_qnbinom,
-               gnumeric_r_qnbinom, NULL, NULL, NULL,
+               gnumeric_r_qnbinom, NULL,
                GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_NO_TESTSUITE,
        },
        {
                "r.dnorm",
                "fff|b",
                help_r_dnorm,
-               gnumeric_r_dnorm, NULL, NULL, NULL,
+               gnumeric_r_dnorm, NULL,
                GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_EXHAUSTIVE,
        },
        {
                "r.pnorm",
                "fff|bb",
                help_r_pnorm,
-               gnumeric_r_pnorm, NULL, NULL, NULL,
+               gnumeric_r_pnorm, NULL,
                GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_EXHAUSTIVE,
        },
        {
                "r.qnorm",
                "fff|bb",
                help_r_qnorm,
-               gnumeric_r_qnorm, NULL, NULL, NULL,
+               gnumeric_r_qnorm, NULL,
                GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_EXHAUSTIVE,
        },
        {
                "r.dpois",
                "ff|b",
                help_r_dpois,
-               gnumeric_r_dpois, NULL, NULL, NULL,
+               gnumeric_r_dpois, NULL,
                GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_EXHAUSTIVE,
        },
        {
                "r.ppois",
                "ff|bb",
                help_r_ppois,
-               gnumeric_r_ppois, NULL, NULL, NULL,
+               gnumeric_r_ppois, NULL,
                GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_EXHAUSTIVE,
        },
        {
                "r.qpois",
                "ff|bb",
                help_r_qpois,
-               gnumeric_r_qpois, NULL, NULL, NULL,
+               gnumeric_r_qpois, NULL,
                GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_NO_TESTSUITE,
        },
        {
                "r.drayleigh",
                "ff|b",
                help_r_drayleigh,
-               gnumeric_r_drayleigh, NULL, NULL, NULL,
+               gnumeric_r_drayleigh, NULL,
                GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_NO_TESTSUITE,
        },
        {
                "r.prayleigh",
                "ff|bb",
                help_r_prayleigh,
-               gnumeric_r_prayleigh, NULL, NULL, NULL,
+               gnumeric_r_prayleigh, NULL,
                GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_NO_TESTSUITE,
        },
        {
                "r.qrayleigh",
                "ff|bb",
                help_r_qrayleigh,
-               gnumeric_r_qrayleigh, NULL, NULL, NULL,
+               gnumeric_r_qrayleigh, NULL,
                GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_NO_TESTSUITE,
        },
        {
                "r.dsnorm",
                "ffff|b",
                help_r_dsnorm,
-               gnumeric_r_dsnorm, NULL, NULL, NULL,
+               gnumeric_r_dsnorm, NULL,
                GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_NO_TESTSUITE,
        },
        {
                "r.psnorm",
                "ffff|bb",
                help_r_psnorm,
-               gnumeric_r_psnorm, NULL, NULL, NULL,
+               gnumeric_r_psnorm, NULL,
                GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_NO_TESTSUITE,
        },
        {
                "r.qsnorm",
                "ffff|bb",
                help_r_qsnorm,
-               gnumeric_r_qsnorm, NULL, NULL, NULL,
+               gnumeric_r_qsnorm, NULL,
                GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_NO_TESTSUITE,
        },
        {
                "r.dst",
                "fff|b",
                help_r_dst,
-               gnumeric_r_dst, NULL, NULL, NULL,
+               gnumeric_r_dst, NULL,
                GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_NO_TESTSUITE,
        },
        {
                "r.pst",
                "fff|bb",
                help_r_pst,
-               gnumeric_r_pst, NULL, NULL, NULL,
+               gnumeric_r_pst, NULL,
                GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_NO_TESTSUITE,
        },
        {
                "r.qst",
                "fff|bb",
                help_r_qst,
-               gnumeric_r_qst, NULL, NULL, NULL,
+               gnumeric_r_qst, NULL,
                GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_NO_TESTSUITE,
        },
        {
                "r.dt",
                "ff|b",
                help_r_dt,
-               gnumeric_r_dt, NULL, NULL, NULL,
+               gnumeric_r_dt, NULL,
                GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_EXHAUSTIVE,
        },
        {
                "r.pt",
                "ff|bb",
                help_r_pt,
-               gnumeric_r_pt, NULL, NULL, NULL,
+               gnumeric_r_pt, NULL,
                GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_EXHAUSTIVE,
        },
        {
                "r.qt",
                "ff|bb",
                help_r_qt,
-               gnumeric_r_qt, NULL, NULL, NULL,
+               gnumeric_r_qt, NULL,
                GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_EXHAUSTIVE,
        },
        {
                "r.ptukey",
                "fff|fbb",
                help_r_ptukey,
-               gnumeric_r_ptukey, NULL, NULL, NULL,
+               gnumeric_r_ptukey, NULL,
                GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_NO_TESTSUITE,
        },
        {
                "r.qtukey",
                "fff|fbb",
                help_r_qtukey,
-               gnumeric_r_qtukey, NULL, NULL, NULL,
+               gnumeric_r_qtukey, NULL,
                GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_NO_TESTSUITE,
        },
        {
                "r.dweibull",
                "fff|b",
                help_r_dweibull,
-               gnumeric_r_dweibull, NULL, NULL, NULL,
+               gnumeric_r_dweibull, NULL,
                GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_EXHAUSTIVE,
        },
        {
                "r.pweibull",
                "fff|bb",
                help_r_pweibull,
-               gnumeric_r_pweibull, NULL, NULL, NULL,
+               gnumeric_r_pweibull, NULL,
                GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_EXHAUSTIVE,
        },
        {
                "r.qweibull",
                "fff|bb",
                help_r_qweibull,
-               gnumeric_r_qweibull, NULL, NULL, NULL,
+               gnumeric_r_qweibull, NULL,
                GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_EXHAUSTIVE,
        },
        { NULL }
diff --git a/plugins/fn-r/generate b/plugins/fn-r/generate
index f429b3f3c..2c6783118 100644
--- a/plugins/fn-r/generate
+++ b/plugins/fn-r/generate
@@ -455,7 +455,7 @@ sub distribution {
                  "\t\t\"r.$func\",\n" .
                  "\t\t\"$typespec\",\n" .
                  "\t\thelp_r_$func,\n" .
-                 "\t\tgnumeric_r_$func, NULL, NULL, NULL,\n" .
+                 "\t\tgnumeric_r_$func, NULL,\n" .
                  "\t\tGNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, 
GNM_FUNC_TEST_STATUS_$test_status,\n" .
                  "\t},\n");
 }
diff --git a/plugins/fn-random/functions.c b/plugins/fn-random/functions.c
index b1e09e1c9..f88a6de1e 100644
--- a/plugins/fn-random/functions.c
+++ b/plugins/fn-random/functions.c
@@ -971,139 +971,139 @@ gnumeric_randstdist (GnmFuncEvalInfo *ei, GnmValue const * const *argv)
 
 GnmFuncDescriptor const random_functions[] = {
        { "rand",    "", help_rand,
-         gnumeric_rand, NULL, NULL, NULL,
+         gnumeric_rand, NULL,
          GNM_FUNC_SIMPLE | GNM_FUNC_VOLATILE,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
         { "randbernoulli", "f",    help_randbernoulli,
-         gnumeric_randbernoulli, NULL, NULL, NULL,
+         gnumeric_randbernoulli, NULL,
          GNM_FUNC_SIMPLE | GNM_FUNC_VOLATILE,
          GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
         { "randbeta", "ff",    help_randbeta,
-         gnumeric_randbeta, NULL, NULL, NULL,
+         gnumeric_randbeta, NULL,
          GNM_FUNC_SIMPLE | GNM_FUNC_VOLATILE,
          GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
         { "randbetween", "ff",  help_randbetween,
-         gnumeric_randbetween, NULL, NULL, NULL,
+         gnumeric_randbetween, NULL,
          GNM_FUNC_SIMPLE | GNM_FUNC_VOLATILE,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
         { "randbinom", "ff",  help_randbinom,
-         gnumeric_randbinom, NULL, NULL, NULL,
+         gnumeric_randbinom, NULL,
          GNM_FUNC_SIMPLE | GNM_FUNC_VOLATILE,
          GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
         { "randcauchy", "f",    help_randcauchy,
-         gnumeric_randcauchy, NULL, NULL, NULL,
+         gnumeric_randcauchy, NULL,
          GNM_FUNC_SIMPLE | GNM_FUNC_VOLATILE,
          GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
         { "randchisq", "f",    help_randchisq,
-         gnumeric_randchisq, NULL, NULL, NULL,
+         gnumeric_randchisq, NULL,
          GNM_FUNC_SIMPLE | GNM_FUNC_VOLATILE,
          GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
        { "randdiscrete", "r|r",
-         help_randdiscrete, gnumeric_randdiscrete, NULL, NULL, NULL,
+         help_randdiscrete, gnumeric_randdiscrete, NULL,
          GNM_FUNC_SIMPLE | GNM_FUNC_VOLATILE,
          GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
        { "randexp", "f",          help_randexp,
-         gnumeric_randexp, NULL, NULL, NULL,
+         gnumeric_randexp, NULL,
          GNM_FUNC_SIMPLE | GNM_FUNC_VOLATILE,
          GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
         { "randexppow", "ff",          help_randexppow,
-         gnumeric_randexppow, NULL, NULL, NULL,
+         gnumeric_randexppow, NULL,
          GNM_FUNC_SIMPLE | GNM_FUNC_VOLATILE,
          GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_NO_TESTSUITE },
         { "randfdist", "ff",       help_randfdist,
-         gnumeric_randfdist, NULL, NULL, NULL,
+         gnumeric_randfdist, NULL,
          GNM_FUNC_SIMPLE | GNM_FUNC_VOLATILE,
          GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
         { "randgamma", "ff",     help_randgamma,
-         gnumeric_randgamma, NULL, NULL, NULL,
+         gnumeric_randgamma, NULL,
          GNM_FUNC_SIMPLE | GNM_FUNC_VOLATILE,
          GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
         { "randnormtail", "ff",     help_randnormtail,
-         gnumeric_randnormtail, NULL, NULL, NULL,
+         gnumeric_randnormtail, NULL,
          GNM_FUNC_SIMPLE | GNM_FUNC_VOLATILE,
          GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_NO_TESTSUITE },
         { "randgeom", "f",     help_randgeom,
-         gnumeric_randgeom, NULL, NULL, NULL,
+         gnumeric_randgeom, NULL,
          GNM_FUNC_SIMPLE | GNM_FUNC_VOLATILE,
          GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
         { "randgumbel", "ff|f",     help_randgumbel,
-         gnumeric_randgumbel, NULL, NULL, NULL,
+         gnumeric_randgumbel, NULL,
          GNM_FUNC_SIMPLE | GNM_FUNC_VOLATILE,
          GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_NO_TESTSUITE },
         { "randhyperg", "fff",     help_randhyperg,
-         gnumeric_randhyperg, NULL, NULL, NULL,
+         gnumeric_randhyperg, NULL,
          GNM_FUNC_SIMPLE | GNM_FUNC_VOLATILE,
          GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
         { "randlandau", "", help_randlandau,
-         gnumeric_randlandau, NULL, NULL, NULL,
+         gnumeric_randlandau, NULL,
          GNM_FUNC_SIMPLE | GNM_FUNC_VOLATILE,
          GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_NO_TESTSUITE },
         { "randlaplace", "f",  help_randlaplace,
-         gnumeric_randlaplace, NULL, NULL, NULL,
+         gnumeric_randlaplace, NULL,
          GNM_FUNC_SIMPLE | GNM_FUNC_VOLATILE,
          GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_NO_TESTSUITE },
         { "randlevy", "ff|f",  help_randlevy,
-         gnumeric_randlevy, NULL, NULL, NULL,
+         gnumeric_randlevy, NULL,
          GNM_FUNC_SIMPLE | GNM_FUNC_VOLATILE,
          GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_NO_TESTSUITE },
         { "randlog", "f",  help_randlog,
-         gnumeric_randlog, NULL, NULL, NULL,
+         gnumeric_randlog, NULL,
          GNM_FUNC_SIMPLE | GNM_FUNC_VOLATILE,
          GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
         { "randlogistic", "f",  help_randlogistic,
-         gnumeric_randlogistic, NULL, NULL, NULL,
+         gnumeric_randlogistic, NULL,
          GNM_FUNC_SIMPLE | GNM_FUNC_VOLATILE,
          GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_NO_TESTSUITE },
         { "randlognorm", "ff",  help_randlognorm,
-         gnumeric_randlognorm, NULL, NULL, NULL,
+         gnumeric_randlognorm, NULL,
          GNM_FUNC_SIMPLE | GNM_FUNC_VOLATILE,
          GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
         { "randnegbinom", "ff",  help_randnegbinom,
-         gnumeric_randnegbinom, NULL, NULL, NULL,
+         gnumeric_randnegbinom, NULL,
          GNM_FUNC_SIMPLE | GNM_FUNC_VOLATILE,
          GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
         { "randnorm", "ff",  help_randnorm,
-         gnumeric_randnorm, NULL, NULL, NULL,
+         gnumeric_randnorm, NULL,
          GNM_FUNC_SIMPLE | GNM_FUNC_VOLATILE,
          GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
         { "randpareto", "ff",  help_randpareto,
-         gnumeric_randpareto, NULL, NULL, NULL,
+         gnumeric_randpareto, NULL,
          GNM_FUNC_SIMPLE | GNM_FUNC_VOLATILE,
          GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_NO_TESTSUITE },
         { "randpoisson", "f",  help_randpoisson,
-         gnumeric_randpoisson, NULL, NULL, NULL,
+         gnumeric_randpoisson, NULL,
          GNM_FUNC_SIMPLE | GNM_FUNC_VOLATILE,
          GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
         { "randrayleigh", "f",  help_randrayleigh,
-         gnumeric_randrayleigh, NULL, NULL, NULL,
+         gnumeric_randrayleigh, NULL,
          GNM_FUNC_SIMPLE | GNM_FUNC_VOLATILE,
          GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
         { "randrayleightail", "ff",  help_randrayleightail,
-         gnumeric_randrayleightail, NULL, NULL, NULL,
+         gnumeric_randrayleightail, NULL,
          GNM_FUNC_SIMPLE | GNM_FUNC_VOLATILE,
          GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_NO_TESTSUITE },
         { "randsnorm", "|fff",  help_randsnorm,
-         gnumeric_randsnorm, NULL, NULL, NULL,
+         gnumeric_randsnorm, NULL,
          GNM_FUNC_SIMPLE | GNM_FUNC_VOLATILE,
          GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
         { "randstdist", "ff",  help_randstdist,
-         gnumeric_randstdist, NULL, NULL, NULL,
+         gnumeric_randstdist, NULL,
          GNM_FUNC_SIMPLE | GNM_FUNC_VOLATILE,
          GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_NO_TESTSUITE },
         { "randtdist", "f",  help_randtdist,
-         gnumeric_randtdist, NULL, NULL, NULL,
+         gnumeric_randtdist, NULL,
          GNM_FUNC_SIMPLE | GNM_FUNC_VOLATILE,
          GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
         { "randuniform", "ff",  help_randuniform,
-         gnumeric_randuniform, NULL, NULL, NULL,
+         gnumeric_randuniform, NULL,
          GNM_FUNC_SIMPLE | GNM_FUNC_VOLATILE,
          GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
         { "randweibull", "ff",  help_randweibull,
-         gnumeric_randweibull, NULL, NULL, NULL,
+         gnumeric_randweibull, NULL,
          GNM_FUNC_SIMPLE | GNM_FUNC_VOLATILE,
          GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
        { "simtable", NULL,  help_simtable,
-         NULL, gnumeric_simtable, NULL, NULL,
+         NULL, gnumeric_simtable,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_NO_TESTSUITE },
 
         {NULL}
diff --git a/plugins/fn-stat/functions.c b/plugins/fn-stat/functions.c
index 59ce410ba..945f2f30b 100644
--- a/plugins/fn-stat/functions.c
+++ b/plugins/fn-stat/functions.c
@@ -5321,369 +5321,369 @@ gnumeric_adtest (GnmFuncEvalInfo *ei, GnmValue const * const *argv)
 
 GnmFuncDescriptor const stat_functions[] = {
        { "adtest",       "A",
-         help_adtest, gnumeric_adtest, NULL, NULL, NULL,
+         help_adtest, gnumeric_adtest, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC,
          GNM_FUNC_TEST_STATUS_NO_TESTSUITE},
        { "sftest",       "A",
-         help_sftest, gnumeric_sftest, NULL, NULL, NULL,
+         help_sftest, gnumeric_sftest, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC,
          GNM_FUNC_TEST_STATUS_NO_TESTSUITE},
        { "cvmtest",       "A",
-         help_cvmtest, gnumeric_cvmtest, NULL, NULL, NULL,
+         help_cvmtest, gnumeric_cvmtest, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC,
          GNM_FUNC_TEST_STATUS_NO_TESTSUITE},
        { "lkstest",       "A",
-         help_lkstest, gnumeric_lkstest, NULL, NULL, NULL,
+         help_lkstest, gnumeric_lkstest, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC,
          GNM_FUNC_TEST_STATUS_NO_TESTSUITE},
        { "avedev", NULL,
-         help_avedev, NULL, gnumeric_avedev, NULL, NULL,
+         help_avedev, NULL, gnumeric_avedev,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_FIRST,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "average", NULL,
-         help_average, NULL, gnumeric_average, NULL, NULL,
+         help_average, NULL, gnumeric_average,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_FIRST,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "averagea", NULL,
-         help_averagea, NULL, gnumeric_averagea, NULL, NULL,
+         help_averagea, NULL, gnumeric_averagea,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_FIRST,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
 
        { "bernoulli", "ff",    help_bernoulli,
-         gnumeric_bernoulli, NULL, NULL, NULL,
+         gnumeric_bernoulli, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
 
        { "betadist",     "fff|ff",
-         help_betadist, gnumeric_betadist, NULL, NULL, NULL,
+         help_betadist, gnumeric_betadist, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "beta.dist",     "fffb|ff",
-         help_beta_dist, gnumeric_beta_dist, NULL, NULL, NULL,
+         help_beta_dist, gnumeric_beta_dist, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "betainv",      "fff|ff",
-         help_betainv, gnumeric_betainv, NULL, NULL, NULL,
+         help_betainv, gnumeric_betainv, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "binomdist",    "fffb",
-         help_binomdist, gnumeric_binomdist, NULL, NULL, NULL,
+         help_binomdist, gnumeric_binomdist, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "binom.dist.range",    "fff|f",
-         help_binom_dist_range, gnumeric_binom_dist_range, NULL, NULL, NULL,
+         help_binom_dist_range, gnumeric_binom_dist_range, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_NO_TESTSUITE },
 
        { "cauchy", "ffb",    help_cauchy,
-         gnumeric_cauchy, NULL, NULL, NULL,
+         gnumeric_cauchy, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
 
        { "chidist",      "ff",
-         help_chidist, gnumeric_chidist, NULL, NULL, NULL,
+         help_chidist, gnumeric_chidist, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "chiinv",       "ff",
-         help_chiinv, gnumeric_chiinv, NULL, NULL, NULL,
+         help_chiinv, gnumeric_chiinv, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "chitest",      "AA",
-         help_chitest, gnumeric_chitest, NULL, NULL, NULL,
+         help_chitest, gnumeric_chitest, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "confidence",   "fff",
-         help_confidence, gnumeric_confidence, NULL, NULL, NULL,
+         help_confidence, gnumeric_confidence, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "confidence.t",   "fff",
-         help_confidence_t, gnumeric_confidence_t, NULL, NULL, NULL,
+         help_confidence_t, gnumeric_confidence_t, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE,  GNM_FUNC_TEST_STATUS_NO_TESTSUITE},
        { "correl",       "AA",
-         help_correl, gnumeric_correl, NULL, NULL, NULL,
+         help_correl, gnumeric_correl, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "count", NULL,
-         help_count, NULL, gnumeric_count, NULL, NULL,
+         help_count, NULL, gnumeric_count,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_UNITLESS,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "counta", NULL,
-         help_counta, NULL, gnumeric_counta, NULL, NULL,
+         help_counta, NULL, gnumeric_counta,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_UNITLESS,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "covar",        "AA",
-         help_covar, gnumeric_covar, NULL, NULL, NULL,
+         help_covar, gnumeric_covar, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "covariance.s", "AA",
-         help_covariance_s, gnumeric_covariance_s, NULL, NULL, NULL,
+         help_covariance_s, gnumeric_covariance_s, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "critbinom",    "fff",
-         help_critbinom, gnumeric_critbinom, NULL, NULL, NULL,
+         help_critbinom, gnumeric_critbinom, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "devsq", NULL,
-         help_devsq, NULL, gnumeric_devsq, NULL, NULL,
+         help_devsq, NULL, gnumeric_devsq,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "expondist",    "ffb",
-         help_expondist, gnumeric_expondist, NULL, NULL, NULL,
+         help_expondist, gnumeric_expondist, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "fdist",        "fff",
-         help_fdist, gnumeric_fdist, NULL, NULL, NULL,
+         help_fdist, gnumeric_fdist, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "finv",         "fff",
-         help_finv, gnumeric_finv, NULL, NULL, NULL,
+         help_finv, gnumeric_finv, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "fisher",       "f",
-         help_fisher, gnumeric_fisher, NULL, NULL, NULL,
+         help_fisher, gnumeric_fisher, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "fisherinv",    "f",
-         help_fisherinv, gnumeric_fisherinv, NULL, NULL, NULL,
+         help_fisherinv, gnumeric_fisherinv, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "forecast",     "frr",
-         help_forecast, gnumeric_forecast, NULL, NULL, NULL,
+         help_forecast, gnumeric_forecast, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "frequency",    "AA",
-         help_frequency, gnumeric_frequency, NULL, NULL, NULL,
+         help_frequency, gnumeric_frequency, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "ftest",        "rr",
-         help_ftest, gnumeric_ftest, NULL, NULL, NULL,
+         help_ftest, gnumeric_ftest, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "gammadist",    "fffb",
-         help_gammadist, gnumeric_gammadist, NULL, NULL, NULL,
+         help_gammadist, gnumeric_gammadist, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "gammainv",     "fff",
-         help_gammainv, gnumeric_gammainv, NULL, NULL, NULL,
+         help_gammainv, gnumeric_gammainv, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "geomean", NULL,
-         help_geomean, NULL, gnumeric_geomean, NULL, NULL,
+         help_geomean, NULL, gnumeric_geomean,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_FIRST,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "growth",       "A|AAb",
-         help_growth, gnumeric_growth, NULL, NULL, NULL,
+         help_growth, gnumeric_growth, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "harmean", NULL,
-         help_harmean, NULL, gnumeric_harmean, NULL, NULL,
+         help_harmean, NULL, gnumeric_harmean,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_FIRST,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "hypgeomdist",  "ffff|b",
-         help_hypgeomdist, gnumeric_hypgeomdist, NULL, NULL, NULL,
+         help_hypgeomdist, gnumeric_hypgeomdist, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "intercept",    "AA",
-         help_intercept, gnumeric_intercept, NULL, NULL, NULL,
+         help_intercept, gnumeric_intercept, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "kurt", NULL,
-         help_kurt, NULL, gnumeric_kurt, NULL, NULL,
+         help_kurt, NULL, gnumeric_kurt,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "large", "Af",
-         help_large, gnumeric_large, NULL, NULL, NULL,
+         help_large, gnumeric_large, NULL,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_FIRST,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "leverage", "A",  help_leverage,
-         gnumeric_leverage, NULL, NULL, NULL,
+         gnumeric_leverage, NULL,
          GNM_FUNC_RETURNS_NON_SCALAR, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, 
GNM_FUNC_TEST_STATUS_NO_TESTSUITE },
        { "linest",       "A|Abb",
-         help_linest, gnumeric_linest, NULL, NULL, NULL,
+         help_linest, gnumeric_linest, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "logest",       "A|Abb",
-         help_logest, gnumeric_logest, NULL, NULL, NULL,
+         help_logest, gnumeric_logest, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "logfit",       "rr",
-         help_logfit, gnumeric_logfit, NULL, NULL, NULL,
+         help_logfit, gnumeric_logfit, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_NO_TESTSUITE },
        { "loginv",       "fff",
-         help_loginv, gnumeric_loginv, NULL, NULL, NULL,
+         help_loginv, gnumeric_loginv, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "lognormdist",  "fff",
-         help_lognormdist, gnumeric_lognormdist, NULL, NULL, NULL,
+         help_lognormdist, gnumeric_lognormdist, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "logreg",       "A|Abb",
-         help_logreg, gnumeric_logreg, NULL, NULL, NULL,
+         help_logreg, gnumeric_logreg, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_NO_TESTSUITE },
        { "max", NULL,
-         help_max, NULL, gnumeric_max, NULL, NULL,
+         help_max, NULL, gnumeric_max,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_FIRST,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "maxa", NULL,
-         help_maxa, NULL, gnumeric_maxa, NULL, NULL,
+         help_maxa, NULL, gnumeric_maxa,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_FIRST,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "median", NULL,
-         help_median, NULL, gnumeric_median, NULL, NULL,
+         help_median, NULL, gnumeric_median,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_FIRST,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "min", NULL,
-         help_min, NULL, gnumeric_min, NULL, NULL,
+         help_min, NULL, gnumeric_min,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_FIRST,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "mina", NULL,
-         help_mina, NULL, gnumeric_mina, NULL, NULL,
+         help_mina, NULL, gnumeric_mina,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_FIRST,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "mode", NULL,
-         help_mode, NULL, gnumeric_mode, NULL, NULL,
+         help_mode, NULL, gnumeric_mode,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_FIRST,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "mode.mult", NULL,
-         help_mode_mult, NULL, gnumeric_mode_mult, NULL, NULL,
+         help_mode_mult, NULL, gnumeric_mode_mult,
          GNM_FUNC_SIMPLE,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_NO_TESTSUITE},
        { "negbinomdist", "fff",
-         help_negbinomdist, gnumeric_negbinomdist, NULL, NULL, NULL,
+         help_negbinomdist, gnumeric_negbinomdist, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "normdist",     "fffb",
-         help_normdist, gnumeric_normdist, NULL, NULL, NULL,
+         help_normdist, gnumeric_normdist, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "snorm.dist.range", "ff",
-         help_snorm_dist_range, gnumeric_snorm_dist_range, NULL, NULL, NULL,
+         help_snorm_dist_range, gnumeric_snorm_dist_range, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_NO_TESTSUITE,
        },
        { "norminv",      "fff",
-         help_norminv, gnumeric_norminv, NULL, NULL, NULL,
+         help_norminv, gnumeric_norminv, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "normsdist",    "f",
-         help_normsdist, gnumeric_normsdist, NULL, NULL, NULL,
+         help_normsdist, gnumeric_normsdist, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "normsinv",     "f",
-         help_normsinv, gnumeric_normsinv, NULL, NULL, NULL,
+         help_normsinv, gnumeric_normsinv, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "owent",    "ff",
-         help_owent, gnumeric_owent, NULL, NULL, NULL,
+         help_owent, gnumeric_owent, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_EXHAUSTIVE },
        { "pearson",      "AA",
-         help_pearson, gnumeric_pearson, NULL, NULL, NULL,
+         help_pearson, gnumeric_pearson, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "percentile",   "Af",
-         help_percentile, gnumeric_percentile, NULL, NULL, NULL,
+         help_percentile, gnumeric_percentile, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "percentile.exc",   "Af",
-         help_percentile_exc, gnumeric_percentile_exc, NULL, NULL, NULL,
+         help_percentile_exc, gnumeric_percentile_exc, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_NO_TESTSUITE},
        { "percentrank",  "Af|f",
-         help_percentrank, gnumeric_percentrank, NULL, NULL, NULL,
+         help_percentrank, gnumeric_percentrank, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "percentrank.exc",  "Af|f",
-         help_percentrank_exc, gnumeric_percentrank_exc, NULL, NULL, NULL,
+         help_percentrank_exc, gnumeric_percentrank_exc, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_NO_TESTSUITE},
        { "permut",       "ff",
-         help_permut, gnumeric_permut, NULL, NULL, NULL,
+         help_permut, gnumeric_permut, NULL,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_UNITLESS,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "poisson",      "ffb",
-         help_poisson, gnumeric_poisson, NULL, NULL, NULL,
+         help_poisson, gnumeric_poisson, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "prob",         "AAf|f",
-         help_prob, gnumeric_prob, NULL, NULL, NULL,
+         help_prob, gnumeric_prob, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "quartile",     "Af",
-         help_quartile, gnumeric_quartile, NULL, NULL, NULL,
+         help_quartile, gnumeric_quartile, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "quartile.exc",     "Af",
-         help_quartile_exc, gnumeric_quartile_exc, NULL, NULL, NULL,
+         help_quartile_exc, gnumeric_quartile_exc, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_NO_TESTSUITE},
        { "rank",         "fr|b",
-         help_rank, gnumeric_rank, NULL, NULL, NULL,
+         help_rank, gnumeric_rank, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "rank.avg",         "fr|b",
-         help_rank_avg, gnumeric_rank_avg, NULL, NULL, NULL,
+         help_rank_avg, gnumeric_rank_avg, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_NO_TESTSUITE},
        { "slope",        "AA",
-         help_slope, gnumeric_slope, NULL, NULL, NULL,
+         help_slope, gnumeric_slope, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "small", "Af",
-         help_small, gnumeric_small, NULL, NULL, NULL,
+         help_small, gnumeric_small, NULL,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_FIRST,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "standardize",  "fff",
-         help_standardize, gnumeric_standardize, NULL, NULL, NULL,
+         help_standardize, gnumeric_standardize, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "ssmedian",   "A|f",
-         help_ssmedian, gnumeric_ssmedian, NULL, NULL, NULL,
+         help_ssmedian, gnumeric_ssmedian, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_NO_TESTSUITE },
        { "stdev", NULL,
-         help_stdev, NULL, gnumeric_stdev, NULL, NULL,
+         help_stdev, NULL, gnumeric_stdev,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_FIRST,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "stdeva", NULL,
-         help_stdeva, NULL, gnumeric_stdeva, NULL, NULL,
+         help_stdeva, NULL, gnumeric_stdeva,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_FIRST,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "stdevp", NULL,
-         help_stdevp, NULL, gnumeric_stdevp, NULL, NULL,
+         help_stdevp, NULL, gnumeric_stdevp,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_FIRST,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "stdevpa", NULL,
-         help_stdevpa, NULL, gnumeric_stdevpa, NULL, NULL,
+         help_stdevpa, NULL, gnumeric_stdevpa,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_FIRST,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "steyx",        "AA",
-         help_steyx, gnumeric_steyx, NULL, NULL, NULL,
+         help_steyx, gnumeric_steyx, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "rsq",          "AA",
-         help_rsq, gnumeric_rsq, NULL, NULL, NULL,
+         help_rsq, gnumeric_rsq, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "skew", NULL,
-         help_skew, NULL, gnumeric_skew, NULL, NULL,
+         help_skew, NULL, gnumeric_skew,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "tdist",        "fff",
-         help_tdist, gnumeric_tdist, NULL, NULL, NULL,
+         help_tdist, gnumeric_tdist, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "tinv",         "ff",
-         help_tinv, gnumeric_tinv, NULL, NULL, NULL,
+         help_tinv, gnumeric_tinv, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "trend",        "A|AAb",
-         help_trend, gnumeric_trend, NULL, NULL, NULL,
+         help_trend, gnumeric_trend, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "trimmean",     "rf",
-         help_trimmean, gnumeric_trimmean, NULL, NULL, NULL,
+         help_trimmean, gnumeric_trimmean, NULL,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_FIRST,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "ttest",        "rrff",
-         help_ttest, gnumeric_ttest, NULL, NULL, NULL,
+         help_ttest, gnumeric_ttest, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "var", NULL,
-         help_var, NULL, gnumeric_var, NULL, NULL,
+         help_var, NULL, gnumeric_var,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "vara", NULL,
-         help_vara, NULL, gnumeric_vara, NULL, NULL,
+         help_vara, NULL, gnumeric_vara,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "varp", NULL,
-         help_varp, NULL, gnumeric_varp, NULL, NULL,
+         help_varp, NULL, gnumeric_varp,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "varpa", NULL,
-         help_varpa, NULL, gnumeric_varpa, NULL, NULL,
+         help_varpa, NULL, gnumeric_varpa,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "weibull",      "fffb",
-         help_weibull, gnumeric_weibull, NULL, NULL, NULL,
+         help_weibull, gnumeric_weibull, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "ztest", "Af|f",
-         help_ztest, gnumeric_ztest, NULL, NULL, NULL,
+         help_ztest, gnumeric_ztest, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
 
        { "exppowdist", "fff",          help_exppowdist,
-         gnumeric_exppowdist, NULL, NULL, NULL,
+         gnumeric_exppowdist, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_NO_TESTSUITE },
        { "geomdist", "ffb",     help_geomdist,
-         gnumeric_geomdist, NULL, NULL, NULL,
+         gnumeric_geomdist, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_NO_TESTSUITE },
        { "kurtp", NULL,
-         help_kurtp, NULL, gnumeric_kurtp, NULL, NULL,
+         help_kurtp, NULL, gnumeric_kurtp,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_NO_TESTSUITE },
        { "landau", "f",  help_landau,
-         gnumeric_landau, NULL, NULL, NULL,
+         gnumeric_landau, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_NO_TESTSUITE },
        { "laplace", "ff",  help_laplace,
-         gnumeric_laplace, NULL, NULL, NULL,
+         gnumeric_laplace, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_NO_TESTSUITE },
        { "logistic", "ff",  help_logistic,
-         gnumeric_logistic, NULL, NULL, NULL,
+         gnumeric_logistic, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_NO_TESTSUITE },
        { "pareto", "fff",  help_pareto,
-         gnumeric_pareto, NULL, NULL, NULL,
+         gnumeric_pareto, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_NO_TESTSUITE },
        { "rayleigh", "ff",  help_rayleigh,
-         gnumeric_rayleigh, NULL, NULL, NULL,
+         gnumeric_rayleigh, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_NO_TESTSUITE },
        { "rayleightail", "fff",  help_rayleightail,
-         gnumeric_rayleightail, NULL, NULL, NULL,
+         gnumeric_rayleightail, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_NO_TESTSUITE },
        { "skewp", NULL,
-         help_skewp, NULL, gnumeric_skewp, NULL, NULL,
+         help_skewp, NULL, gnumeric_skewp,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_NO_TESTSUITE },
        { "subtotal", NULL,
-         help_subtotal,    NULL, gnumeric_subtotal, NULL, NULL,
+         help_subtotal,    NULL, gnumeric_subtotal,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
        { "cronbach", NULL,
-         help_cronbach, NULL, gnumeric_cronbach, NULL, NULL,
+         help_cronbach, NULL, gnumeric_cronbach,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_NO_TESTSUITE },
        { "permutationa",   "ff",       help_permutationa,
-         gnumeric_permutationa, NULL, NULL, NULL,
+         gnumeric_permutationa, NULL,
          GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_UNITLESS,
          GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_NO_TESTSUITE },
 
diff --git a/plugins/fn-string/functions.c b/plugins/fn-string/functions.c
index f5a75aa9a..5789eeced 100644
--- a/plugins/fn-string/functions.c
+++ b/plugins/fn-string/functions.c
@@ -1753,115 +1753,115 @@ gnumeric_jis (GnmFuncEvalInfo *ei, GnmValue const * const *argv)
 /***************************************************************************/
 GnmFuncDescriptor const string_functions[] = {
         { "asc",       "s",                       help_asc,
-         gnumeric_asc, NULL, NULL, NULL,
+         gnumeric_asc, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_NO_TESTSUITE },
         { "char",       "f",                       help_char,
-         gnumeric_char, NULL, NULL, NULL,
+         gnumeric_char, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
         { "unichar",    "f",                       help_unichar,
-         gnumeric_unichar, NULL, NULL, NULL,
+         gnumeric_unichar, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_BASIC },
         { "clean",      "S",                         help_clean,
-          gnumeric_clean, NULL, NULL, NULL,
+          gnumeric_clean, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
         { "code",       "S",                         help_code,
-         gnumeric_code, NULL, NULL, NULL,
+         gnumeric_code, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
         { "unicode",    "S",                         help_unicode,
-         gnumeric_unicode, NULL, NULL, NULL,
+         gnumeric_unicode, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_BASIC },
         { "concat", NULL,               help_concat,
-         NULL, gnumeric_concat, NULL, NULL,
+         NULL, gnumeric_concat,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
         { "concatenate", NULL,               help_concatenate,
-         NULL, gnumeric_concatenate, NULL, NULL,
+         NULL, gnumeric_concatenate,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
         { "dollar",     "f|f",               help_dollar,
-         gnumeric_dollar, NULL, NULL, NULL,
+         gnumeric_dollar, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
         { "exact",      "SS",                 help_exact,
-         gnumeric_exact, NULL, NULL, NULL,
+         gnumeric_exact, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
         { "find",       "SS|f",           help_find,
-         gnumeric_find, NULL, NULL, NULL,
+         gnumeric_find, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
         { "findb",       "SS|f",           help_findb,
-         gnumeric_findb, NULL, NULL, NULL,
+         gnumeric_findb, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_NO_TESTSUITE },
         { "fixed",      "f|fb",        help_fixed,
-         gnumeric_fixed, NULL, NULL, NULL,
+         gnumeric_fixed, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
         { "jis",       "s",                       help_jis,
-         gnumeric_jis, NULL, NULL, NULL,
+         gnumeric_jis, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_NO_TESTSUITE },
         { "left",       "S|f",             help_left,
-         gnumeric_left, NULL, NULL, NULL,
+         gnumeric_left, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
         { "leftb",       "S|f",             help_leftb,
-         gnumeric_leftb, NULL, NULL, NULL,
+         gnumeric_leftb, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_NO_TESTSUITE },
         { "len",        "S",                         help_len,
-         gnumeric_len, NULL, NULL, NULL,
+         gnumeric_len, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
         { "lenb",       "S",                         help_lenb,
-         gnumeric_lenb, NULL, NULL, NULL,
+         gnumeric_lenb, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_NO_TESTSUITE },
         { "lower",      "S",                         help_lower,
-         gnumeric_lower, NULL, NULL, NULL,
+         gnumeric_lower, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
         { "mid",        "Sff",               help_mid,
-         gnumeric_mid, NULL, NULL, NULL,
+         gnumeric_mid, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
         { "midb",        "Sff",               help_midb,
-         gnumeric_midb, NULL, NULL, NULL,
+         gnumeric_midb, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_NO_TESTSUITE },
         { "numbervalue",      "SS",          help_numbervalue,
-         gnumeric_numbervalue, NULL, NULL, NULL,
+         gnumeric_numbervalue, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_BASIC },
         { "proper",     "S",                         help_proper,
-         gnumeric_proper, NULL, NULL, NULL,
+         gnumeric_proper, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
         { "replace",    "SffS",         help_replace,
-         gnumeric_replace, NULL, NULL, NULL,
+         gnumeric_replace, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
         { "replaceb",    "SffS",         help_replaceb,
-         gnumeric_replaceb, NULL, NULL, NULL,
+         gnumeric_replaceb, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_NO_TESTSUITE },
         { "rept",       "Sf",                    help_rept,
-         gnumeric_rept, NULL, NULL, NULL,
+         gnumeric_rept, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
         { "right",      "S|f",             help_right,
-         gnumeric_right, NULL, NULL, NULL,
+         gnumeric_right, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
         { "rightb",       "S|f",             help_rightb,
-         gnumeric_rightb, NULL, NULL, NULL,
+         gnumeric_rightb, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_NO_TESTSUITE },
         { "search",     "SS|f",     help_search,
-         gnumeric_search, NULL, NULL, NULL,
+         gnumeric_search, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
         { "searchb",     "SS|f",     help_searchb,
-         gnumeric_searchb, NULL, NULL, NULL,
+         gnumeric_searchb, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_NO_TESTSUITE },
         { "substitute", "SSS|f",        help_substitute,
-         gnumeric_substitute, NULL, NULL, NULL,
+         gnumeric_substitute, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
         { "t",          "S",                        help_t_,
-          gnumeric_t_, NULL, NULL, NULL,
+          gnumeric_t_, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
         { "text",       "Ss",           help_text,
-         gnumeric_text, NULL, NULL, NULL,
+         gnumeric_text, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
         { "textjoin", NULL, help_textjoin,
-         NULL, gnumeric_textjoin, NULL, NULL,
+         NULL, gnumeric_textjoin,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_NO_TESTSUITE },
         { "trim",       "S",                         help_trim,
-         gnumeric_trim, NULL, NULL, NULL,
+         gnumeric_trim, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
         { "upper",      "S",                         help_upper,
-         gnumeric_upper, NULL, NULL, NULL,
+         gnumeric_upper, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
         { "value",      "S",                         help_value,
-         gnumeric_value, NULL, NULL, NULL,
+         gnumeric_value, NULL,
          GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
 
         {NULL}
diff --git a/plugins/fn-tsa/functions.c b/plugins/fn-tsa/functions.c
index bbf95b3a5..df1c74f0c 100644
--- a/plugins/fn-tsa/functions.c
+++ b/plugins/fn-tsa/functions.c
@@ -1070,20 +1070,20 @@ gnumeric_hpfilter (GnmFuncEvalInfo *ei, GnmValue const * const *argv)
 const GnmFuncDescriptor TimeSeriesAnalysis_functions[] = {
 
         { "interpolation",       "AAA|f",
-         help_interpolation, gnumeric_interpolation, NULL, NULL, NULL,
+         help_interpolation, gnumeric_interpolation, NULL,
          GNM_FUNC_RETURNS_NON_SCALAR, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
 
        { "periodogram",       "A|fAff",
-         help_periodogram, gnumeric_periodogram, NULL, NULL, NULL,
+         help_periodogram, gnumeric_periodogram, NULL,
          GNM_FUNC_RETURNS_NON_SCALAR, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
 
        { "fourier",       "A|bb",
-         help_fourier, gnumeric_fourier, NULL, NULL, NULL,
+         help_fourier, gnumeric_fourier, NULL,
          GNM_FUNC_RETURNS_NON_SCALAR, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
 
        { "hpfilter",       "A|f",
-         help_hpfilter, gnumeric_hpfilter, NULL, NULL, NULL,
+         help_hpfilter, gnumeric_hpfilter, NULL,
          GNM_FUNC_RETURNS_NON_SCALAR, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
 
-       {NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, 0}
+       {NULL}
 };
diff --git a/plugins/python-loader/py-gnumeric.c b/plugins/python-loader/py-gnumeric.c
index da2454fac..b09df5a54 100644
--- a/plugins/python-loader/py-gnumeric.c
+++ b/plugins/python-loader/py-gnumeric.c
@@ -1947,7 +1947,7 @@ py_GnumericFunc_object_dealloc (py_GnumericFunc_object *self)
 {
        g_return_if_fail (self != NULL);
 
-       gnm_func_unref (self->fn_def);
+       gnm_func_dec_usage (self->fn_def);
        g_free (self->eval_pos);
        PyObject_Del (self);
 }
@@ -1962,7 +1962,7 @@ py_new_GnumericFunc_object (GnmFunc *fn_def, const GnmEvalPos *opt_eval_pos)
                return NULL;
        }
 
-       gnm_func_ref (fn_def);
+       gnm_func_inc_usage (fn_def);
        self->fn_def = fn_def;
        if (opt_eval_pos != NULL) {
                self->eval_pos = g_new (GnmEvalPos, 1);
diff --git a/plugins/python-loader/python-loader.c b/plugins/python-loader/python-loader.c
index db772ad0d..1e5004707 100644
--- a/plugins/python-loader/python-loader.c
+++ b/plugins/python-loader/python-loader.c
@@ -471,7 +471,7 @@ call_python_function_args (GnmFuncEvalInfo *ei, GnmValue const * const *args)
        g_return_val_if_fail (args != NULL, NULL);
 
        fndef = ei->func_call->func;
-       service = (GOPluginService *) gnm_func_get_user_data (fndef);
+       service = (GOPluginService *)g_object_get_data (G_OBJECT (fndef), "service");
        loader_data = g_object_get_data (G_OBJECT (service), "loader_data");
        SWITCH_TO_PLUGIN (go_plugin_service_get_plugin (service));
        fn_info_tuple = PyDict_GetItemString (loader_data->python_fn_info_dict,
@@ -501,7 +501,7 @@ call_python_function_nodes (GnmFuncEvalInfo *ei,
        g_return_val_if_fail (ei->func_call != NULL, NULL);
 
        fndef = ei->func_call->func;
-       service = (GOPluginService *) gnm_func_get_user_data (fndef);
+       service = (GOPluginService *)g_object_get_data (G_OBJECT (fndef), "service");
        loader_data = g_object_get_data (G_OBJECT (service), "loader_data");
        SWITCH_TO_PLUGIN (go_plugin_service_get_plugin (service));
        python_fn = PyDict_GetItemString (loader_data->python_fn_info_dict,
@@ -643,24 +643,25 @@ python_function_get_gnumeric_help (PyObject *python_fn_info_dict, PyObject *pyth
        return (GnmFuncHelp const *) PyCObject_AsVoidPtr (cobject_help_value);
 }
 
-static gboolean
-gplp_func_desc_load (GOPluginService *service,
-                    char const *name,
-                    GnmFuncDescriptor *res)
+static void
+gplp_func_load_stub (GOPluginService *service,
+                    GnmFunc *func)
 {
        ServiceLoaderDataFunctionGroup *loader_data;
        PyObject *fn_info_obj;
+       char const *name;
 
-       g_return_val_if_fail (GNM_IS_PLUGIN_SERVICE_FUNCTION_GROUP (service), FALSE);
-       g_return_val_if_fail (name != NULL, FALSE);
+       g_return_if_fail (GNM_IS_PLUGIN_SERVICE_FUNCTION_GROUP (service));
+       g_return_if_fail (GNM_IS_FUNC (func));
 
+       name = gnm_func_get_name (func, FALSE);
        loader_data = g_object_get_data (G_OBJECT (service), "loader_data");
        SWITCH_TO_PLUGIN (go_plugin_service_get_plugin (service));
        fn_info_obj = PyDict_GetItemString (loader_data->python_fn_info_dict,
-                                           (gchar *) name);
+                                           (gchar *)name);
        if (fn_info_obj == NULL) {
                gnm_python_clear_error_if_needed (SERVICE_GET_LOADER (service)->py_object);
-               return FALSE;
+               return;
        }
 
        if (PyTuple_Check (fn_info_obj)) {
@@ -672,35 +673,36 @@ gplp_func_desc_load (GOPluginService *service,
                        PyString_Check (python_args) &&
                    (python_fn = PyTuple_GetItem (fn_info_obj, 2)) != NULL &&
                    PyCallable_Check (python_fn)) {
-                       res->arg_spec   = PyString_AsString (python_args);
-                       res->help       = python_function_get_gnumeric_help (
+                       func->fn.args.func      = &call_python_function_args;
+                       func->fn.args.arg_spec  = PyString_AsString (python_args);
+                       func->help      = python_function_get_gnumeric_help (
                                loader_data->python_fn_info_dict, python_fn, name);
-                       res->fn_args    = &call_python_function_args;
-                       res->fn_nodes   = NULL;
-                       res->linker     = NULL;
-                       res->impl_status = GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC;
-                       res->test_status = GNM_FUNC_TEST_STATUS_UNKNOWN;
-                       return TRUE;
+                       func->linker    = NULL;
+                       func->impl_status = GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC;
+                       func->test_status = GNM_FUNC_TEST_STATUS_UNKNOWN;
+                       gnm_func_set_function_type (func, GNM_FUNC_TYPE_ARGS);
+                       g_object_set_data (G_OBJECT (func), "service", service);
+                       return;
                }
 
                gnm_python_clear_error_if_needed (SERVICE_GET_LOADER (service)->py_object);
-               return FALSE;
+               return;
        }
 
        if (PyCallable_Check (fn_info_obj)) {
-               res->arg_spec   = "";
-               res->help       = python_function_get_gnumeric_help (
+               func->help      = python_function_get_gnumeric_help (
                        loader_data->python_fn_info_dict, fn_info_obj, name);
-               res->fn_args    = NULL;
-               res->fn_nodes   = &call_python_function_nodes;
-               res->linker     = NULL;
-               res->impl_status = GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC;
-               res->test_status = GNM_FUNC_TEST_STATUS_UNKNOWN;
-               return TRUE;
+               func->fn.nodes  = &call_python_function_nodes;
+               func->linker    = NULL;
+               func->impl_status = GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC;
+               func->test_status = GNM_FUNC_TEST_STATUS_UNKNOWN;
+               gnm_func_set_function_type (func, GNM_FUNC_TYPE_NODES);
+               g_object_set_data (G_OBJECT (func), "service", service);
+               return;
        }
 
        gnm_python_clear_error_if_needed (SERVICE_GET_LOADER (service)->py_object);
-       return FALSE;
+       return;
 }
 
 static void
@@ -726,7 +728,7 @@ gplp_load_service_function_group (GOPluginLoader *loader,
                ServiceLoaderDataFunctionGroup *loader_data;
 
                cbs = go_plugin_service_get_cbs (service);
-               cbs->func_desc_load = &gplp_func_desc_load;
+               cbs->load_stub = &gplp_func_load_stub;
 
                loader_data = g_new (ServiceLoaderDataFunctionGroup, 1);
                loader_data->python_fn_info_dict = (PyObject *) python_fn_info_dict;
diff --git a/plugins/sample_datasource/sample_datasource.c b/plugins/sample_datasource/sample_datasource.c
index 8bb658600..36e990a91 100644
--- a/plugins/sample_datasource/sample_datasource.c
+++ b/plugins/sample_datasource/sample_datasource.c
@@ -138,11 +138,86 @@ cb_atl_input (GIOChannel *gioc, GIOCondition cond, gpointer ignored)
        return TRUE;
 }
 
+static GnmValue *
+atl_last (GnmFuncEvalInfo *ei, GnmValue const * const argv[])
+{
+       WatchedValue *val = watched_value_fetch (value_peek_string (argv[0]));
+
+       Watcher key;
+       key.node = ei->func_call;
+       key.dep = ei->pos->dep;
+
+       g_return_val_if_fail (val != NULL,
+               value_new_error_NA (ei->pos));
+
+       /* If caller wants to be notified of updates */
+       if (key.node != NULL && key.dep != NULL) {
+               Watcher *w = g_hash_table_lookup (watchers, &key);
+               if (w == NULL) {
+                       w = g_new (Watcher, 1);
+                       key.value = val;
+                       *w = key;
+                       g_hash_table_insert (watchers, w, w);
+                       g_hash_table_insert (w->value->deps, w, w);
+               } else if (w->value != val) {
+                       g_hash_table_remove (w->value->deps, w);
+                       w->value = val;
+                       g_hash_table_insert (w->value->deps, w, w);
+               }
+       }
+
+       if (!val->valid)
+               return value_new_error_NA (ei->pos);
+       return value_new_float (val->value);
+}
+
+static int // GnmDependentFlags
+atl_last_link (GnmFunc *func, GnmFuncEvalInfo *ei, gboolean qlink)
+{
+       if (qlink) {
+               if (debug)
+                       g_printerr ("link atl_last\n");
+       } else {
+               Watcher key, *w;
+               key.node = ei->func_call;
+               key.dep = ei->pos->dep;
+
+               w = g_hash_table_lookup (watchers, &key);
+               if (w != NULL) {
+                       if (w->value != NULL)
+                               g_hash_table_remove (w->value->deps, w);
+                       g_free (w);
+               }
+               if (debug)
+                       g_printerr ("unlink atl_last\n");
+       }
+       return DEPENDENT_NO_FLAG;
+}
+
+static GnmFuncHelp const help_atl_last[] = {
+        { GNM_FUNC_HELP_NAME, F_("ATL_LAST:sample real-time data source")},
+        { GNM_FUNC_HELP_ARG, F_("tag:tag to watch")},
+       { GNM_FUNC_HELP_DESCRIPTION, F_("ATL_LAST is a sample implementation of a real time data source.  It 
takes a string tag and monitors the named pipe ~/atl for changes to the value of that tag.") },
+       { GNM_FUNC_HELP_NOTE, F_("This is not intended to be generally enabled and is OFF by default.") },
+       { GNM_FUNC_HELP_END }
+};
+
+GnmFuncDescriptor const ATL_functions[] = {
+       {"atl_last", "s", help_atl_last, atl_last, NULL,
+        GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC, GNM_FUNC_TEST_STATUS_NO_TESTSUITE
+       },
+
+       {NULL}
+};
+
 G_MODULE_EXPORT void
 go_plugin_init (GOPlugin *plugin, GOCmdContext *cc)
 {
        GIOChannel *channel = NULL;
        char *filename;
+       GnmFunc *atl_last = gnm_func_lookup ("atl_last", NULL);
+
+       g_signal_connect (atl_last, "link-dep", G_CALLBACK (atl_last_link), NULL);
 
        debug = gnm_debug_flag ("datasource");
 
@@ -213,73 +288,3 @@ go_plugin_shutdown (GOPlugin *plugin, GOCmdContext *cc)
        g_hash_table_destroy (watchers);
        watchers = NULL;
 }
-
-static GnmValue *
-atl_last (GnmFuncEvalInfo *ei, GnmValue const * const argv[])
-{
-       WatchedValue *val = watched_value_fetch (value_peek_string (argv[0]));
-
-       Watcher key;
-       key.node = ei->func_call;
-       key.dep = ei->pos->dep;
-
-       g_return_val_if_fail (val != NULL,
-               value_new_error_NA (ei->pos));
-
-       /* If caller wants to be notified of updates */
-       if (key.node != NULL && key.dep != NULL) {
-               Watcher *w = g_hash_table_lookup (watchers, &key);
-               if (w == NULL) {
-                       w = g_new (Watcher, 1);
-                       key.value = val;
-                       *w = key;
-                       g_hash_table_insert (watchers, w, w);
-                       g_hash_table_insert (w->value->deps, w, w);
-               } else if (w->value != val) {
-                       g_hash_table_remove (w->value->deps, w);
-                       w->value = val;
-                       g_hash_table_insert (w->value->deps, w, w);
-               }
-       }
-
-       if (!val->valid)
-               return value_new_error_NA (ei->pos);
-       return value_new_float (val->value);
-}
-
-static GnmDependentFlags
-atl_last_link (GnmFuncEvalInfo *ei, gboolean qlink)
-{
-       if (qlink) {
-               if (debug)
-                       g_printerr ("link atl_last\n");
-       } else {
-               Watcher key, *w;
-               key.node = ei->func_call;
-               key.dep = ei->pos->dep;
-
-               w = g_hash_table_lookup (watchers, &key);
-               if (w != NULL) {
-                       if (w->value != NULL)
-                               g_hash_table_remove (w->value->deps, w);
-                       g_free (w);
-               }
-               if (debug)
-                       g_printerr ("unlink atl_last\n");
-       }
-       return DEPENDENT_NO_FLAG;
-}
-
-static GnmFuncHelp const help_atl_last[] = {
-        { GNM_FUNC_HELP_NAME, F_("ATL_LAST:sample real-time data source")},
-        { GNM_FUNC_HELP_ARG, F_("tag:tag to watch")},
-       { GNM_FUNC_HELP_DESCRIPTION, F_("ATL_LAST is a sample implementation of a real time data source.  It 
takes a string tag and monitors the named pipe ~/atl for changes to the value of that tag.") },
-       { GNM_FUNC_HELP_NOTE, F_("This is not intended to be generally enabled and is OFF by default.") },
-       { GNM_FUNC_HELP_END }
-};
-
-GnmFuncDescriptor const ATL_functions[] = {
-       {"atl_last", "s", help_atl_last, atl_last, NULL, atl_last_link },
-
-       {NULL}
-};
diff --git a/src/consolidate.c b/src/consolidate.c
index 3be761adb..18e75df22 100644
--- a/src/consolidate.c
+++ b/src/consolidate.c
@@ -123,7 +123,7 @@ gnm_consolidate_free (GnmConsolidate *cs, gboolean content_only)
        if (cs->ref_count-- > 1)
                return;
        if (cs->fd) {
-               gnm_func_unref (cs->fd);
+               gnm_func_dec_usage (cs->fd);
                cs->fd = NULL;
        }
 
@@ -171,10 +171,10 @@ gnm_consolidate_set_function (GnmConsolidate *cs, GnmFunc *fd)
        g_return_if_fail (fd != NULL);
 
        if (cs->fd)
-               gnm_func_unref (cs->fd);
+               gnm_func_dec_usage (cs->fd);
 
        cs->fd = fd;
-       gnm_func_ref (fd);
+       gnm_func_inc_usage (fd);
 }
 
 void
diff --git a/src/dependent.c b/src/dependent.c
index b77a9cbf8..fad4407d1 100644
--- a/src/dependent.c
+++ b/src/dependent.c
@@ -1111,15 +1111,15 @@ link_unlink_expr_dep (GnmEvalPos *ep, GnmExpr const *tree, gboolean qlink)
         */
        case GNM_EXPR_OP_FUNCALL: {
                int i;
-               GnmDependentFlags flag = DEPENDENT_NO_FLAG;
+               GnmFuncEvalInfo fei;
+               GnmDependentFlags flag;
+
                if (tree->func.func->fn_type == GNM_FUNC_TYPE_STUB)
                        gnm_func_load_stub (tree->func.func);
-               if (tree->func.func->linker) {
-                       GnmFuncEvalInfo fei;
-                       fei.pos = ep;
-                       fei.func_call = &tree->func;
-                       flag = tree->func.func->linker (&fei, qlink);
-               }
+               fei.pos = ep;
+               fei.func_call = &tree->func;
+               flag = gnm_func_link_dep (tree->func.func, &fei, qlink);
+
                if (!(flag & DEPENDENT_IGNORE_ARGS))
                        for (i = 0; i < tree->func.argc; i++)
                                flag |= link_unlink_expr_dep (ep, tree->func.argv[i], qlink);
diff --git a/src/dialogs/dialog-function-select.c b/src/dialogs/dialog-function-select.c
index a3d636903..d03e141db 100644
--- a/src/dialogs/dialog-function-select.c
+++ b/src/dialogs/dialog-function-select.c
@@ -309,7 +309,7 @@ cb_unref (GtkTreeModel *model, G_GNUC_UNUSED GtkTreePath *path,
        gtk_tree_model_get (model, iter,
                            FUNCTION, &f,
                            -1);
-       gnm_func_unref (f);
+       gnm_func_dec_usage (f);
        return FALSE;
 }
 
@@ -1182,7 +1182,7 @@ dialog_function_select_load_tree (FunctionSelectState *state)
                if (!(func->flags &
                      (GNM_FUNC_INTERNAL | GNM_FUNC_IS_PLACEHOLDER))) {
                        gtk_list_store_append (state->model_functions, &iter);
-                       gnm_func_ref (func);
+                       gnm_func_inc_usage (func);
                        desc = dialog_function_select_get_description (func, &pal);
                        gtk_list_store_set
                                (state->model_functions, &iter,
diff --git a/src/expr.c b/src/expr.c
index c3dee50cb..cd355c46c 100644
--- a/src/expr.c
+++ b/src/expr.c
@@ -98,7 +98,7 @@ gnm_expr_new_funcallv (GnmFunc *func, int argc, GnmExprConstPtr *argv)
        ans = CHUNK_ALLOC (GnmExprFunction, expression_pool_small);
 
        ans->oper = GNM_EXPR_OP_FUNCALL;
-       gnm_func_ref (func);
+       gnm_func_inc_usage (func);
        ans->func = func;
        ans->argc = argc;
        ans->argv = argv;
@@ -479,7 +479,7 @@ gnm_expr_free (GnmExpr const *expr)
                for (i = 0; i < expr->func.argc; i++)
                        gnm_expr_free (expr->func.argv[i]);
                g_free (expr->func.argv);
-               gnm_func_unref (expr->func.func);
+               gnm_func_dec_usage (expr->func.func);
                CHUNK_FREE (expression_pool_small, (gpointer)expr);
                break;
        }
@@ -2236,6 +2236,12 @@ gnm_expr_relocate (GnmExpr const *expr, RelocInfoInternal const *rinfo)
        return gnm_expr_walk (expr, cb_relocate, (gpointer)rinfo);
 }
 
+/**
+ * gnm_expr_get_func_def:
+ * @expr: Function call expressions
+ *
+ * Returns: (transfer none): the called function.
+ */
 GnmFunc *
 gnm_expr_get_func_def (GnmExpr const *expr)
 {
@@ -2245,6 +2251,13 @@ gnm_expr_get_func_def (GnmExpr const *expr)
        return expr->func.func;
 }
 
+/**
+ * gnm_expr_get_func_arg:
+ * @expr: Function call expressions
+ * @i: argument index
+ *
+ * Returns: (transfer none): the @i'th argument of the function call @expr.
+ */
 GnmExpr const *
 gnm_expr_get_func_arg (GnmExpr const *expr, int i)
 {
diff --git a/src/func-builtin.c b/src/func-builtin.c
index c32800c5a..e746f8283 100644
--- a/src/func-builtin.c
+++ b/src/func-builtin.c
@@ -157,8 +157,8 @@ static GnmFuncHelp const help_table[] = {
 };
 
 
-static GnmDependentFlags
-gnumeric_table_link (GnmFuncEvalInfo *ei, gboolean qlink)
+static int //GnmDependentFlags
+gnumeric_table_link (const GnmFunc *func, GnmFuncEvalInfo *ei, gboolean qlink)
 {
        GnmDependent *dep = ei->pos->dep;
        GnmRangeRef rr;
@@ -202,7 +202,7 @@ gnumeric_table (GnmFuncEvalInfo *ei, int argc, GnmExprConstPtr const *argv)
        int cols, rows;
 
        /* evaluation clears the dynamic deps */
-       gnumeric_table_link (ei, TRUE);
+       gnumeric_table_link (gnm_eval_info_get_func (ei), ei, TRUE);
 
        if (argc != 2 ||
            ep->eval.col < 1 ||
@@ -489,62 +489,59 @@ static GnmFuncGroup *math_group = NULL;
 static GnmFuncGroup *gnumeric_group = NULL;
 static GnmFuncGroup *logic_group = NULL;
 
+static GnmFuncDescriptor const builtins [] = {
+       /* --- Math --- */
+       {       "sum",          NULL,
+               help_sum,       NULL,   gnumeric_sum,
+               GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_FIRST,
+               GNM_FUNC_IMPL_STATUS_COMPLETE,
+               GNM_FUNC_TEST_STATUS_BASIC
+       },
+       {       "product",              NULL,
+               help_product,   NULL,   gnumeric_product,
+               GNM_FUNC_SIMPLE,
+               GNM_FUNC_IMPL_STATUS_COMPLETE,
+               GNM_FUNC_TEST_STATUS_BASIC
+       },
+       /* --- Gnumeric --- */
+       {       "gnumeric_version",     "",
+               help_gnumeric_version,  gnumeric_version, NULL,
+               GNM_FUNC_SIMPLE,
+               GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC,
+               GNM_FUNC_TEST_STATUS_EXHAUSTIVE
+       },
+       {       "table",        "",
+               help_table,             NULL,   gnumeric_table,
+               GNM_FUNC_SIMPLE + GNM_FUNC_INTERNAL,
+               GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC,
+               GNM_FUNC_TEST_STATUS_EXHAUSTIVE
+       },
+       {       "number_match", "s|s", // Only in test suite
+               help_number_match, gnumeric_number_match, NULL,
+               GNM_FUNC_INTERNAL,
+               GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC,
+               GNM_FUNC_TEST_STATUS_BASIC },
+       {       "deriv", "r|r",  // Only in test suite
+               help_deriv, gnumeric_deriv, NULL,
+               GNM_FUNC_INTERNAL,
+               GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC,
+               GNM_FUNC_TEST_STATUS_BASIC },
+       /* --- Logic --- */
+       {       "if", "b|EE",
+               help_if, gnumeric_if, NULL,
+               GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_SECOND,
+               GNM_FUNC_IMPL_STATUS_COMPLETE,
+               GNM_FUNC_TEST_STATUS_BASIC },
+       { NULL }
+};
+
 void
 func_builtin_init (void)
 {
        const char *gname;
        const char *tdomain = GETTEXT_PACKAGE;
        int i = 0;
-
-       static GnmFuncDescriptor const builtins [] = {
-               /* --- Math --- */
-               {       "sum",          NULL,
-                       help_sum,       NULL,   gnumeric_sum,
-                       NULL, NULL, GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_FIRST,
-                       GNM_FUNC_IMPL_STATUS_COMPLETE,
-                       GNM_FUNC_TEST_STATUS_BASIC
-               },
-               {       "product",              NULL,
-                       help_product,   NULL,   gnumeric_product,
-                       NULL, NULL, GNM_FUNC_SIMPLE,
-                       GNM_FUNC_IMPL_STATUS_COMPLETE,
-                       GNM_FUNC_TEST_STATUS_BASIC
-               },
-               /* --- Gnumeric --- */
-               {       "gnumeric_version",     "",
-                       help_gnumeric_version,  gnumeric_version, NULL,
-                       NULL, NULL, GNM_FUNC_SIMPLE,
-                       GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC,
-                       GNM_FUNC_TEST_STATUS_EXHAUSTIVE
-               },
-               {       "table",        "",
-                       help_table,             NULL,   gnumeric_table,
-                       gnumeric_table_link,
-                       NULL, GNM_FUNC_SIMPLE + GNM_FUNC_INTERNAL,
-                       GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC,
-                       GNM_FUNC_TEST_STATUS_EXHAUSTIVE
-               },
-               {       "number_match", "s|s", // Only in test suite
-                       help_number_match, gnumeric_number_match, NULL,
-                       NULL, NULL,
-                       GNM_FUNC_SIMPLE,
-                       GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC,
-                       GNM_FUNC_TEST_STATUS_BASIC },
-               {       "deriv", "r|r",  // Only in test suite
-                       help_deriv, gnumeric_deriv, NULL,
-                       NULL, NULL,
-                       GNM_FUNC_SIMPLE,
-                       GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC,
-                       GNM_FUNC_TEST_STATUS_BASIC },
-               /* --- Logic --- */
-               {       "if", "b|EE",
-                       help_if, gnumeric_if, NULL,
-                       NULL, NULL,
-                       GNM_FUNC_SIMPLE + GNM_FUNC_AUTO_SECOND,
-                       GNM_FUNC_IMPL_STATUS_COMPLETE,
-                       GNM_FUNC_TEST_STATUS_BASIC },
-               { NULL }
-       };
+       GnmFunc *table_func;
 
        gname = N_("Mathematics");
        math_group = gnm_func_group_fetch (gname, _(gname));
@@ -565,25 +562,23 @@ func_builtin_init (void)
        logic_group = gnm_func_group_fetch (gname, _(gname));
        gnm_func_add (logic_group, builtins + i++, tdomain);
 
+       table_func = gnm_func_lookup ("table", NULL);
+       g_signal_connect (table_func, "link-dep", G_CALLBACK (gnumeric_table_link), NULL);
+
        gnm_expr_deriv_install_handler (gnm_func_lookup ("sum", NULL),
                                        gnumeric_sum_deriv,
                                        GNM_EXPR_DERIV_NO_CHAIN | GNM_EXPR_DERIV_OPTIMIZE,
                                        NULL, NULL);
 }
 
-static void
-shutdown_cat (GnmFuncGroup *group)
-{
-       GSList *ptr, *list = g_slist_copy (group->functions);
-       for (ptr = list; ptr; ptr = ptr->next)
-               gnm_func_free (ptr->data);
-       g_slist_free (list);
-}
-
 void
 func_builtin_shutdown (void)
 {
-       shutdown_cat (math_group);
-       shutdown_cat (gnumeric_group);
-       shutdown_cat (logic_group);
+       int i;
+
+       for (i = 0; builtins[i].name; i++) {
+               GnmFunc *func = gnm_func_lookup (builtins[i].name, NULL);
+               if (func)
+                       g_object_unref (func);
+       }
 }
diff --git a/src/func.c b/src/func.c
index 0ec7d7ed8..0700471a0 100644
--- a/src/func.c
+++ b/src/func.c
@@ -1,4 +1,3 @@
-
 /*
  * func.c: Function management and utility routines.
  *
@@ -11,6 +10,7 @@
 #include <gnumeric-config.h>
 #include <glib/gi18n-lib.h>
 #include <glib/gstdio.h>
+#include <gnm-i18n.h>
 #include <gnumeric.h>
 #include <func.h>
 
@@ -29,12 +29,28 @@
 #include <gnm-plugin.h>
 #include <gutils.h>
 #include <gui-util.h>
+#include <gnm-marshalers.h>
 
 #include <goffice/goffice.h>
 #include <glib.h>
 #include <string.h>
 #include <stdlib.h>
 
+enum {
+       PROP_0,
+       PROP_NAME,
+       PROP_TRANSLATION_DOMAIN,
+       PROP_IN_USE,
+};
+
+enum {
+       SIG_LOAD_STUB,
+       SIG_LINK_DEP,
+       LAST_SIGNAL
+};
+static guint signals[LAST_SIGNAL] = { 0 };
+
+
 #define F2(func,s) dgettext ((func)->tdomain->str, (s))
 
 static GList       *categories;
@@ -73,7 +89,7 @@ functions_shutdown (void)
                                   func->usage_count);
                        func->usage_count = 0;
                }
-               gnm_func_free (func);
+               g_object_unref (func);
        }
        func_builtin_shutdown ();
 
@@ -304,45 +320,47 @@ gnm_func_create_arg_names (GnmFunc *fn_def)
 void
 gnm_func_load_stub (GnmFunc *func)
 {
-       GnmFuncDescriptor desc;
-
        g_return_if_fail (func->fn_type == GNM_FUNC_TYPE_STUB);
 
-       /* default the content to 0 in case we add new fields
-        * later and the services do not fill them in
-        */
-       memset (&desc, 0, sizeof (GnmFuncDescriptor));
+       g_signal_emit (G_OBJECT (func), signals[SIG_LOAD_STUB], 0);
 
-       if (func->fn.load_desc (func, &desc)) {
-               func->help       = desc.help ? desc.help : NULL;
-               if (desc.fn_args != NULL) {
-                       func->fn_type           = GNM_FUNC_TYPE_ARGS;
-                       func->fn.args.func      = desc.fn_args;
-                       func->fn.args.arg_spec  = desc.arg_spec;
-                       extract_arg_types (func);
-               } else if (desc.fn_nodes != NULL) {
-                       func->fn_type           = GNM_FUNC_TYPE_NODES;
-                       func->fn.nodes          = desc.fn_nodes;
-               } else {
-                       g_warning ("Invalid function descriptor with no function");
-               }
-               func->linker      = desc.linker;
-               func->impl_status = desc.impl_status;
-               func->test_status = desc.test_status;
-               func->flags       = desc.flags;
-               gnm_func_create_arg_names (func);
-       } else {
-               func->fn_type = GNM_FUNC_TYPE_NODES;
+       if (func->fn_type == GNM_FUNC_TYPE_STUB) {
+               static GnmFuncHelp const no_help[] = { { GNM_FUNC_HELP_END } };
+
+               func->help = no_help;
                func->fn.nodes = &error_function_no_full_info;
-               func->linker   = NULL;
+               gnm_func_set_function_type (func, GNM_FUNC_TYPE_NODES);
+       }
+}
+
+void
+gnm_func_set_function_type (GnmFunc *func, GnmFuncType typ)
+{
+       g_return_if_fail (GNM_IS_FUNC (func));
+
+       func->fn_type = typ;
+       switch (typ) {
+       case GNM_FUNC_TYPE_ARGS:
+               extract_arg_types (func);
+               gnm_func_create_arg_names (func);
+               break;
+       case GNM_FUNC_TYPE_NODES:
+               gnm_func_create_arg_names (func);
+               break;
+       case GNM_FUNC_TYPE_STUB:
+               break;
        }
 }
 
+
 static void
 gnm_func_set_localized_name (GnmFunc *fd, const char *lname)
 {
        gboolean in_hashes = !(fd->flags & GNM_FUNC_IS_WORKBOOK_LOCAL);
 
+       if (g_strcmp0 (fd->localized_name, lname) == 0)
+               return;
+
        if (in_hashes && fd->localized_name)
                g_hash_table_remove (functions_by_localized_name, fd->localized_name);
        g_free (fd->localized_name);
@@ -353,71 +371,61 @@ gnm_func_set_localized_name (GnmFunc *fd, const char *lname)
                                     fd->localized_name, fd);
 }
 
-void
-gnm_func_free (GnmFunc *func)
-{
-       GnmFuncGroup *group;
-
-       g_return_if_fail (func != NULL);
-       g_return_if_fail (func->usage_count == 0);
-
-       group = func->fn_group;
-       if (group != NULL)
-               gnm_func_group_remove_func (group, func);
-
-       gnm_func_set_localized_name (func, NULL);
-
-       if (!(func->flags & GNM_FUNC_IS_WORKBOOK_LOCAL)) {
-               g_hash_table_remove (functions_by_name, func->name);
-       }
-
-       if (func->fn_type == GNM_FUNC_TYPE_ARGS)
-               g_free (func->fn.args.arg_types);
-
-       g_free ((char *)func->name);
-
-       go_string_unref (func->tdomain);
-
-       gnm_func_clear_arg_names (func);
-
-       g_free (func);
-}
-
+/**
+ * gnm_func_inc_usage:
+ * @func: (transfer none): #GnmFunc
+ *
+ * This function increments the usage count of @func.  A non-zero usage count
+ * prevents the unloading of the function.
+ *
+ * Returns: (transfer full): a new reference to @func.
+ */
 GnmFunc *
-gnm_func_ref (GnmFunc *func)
+gnm_func_inc_usage (GnmFunc *func)
 {
        g_return_val_if_fail (func != NULL, NULL);
 
        func->usage_count++;
-       if (func->usage_count == 1 && func->usage_notify != NULL)
-               func->usage_notify (func, 1);
+       if (func->usage_count == 1)
+               g_object_notify (G_OBJECT (func), "in-use");
        return func;
 }
 
+/**
+ * gnm_func_dec_usage:
+ * @func: (transfer full): #GnmFunc
+ *
+ * This function decrements the usage count of @func.  When the usage count
+ * reaches zero, the function may be unloaded, for example by unloading the
+ * plugin that defines it.
+ */
 void
-gnm_func_unref (GnmFunc *func)
+gnm_func_dec_usage (GnmFunc *func)
 {
        g_return_if_fail (func != NULL);
        g_return_if_fail (func->usage_count > 0);
 
        func->usage_count--;
-       if (func->usage_count == 0 && func->usage_notify != NULL)
-               func->usage_notify (func, 0);
+       if (func->usage_count == 0)
+               g_object_notify (G_OBJECT (func), "in-use");
 }
 
-GType
-gnm_func_get_type (void)
+gboolean
+gnm_func_get_in_use (GnmFunc *func)
 {
-       static GType t = 0;
+       g_return_val_if_fail (func != NULL, FALSE);
 
-       if (t == 0) {
-               t = g_boxed_type_register_static ("GnmFunc",
-                        (GBoxedCopyFunc)gnm_func_ref,
-                        (GBoxedFreeFunc)gnm_func_unref);
-       }
-       return t;
+       return func->usage_count > 0;
 }
 
+
+/**
+ * gnm_func_lookup:
+ * @name: name of function
+ * @scope: (nullable): scope of function, %NULL for global
+ *
+ * Returns: (nullable) (transfer none): the function of that name.
+ */
 GnmFunc *
 gnm_func_lookup (char const *name, Workbook *scope)
 {
@@ -429,6 +437,13 @@ gnm_func_lookup (char const *name, Workbook *scope)
        return g_hash_table_lookup (scope->sheet_local_functions, (gpointer)name);
 }
 
+/**
+ * gnm_func_lookup_localized:
+ * @name: localized name of function
+ * @scope: (nullable): scope of function, %NULL for global
+ *
+ * Returns: (nullable) (transfer none): the function of that name.
+ */
 GnmFunc *
 gnm_func_lookup_localized (char const *name, Workbook *scope)
 {
@@ -476,7 +491,7 @@ gnm_func_lookup_prefix (char const *prefix, Workbook *scope, gboolean trans)
                if (!(fd->flags & GNM_FUNC_IS_PLACEHOLDER)) {
                        const char *name = gnm_func_get_name (fd, trans);
                        if (g_str_has_prefix (name, prefix)) {
-                               gnm_func_ref (fd);
+                               gnm_func_inc_usage (fd);
                                res = g_slist_prepend (res, fd);
                        }
                }
@@ -485,6 +500,71 @@ gnm_func_lookup_prefix (char const *prefix, Workbook *scope, gboolean trans)
        return res;
 }
 
+/**
+ * gnm_func_get_translation_domain:
+ * @func: #GnmFunc
+ *
+ * Returns: (transfer none): the translation domain for @func's help text.
+ */
+char const *
+gnm_func_get_translation_domain (GnmFunc *func)
+{
+       g_return_val_if_fail (GNM_IS_FUNC (func), NULL);
+       return func->tdomain->str;
+}
+
+/**
+ * gnm_func_set_translation_domain:
+ * @func: #GnmFunc
+ * @tdomain: (nullable): Translation domain, %NULL for Gnumeric's.
+ */
+void
+gnm_func_set_translation_domain (GnmFunc *func, const char *tdomain)
+{
+       g_return_if_fail (GNM_IS_FUNC (func));
+
+       if (!tdomain)
+               tdomain = GETTEXT_PACKAGE;
+
+       if (g_strcmp0 (func->tdomain->str, tdomain) == 0)
+               return;
+
+       go_string_unref (func->tdomain);
+       func->tdomain = go_string_new (tdomain);
+
+       g_object_notify (G_OBJECT (func), "translation-domain");
+}
+
+void
+gnm_func_set_function_group (GnmFunc *func, GnmFuncGroup *group)
+{
+       g_return_if_fail (GNM_IS_FUNC (func));
+       g_return_if_fail (group != NULL);
+
+       if (func->fn_group == group)
+               return;
+
+       if (func->fn_group)
+               gnm_func_group_remove_func (func->fn_group, func);
+       func->fn_group = group;
+       gnm_func_group_add_func (group, func);
+
+       if (group == unknown_cat)
+               func->flags |= GNM_FUNC_IS_PLACEHOLDER;
+       else
+               func->flags &= ~GNM_FUNC_IS_PLACEHOLDER;
+}
+
+
+
+/**
+ * gnm_func_add:
+ * @group:
+ * @descriptor:
+ * @tdomain: (nullable):
+ *
+ * Returns: (transfer full): a new #GnmFunc.
+ */
 GnmFunc *
 gnm_func_add (GnmFuncGroup *fn_group,
              GnmFuncDescriptor const *desc,
@@ -497,23 +577,18 @@ gnm_func_add (GnmFuncGroup *fn_group,
        g_return_val_if_fail (fn_group != NULL, NULL);
        g_return_val_if_fail (desc != NULL, NULL);
 
-       func = g_new (GnmFunc, 1);
-
-       if (!tdomain)
-               tdomain = GETTEXT_PACKAGE;
+       func = g_object_new (GNM_FUNC_TYPE,
+                            "name", desc->name,
+                            NULL);
+       gnm_func_set_translation_domain (func, tdomain);
 
-       func->name              = g_strdup (desc->name);
        func->help              = desc->help ? desc->help : NULL;
-       func->tdomain        = go_string_new (tdomain);
-       func->linker            = desc->linker;
-       func->usage_notify      = desc->usage_notify;
        func->flags             = desc->flags;
        func->impl_status       = desc->impl_status;
        func->test_status       = desc->test_status;
        func->localized_name    = NULL;
        func->arg_names_p       = NULL;
 
-       func->user_data         = NULL;
        func->usage_count       = 0;
 
        if (desc->fn_args != NULL) {
@@ -522,33 +597,29 @@ gnm_func_add (GnmFuncGroup *fn_group,
                        g_return_val_if_fail (strchr (valid_tokens, *ptr), NULL);
                }
 
-               func->fn_type           = GNM_FUNC_TYPE_ARGS;
                func->fn.args.func      = desc->fn_args;
                func->fn.args.arg_spec  = desc->arg_spec;
-               extract_arg_types (func);
+               gnm_func_set_function_type (func, GNM_FUNC_TYPE_ARGS);
        } else if (desc->fn_nodes != NULL) {
 
                if (desc->arg_spec && *desc->arg_spec) {
                        g_warning ("Arg spec for node function -- why?");
                }
 
-               func->fn_type  = GNM_FUNC_TYPE_NODES;
                func->fn.nodes = desc->fn_nodes;
+               gnm_func_set_function_type (func, GNM_FUNC_TYPE_NODES);
        } else {
                g_warning ("Invalid function has neither args nor nodes handler");
-               g_free (func);
+               g_object_unref (func);
                return NULL;
        }
 
        func->fn_group = fn_group;
-       if (fn_group != NULL)
-               gnm_func_group_add_func (fn_group, func);
+       gnm_func_group_add_func (fn_group, func);
        if (!(func->flags & GNM_FUNC_IS_WORKBOOK_LOCAL))
                g_hash_table_insert (functions_by_name,
                                     (gpointer)(func->name), func);
 
-       gnm_func_create_arg_names (func);
-
        return func;
 }
 
@@ -561,47 +632,6 @@ unknownFunctionHandler (GnmFuncEvalInfo *ei,
        return value_new_error_NAME (ei->pos);
 }
 
-/**
- * gnm_func_upgrade_placeholder:
- * @fd:
- * @fn_group:
- * @tdomain:
- * @load_desc: (scope async):
- * @opt_usage_notify: (scope async):
- **/
-void
-gnm_func_upgrade_placeholder (GnmFunc *fd,
-                             GnmFuncGroup *fn_group,
-                             const char *tdomain,
-                             GnmFuncLoadDesc load_desc,
-                             GnmFuncUsageNotify opt_usage_notify)
-{
-       g_return_if_fail (fd != NULL);
-       g_return_if_fail (fd->flags & GNM_FUNC_IS_PLACEHOLDER);
-       g_return_if_fail (fn_group != NULL);
-
-       if (!tdomain)
-               tdomain = GETTEXT_PACKAGE;
-
-       /* Remove from unknown_cat */
-       gnm_func_group_remove_func (fd->fn_group, fd);
-
-       fd->fn_type = GNM_FUNC_TYPE_STUB;
-       fd->fn.load_desc = load_desc;
-       fd->usage_notify = opt_usage_notify;
-
-       go_string_unref (fd->tdomain);
-       fd->tdomain = go_string_new (tdomain);
-
-       /* Clear localized_name so we can deduce the proper name.  */
-       gnm_func_set_localized_name (fd, NULL);
-
-       fd->flags &= ~GNM_FUNC_IS_PLACEHOLDER;
-
-       fd->fn_group = fn_group;
-       gnm_func_group_add_func (fn_group, fd);
-}
-
 static char *
 invent_name (const char *pref, GHashTable *h, const char *template)
 {
@@ -661,8 +691,6 @@ gnm_func_add_placeholder_full (Workbook *scope,
        desc.help         = NULL;
        desc.fn_args      = NULL;
        desc.fn_nodes     = &unknownFunctionHandler;
-       desc.linker       = NULL;
-       desc.usage_notify = NULL;
        desc.flags        = GNM_FUNC_IS_PLACEHOLDER;
        desc.impl_status  = GNM_FUNC_IMPL_STATUS_EXISTS;
        desc.test_status  = GNM_FUNC_TEST_STATUS_UNKNOWN;
@@ -691,7 +719,7 @@ gnm_func_add_placeholder_full (Workbook *scope,
                if (scope->sheet_local_functions == NULL)
                        scope->sheet_local_functions = g_hash_table_new_full (
                                g_str_hash, g_str_equal,
-                               NULL, (GDestroyNotify) gnm_func_free);
+                               NULL, g_object_unref);
                g_hash_table_insert (scope->sheet_local_functions,
                        (gpointer)func->name, func);
        }
@@ -699,13 +727,13 @@ gnm_func_add_placeholder_full (Workbook *scope,
        return func;
 }
 
-/*
- * When importing it is useful to keep track of unknown function names.
- * We may be missing a plugin or something similar.
+/**
+ * gnm_func_add_placeholder:
+ * @scope: (nullable): scope to defined placeholder, %NULL for global
+ * @name: (nullable): function name
+ * @type:
  *
- * TODO : Eventully we should be able to keep track of these
- *        and replace them with something else.  Possibly even reordering the
- *        arguments.
+ * Returns: (transfer none): a placeholder with the given name.
  */
 GnmFunc *
 gnm_func_add_placeholder (Workbook *scope,
@@ -714,13 +742,26 @@ gnm_func_add_placeholder (Workbook *scope,
        return gnm_func_add_placeholder_full (scope, name, NULL, type);
 }
 
+/**
+ * gnm_func_add_placeholder_localized:
+ * @gname: (nullable): function name
+ * @lname: localized function name
+ *
+ * Returns: (transfer none): a placeholder with the given localized name.
+ */
 GnmFunc *
 gnm_func_add_placeholder_localized (char const *gname, char const *lname)
 {
        return gnm_func_add_placeholder_full (NULL, gname, lname, "?");
 }
 
-/* Utility routine to be used for import and analysis tools */
+/**
+ * gnm_func_lookup_or_add_placeholder:
+ * @name: function name
+ *
+ * Returns: (transfer none): a #GnmFunc named @name, either an existing
+ * one or a placeholder.
+ */
 GnmFunc        *
 gnm_func_lookup_or_add_placeholder (char const *name)
 {
@@ -730,28 +771,6 @@ gnm_func_lookup_or_add_placeholder (char const *name)
        return f;
 }
 
-/**
- * gnm_func_get_user_data:
- * @func:
- *
- * Returns: (transfer none):
- **/
-gpointer
-gnm_func_get_user_data (GnmFunc const *func)
-{
-       g_return_val_if_fail (func != NULL, NULL);
-
-       return func->user_data;
-}
-
-void
-gnm_func_set_user_data (GnmFunc *func, gpointer user_data)
-{
-       g_return_if_fail (func != NULL);
-
-       func->user_data = user_data;
-}
-
 /**
  * gnm_func_get_name:
  * @func: #GnmFunc to query
@@ -845,46 +864,50 @@ gnm_func_get_description (GnmFunc const *fn_def)
  * @min: (out): location for mininum args
  * @max: (out): location for mininum args
  *
- * This calculates the maximum and minimum number of args tha can be passed.
+ * This calculates the maximum and minimum number of args that can be passed.
  * For a vararg function, the maximum will be set to G_MAXINT.
  **/
 void
 gnm_func_count_args (GnmFunc const *fn_def, int *min, int *max)
 {
-       char const *ptr;
-       int   i;
-       int   vararg;
-
        g_return_if_fail (min != NULL);
        g_return_if_fail (max != NULL);
        g_return_if_fail (fn_def != NULL);
 
        gnm_func_load_if_stub ((GnmFunc *)fn_def);
 
-       /*
-        * FIXME: clearly for 'nodes' functions many of
-        * the type fields will need to be filled.
-        */
-       if (fn_def->fn_type == GNM_FUNC_TYPE_NODES) {
+       switch (fn_def->fn_type) {
+       case GNM_FUNC_TYPE_NODES:
                *min = 0;
+               // Really?
                if (g_ascii_strcasecmp ("INDEX",fn_def->name) == 0)
                        *max = 4;
                else
                        *max = G_MAXINT;
                return;
-       }
 
-       ptr = fn_def->fn.args.arg_spec;
-       for (i = vararg = 0; ptr && *ptr; ptr++) {
-               if (*ptr == '|') {
-                       vararg = 1;
+       case GNM_FUNC_TYPE_ARGS: {
+               const char *ptr = fn_def->fn.args.arg_spec;
+               int i, vararg;
+
+               for (i = vararg = 0; ptr && *ptr; ptr++) {
+                       if (*ptr == '|') {
+                               vararg = 1;
+                               *min = i;
+                       } else
+                               i++;
+               }
+               *max = i;
+               if (!vararg)
                        *min = i;
-               } else
-                       i++;
+               return;
+       }
+
+       default:
+               *min = 0;
+               *max = G_MAXINT;
+               return;
        }
-       *max = i;
-       if (!vararg)
-               *min = i;
 }
 
 /**
@@ -935,7 +958,7 @@ gnm_func_get_arg_type (GnmFunc const *fn_def, int arg_idx)
  **/
 char const *
 gnm_func_get_arg_type_string (GnmFunc const *fn_def,
-                                 int arg_idx)
+                             int arg_idx)
 {
        switch (gnm_func_get_arg_type (fn_def, arg_idx)) {
        case 'f':
@@ -979,7 +1002,7 @@ gnm_func_get_arg_name (GnmFunc const *fn_def, guint arg_idx)
        if ((fn_def->arg_names_p != NULL)
            && (arg_idx < fn_def->arg_names_p->len))
                return g_strdup (g_ptr_array_index (fn_def->arg_names_p,
-                                                    arg_idx));
+                                                   arg_idx));
        return NULL;
 }
 
@@ -1616,6 +1639,12 @@ function_iterate_argument_values (GnmEvalPos const       *ep,
 }
 
 
+/**
+ * gnm_eval_info_get_func:
+ * @ei: #GnmFuncEvalInfo
+ *
+ * Returns: (transfer none): the called function.
+ */
 GnmFunc const *
 gnm_eval_info_get_func (GnmFuncEvalInfo const *ei)
 {
@@ -1627,3 +1656,161 @@ gnm_eval_info_get_arg_count (GnmFuncEvalInfo const *ei)
 {
        return ei->func_call->argc;
 }
+
+GnmDependentFlags
+gnm_func_link_dep (GnmFunc *func, GnmFuncEvalInfo *ei, gboolean qlink)
+{
+       int res = DEPENDENT_NO_FLAG;
+       g_signal_emit (func, signals[SIG_LINK_DEP], 0, ei, qlink, &res);
+       return (GnmDependentFlags)res;
+}
+
+/* ------------------------------------------------------------------------- */
+
+static GObjectClass *parent_class;
+
+typedef struct {
+       GObjectClass parent;
+
+       void (*load_stub) (GnmFunc *func);
+       int (*link_dep) (GnmFunc *func, GnmFuncEvalInfo *ei, gboolean qlink);
+} GnmFuncClass;
+
+static void
+gnm_func_finalize (GObject *obj)
+{
+       GnmFunc *func = GNM_FUNC (obj);
+
+       if (func->usage_count != 0) {
+               g_printerr ("Function %s still has a usage count of %d\n",
+                           func->name, func->usage_count);
+       }
+
+       if (func->fn_group) {
+               gnm_func_group_remove_func (func->fn_group, func);
+               func->fn_group = NULL;
+       }
+
+       gnm_func_set_localized_name (func, NULL);
+
+       if (!(func->flags & GNM_FUNC_IS_WORKBOOK_LOCAL)) {
+               g_hash_table_remove (functions_by_name, func->name);
+       }
+
+       if (func->fn_type == GNM_FUNC_TYPE_ARGS)
+               g_free (func->fn.args.arg_types);
+
+       g_free ((char *)func->name);
+
+       go_string_unref (func->tdomain);
+
+       gnm_func_clear_arg_names (func);
+
+       parent_class->finalize (obj);
+}
+
+static void
+gnm_func_get_property (GObject *object, guint property_id,
+                      GValue *value, GParamSpec *pspec)
+{
+       GnmFunc *func = (GnmFunc *)object;
+
+       switch (property_id) {
+       case PROP_NAME:
+               g_value_set_string (value, func->name);
+               break;
+       case PROP_TRANSLATION_DOMAIN:
+               g_value_set_string (value, func->tdomain->str);
+               break;
+       case PROP_IN_USE:
+               g_value_set_boolean (value, func->usage_count > 0);
+               break;
+       default:
+               G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+               break;
+       }
+}
+
+static void
+gnm_func_set_property (GObject *object, guint property_id,
+                      GValue const *value, GParamSpec *pspec)
+{
+       GnmFunc *func = (GnmFunc *)object;
+
+       switch (property_id) {
+       case PROP_NAME:
+               func->name = g_value_dup_string (value);
+               break;
+       case PROP_TRANSLATION_DOMAIN:
+               gnm_func_set_translation_domain (func,
+                                                g_value_get_string (value));
+               break;
+       default:
+               G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+               break;
+       }
+}
+
+static void
+gnm_func_init (GnmFunc *func)
+{
+       func->tdomain = go_string_new (GETTEXT_PACKAGE);
+}
+
+static void
+gnm_func_class_init (GObjectClass *gobject_class)
+{
+       parent_class = g_type_class_peek_parent (gobject_class);
+
+       gobject_class->finalize         = gnm_func_finalize;
+       gobject_class->get_property     = gnm_func_get_property;
+       gobject_class->set_property     = gnm_func_set_property;
+
+        g_object_class_install_property (gobject_class, PROP_NAME,
+                g_param_spec_string ("name",
+                                     P_("Name"),
+                                     P_("The name of the function."),
+                                     NULL,
+                                     GSF_PARAM_STATIC |
+                                     G_PARAM_READWRITE |
+                                     G_PARAM_CONSTRUCT_ONLY));
+
+        g_object_class_install_property (gobject_class, PROP_TRANSLATION_DOMAIN,
+                g_param_spec_string ("translation-domain",
+                                     P_("Translation Domain"),
+                                     P_("The translation domain for help texts"),
+                                     NULL,
+                                     GSF_PARAM_STATIC |
+                                     G_PARAM_READWRITE));
+
+        g_object_class_install_property (gobject_class, PROP_IN_USE,
+                g_param_spec_boolean ("in-use",
+                                      P_("In use"),
+                                      P_("Is function being used?"),
+                                      FALSE,
+                                      GSF_PARAM_STATIC |
+                                      G_PARAM_READABLE));
+
+       signals[SIG_LOAD_STUB] = g_signal_new
+               ("load-stub",
+                GNM_FUNC_TYPE,
+                G_SIGNAL_RUN_LAST,
+                G_STRUCT_OFFSET (GnmFuncClass, load_stub),
+                NULL, NULL,
+                g_cclosure_marshal_VOID__VOID,
+                G_TYPE_NONE, 0);
+
+
+       signals[SIG_LINK_DEP] = g_signal_new
+               ("link-dep",
+                GNM_FUNC_TYPE,
+                G_SIGNAL_RUN_LAST,
+                G_STRUCT_OFFSET (GnmFuncClass, link_dep),
+                NULL, NULL,
+                gnm__INT__POINTER_BOOLEAN,
+                // GnmDependentFlags ... GnmFuncEvalInfo
+                G_TYPE_INT, 2, G_TYPE_POINTER, G_TYPE_BOOLEAN);
+}
+
+GSF_CLASS (GnmFunc, gnm_func,
+          gnm_func_class_init, gnm_func_init, G_TYPE_OBJECT)
diff --git a/src/func.h b/src/func.h
index ee2c74c4d..9673e01d5 100644
--- a/src/func.h
+++ b/src/func.h
@@ -125,10 +125,6 @@ typedef enum {
 typedef GnmValue       *(*GnmFuncArgs)   (GnmFuncEvalInfo *ei, GnmValue const * const *args);
 typedef GnmValue       *(*GnmFuncNodes)  (GnmFuncEvalInfo *ei,
                                           int argc, GnmExprConstPtr const *argv);
-typedef GnmDependentFlags (*GnmFuncLink)  (GnmFuncEvalInfo *ei, gboolean qlink);
-
-typedef void    (*GnmFuncUsageNotify) (GnmFunc *f, int refcount);
-typedef gboolean (*GnmFuncLoadDesc)  (GnmFunc const *f, GnmFuncDescriptor *fd);
 
 typedef enum {
        GNM_FUNC_HELP_END,              /* Format */
@@ -167,6 +163,7 @@ typedef enum {
        GNM_FUNC_HELP_ODF
        /* <SPECIAL NOTE RE ODF (reference args using @{arg})> (translated) */
 } GnmFuncHelpType;
+
 typedef struct {
     GnmFuncHelpType     type;
     char const         *text;
@@ -178,16 +175,16 @@ struct _GnmFuncDescriptor {
        GnmFuncHelp const *help;
        GnmFuncArgs       fn_args;
        GnmFuncNodes      fn_nodes;
-       GnmFuncLink       linker;
-       GnmFuncUsageNotify usage_notify;
        GnmFuncFlags      flags;
        GnmFuncImplStatus impl_status;
        GnmFuncTestStatus test_status;
 };
 
-struct _GnmFunc {
+struct GnmFunc_ {
+       GObject base;
+
        char const *name;
-       GPtrArray  *arg_names_p;
+       GPtrArray *arg_names_p;
        GnmFuncHelp const *help;
        GOString *tdomain;
        char *localized_name;
@@ -200,39 +197,39 @@ struct _GnmFunc {
                        int min_args, max_args;
                        char *arg_types;
                } args;
-               GnmFuncLoadDesc load_desc;
        } fn;
        GnmFuncGroup            *fn_group; /* most recent it was assigned to */
-       GnmFuncLink              linker;
-       GnmFuncUsageNotify       usage_notify;
        GnmFuncImplStatus        impl_status;
        GnmFuncTestStatus        test_status;
        GnmFuncFlags             flags;
 
        gint                     usage_count;
-       gpointer                 user_data;
 };
 
-struct _GnmFuncEvalInfo {
-       GnmEvalPos const *pos;
-       GnmExprFunction const *func_call;
-       GnmExprEvalFlags flags;
-};
-
-GnmFunc const *gnm_eval_info_get_func (GnmFuncEvalInfo const *ei);
-int gnm_eval_info_get_arg_count (GnmFuncEvalInfo const *ei);
-
+#define GNM_FUNC_TYPE  (gnm_func_get_type ())
+#define GNM_FUNC(obj)   (G_TYPE_CHECK_INSTANCE_CAST ((obj), GNM_FUNC_TYPE, GnmFunc))
+#define GNM_IS_FUNC(o)  (G_TYPE_CHECK_INSTANCE_TYPE ((o), GNM_FUNC_TYPE))
 
 GType       gnm_func_get_type        (void);
-void       gnm_func_free            (GnmFunc *func);
-GnmFunc           *gnm_func_ref             (GnmFunc *func);
-void       gnm_func_unref           (GnmFunc *func);
 void        gnm_func_load_if_stub    (GnmFunc *func);
-void       gnm_func_load_stub       (GnmFunc *fn_def);
+void       gnm_func_load_stub       (GnmFunc *func);
+
+GnmFunc           *gnm_func_inc_usage       (GnmFunc *func);
+void       gnm_func_dec_usage       (GnmFunc *func);
+gboolean    gnm_func_get_in_use      (GnmFunc *func);
+
+char const *gnm_func_get_translation_domain (GnmFunc *func);
+void        gnm_func_set_translation_domain (GnmFunc *func,
+                                            const char *tdomain);
+
+void        gnm_func_set_function_group (GnmFunc *func, GnmFuncGroup *group);
+
+void        gnm_func_set_function_type (GnmFunc *func, GnmFuncType typ);
+
+GnmDependentFlags gnm_func_link_dep (GnmFunc *func, GnmFuncEvalInfo *ei, gboolean qlink);
+
 char const *gnm_func_get_name       (GnmFunc const *func,
                                      gboolean localized);
-gpointer    gnm_func_get_user_data   (GnmFunc const *func);
-void        gnm_func_set_user_data   (GnmFunc *func, gpointer user_data);
 GnmFunc           *gnm_func_lookup          (char const *name, Workbook *scope);
 GnmFunc    *gnm_func_lookup_localized (char const *name, Workbook *scope);
 GSList    *gnm_func_lookup_prefix   (char const *prefix, Workbook *scope,
@@ -240,17 +237,11 @@ GSList       *gnm_func_lookup_prefix   (char const *prefix, Workbook *scope,
 GnmFunc    *gnm_func_add            (GnmFuncGroup *group,
                                      GnmFuncDescriptor const *descriptor,
                                      const char *tdomain);
-GnmFunc    *gnm_func_add_placeholder (Workbook *optional_scope,
+GnmFunc    *gnm_func_add_placeholder (Workbook *scope,
                                      char const *name,
                                      char const *type);
 GnmFunc    *gnm_func_add_placeholder_localized (char const *gname, char const *lname);
 GnmFunc           *gnm_func_lookup_or_add_placeholder (char const *name);
-void        gnm_func_upgrade_placeholder
-                                     (GnmFunc *fd,
-                                      GnmFuncGroup *fn_group,
-                                      const char *tdomain,
-                                      GnmFuncLoadDesc load_desc,
-                                      GnmFuncUsageNotify opt_usage_notify);
 
 /* TODO */
 char const *gnm_func_get_description (GnmFunc const *fn_def);
@@ -286,6 +277,17 @@ GnmValue *function_iterate_argument_values (GnmEvalPos const *ep,
                                            gboolean strict,
                                            CellIterFlags iter_flags);
 
+/*************************************************************************/
+
+struct _GnmFuncEvalInfo {
+       GnmEvalPos const *pos;
+       GnmExprFunction const *func_call;
+       GnmExprEvalFlags flags;
+};
+
+GnmFunc const *gnm_eval_info_get_func (GnmFuncEvalInfo const *ei);
+int gnm_eval_info_get_arg_count (GnmFuncEvalInfo const *ei);
+
 G_END_DECLS
 
 #endif /* _GNM_FUNC_H_ */
diff --git a/src/gnm-marshalers.list b/src/gnm-marshalers.list
index 7b0139357..2655e605e 100644
--- a/src/gnm-marshalers.list
+++ b/src/gnm-marshalers.list
@@ -24,3 +24,4 @@ BOOLEAN:POINTER
 BOOLEAN:OBJECT,POINTER
 VOID:BOOLEAN,INT
 BOOLEAN:VOID
+INT:POINTER,BOOLEAN
diff --git a/src/gnm-plugin.c b/src/gnm-plugin.c
index 0bcb43024..fac15210e 100644
--- a/src/gnm-plugin.c
+++ b/src/gnm-plugin.c
@@ -143,45 +143,41 @@ plugin_service_function_group_read_xml (GOPluginService *service, xmlNode *tree,
        }
 }
 
-static gboolean
-plugin_service_function_group_func_desc_load (GnmFunc const *fn_def,
-                                             GnmFuncDescriptor *res)
+static void
+plugin_service_function_group_func_ref_notify (GnmFunc *fn_def,
+                                              G_GNUC_UNUSED GParamSpec *pspec,
+                                              GOPlugin *plugin)
+{
+       if (gnm_func_get_in_use (fn_def))
+               go_plugin_use_ref (plugin);
+       else
+               go_plugin_use_unref (plugin);
+}
+
+static void
+plugin_service_function_group_func_load_stub (GnmFunc *fn_def,
+                                             GOPluginService *service)
 {
-       GOPluginService *service = gnm_func_get_user_data (fn_def);
        GnmPluginServiceFunctionGroup *sfg = GNM_PLUGIN_SERVICE_FUNCTION_GROUP (service);
        GOErrorInfo *error = NULL;
 
-       g_return_val_if_fail (fn_def != NULL, FALSE);
+       g_return_if_fail (fn_def != NULL);
 
        go_plugin_service_load (service, &error);
        if (error != NULL) {
                go_error_info_print (error);
                go_error_info_free (error);
-               return FALSE;
+               return;
        }
-       if (NULL == sfg->cbs.func_desc_load) {
-                error = go_error_info_new_printf (_("No func_desc_load method.\n"));
+
+       if (!sfg->cbs.load_stub) {
+                error = go_error_info_new_printf (_("No load_stub method.\n"));
                go_error_info_print (error);
                go_error_info_free (error);
-               return FALSE;
+               return;
        }
-       return sfg->cbs.func_desc_load (service,
-                                       gnm_func_get_name (fn_def, FALSE),
-                                       res);
-}
 
-static void
-plugin_service_function_group_func_ref_notify (GnmFunc *fn_def, int refcount)
-{
-       GOPluginService *service;
-
-       service = gnm_func_get_user_data (fn_def);
-       g_return_if_fail (GNM_IS_PLUGIN_SERVICE_FUNCTION_GROUP (service));
-       if (refcount == 0) {
-               go_plugin_use_unref (service->plugin);
-       } else {
-               go_plugin_use_ref (service->plugin);
-       }
+       sfg->cbs.load_stub (service, fn_def);
 }
 
 static void
@@ -192,7 +188,7 @@ delayed_ref_notify (GOPlugin *plugin, GnmFunc *fd)
                                              fd);
 
        /* We cannot do this until after the plugin has been activated.  */
-       plugin_service_function_group_func_ref_notify (fd, 1);
+       plugin_service_function_group_func_ref_notify (fd, NULL, plugin);
 }
 
 static void
@@ -200,40 +196,41 @@ plugin_service_function_group_activate (GOPluginService *service, GOErrorInfo **
 {
        GnmPluginServiceFunctionGroup *sfg =
                GNM_PLUGIN_SERVICE_FUNCTION_GROUP (service);
+       GOPlugin *plugin = go_plugin_service_get_plugin (service);
+       GSList *l;
 
        GO_INIT_RET_ERROR_INFO (ret_error);
        sfg->func_group = gnm_func_group_fetch (sfg->category_name,
                                                sfg->translated_category_name);
        if (gnm_debug_flag ("plugin-func"))
                g_printerr ("Activating group %s\n", sfg->category_name);
-       GO_SLIST_FOREACH
-               (sfg->function_name_list, char, fname,
-                GnmFunc *fd;
-
-                fd = gnm_func_lookup (fname, NULL);
-                if (fd) {
-#if 0
-                        g_printerr ("Reusing placeholder for %s\n", fname);
-#endif
-                } else {
-                        fd = gnm_func_add_placeholder (NULL, fname, "?");
-                }
-                if (fd->flags & GNM_FUNC_IS_PLACEHOLDER) {
-                        gnm_func_set_user_data (fd, service);
-                        gnm_func_upgrade_placeholder
-                                (fd, sfg->func_group,
-                                 sfg->tdomain,
-                                 plugin_service_function_group_func_desc_load,
-                                 plugin_service_function_group_func_ref_notify);
-                        if (fd->usage_count > 0)
-                                g_signal_connect (go_plugin_service_get_plugin (service),
-                                                  "state_changed",
-                                                  G_CALLBACK (delayed_ref_notify),
-                                                  fd);
-                } else {
-                        g_warning ("Multiple definitions of function %s -- this cannot be good!", fname);
-                }
-       );
+
+       for (l = sfg->function_name_list; l; l = l->next) {
+               const char *fname = l->data;
+               GnmFunc *fd = gnm_func_lookup_or_add_placeholder (fname);
+
+               gnm_func_set_function_type (fd, GNM_FUNC_TYPE_STUB);
+               gnm_func_set_translation_domain (fd, sfg->tdomain);
+               gnm_func_set_function_group (fd, sfg->func_group);
+               // Clear localized_name so we can deduce the proper name.
+               //gnm_func_set_localized_name (fd, NULL);
+
+               g_signal_connect
+                       (G_OBJECT (fd), "notify::in-use",
+                        G_CALLBACK (plugin_service_function_group_func_ref_notify),
+                        plugin);
+
+               g_signal_connect
+                       (G_OBJECT (fd), "load-stub",
+                        G_CALLBACK (plugin_service_function_group_func_load_stub),
+                        service);
+
+               if (fd->usage_count > 0)
+                       g_signal_connect (plugin,
+                                         "state_changed",
+                                         G_CALLBACK (delayed_ref_notify),
+                                         fd);
+       }
        service->is_active = TRUE;
 }
 
@@ -241,14 +238,18 @@ static void
 plugin_service_function_group_deactivate (GOPluginService *service, GOErrorInfo **ret_error)
 {
        GnmPluginServiceFunctionGroup *sfg = GNM_PLUGIN_SERVICE_FUNCTION_GROUP (service);
+       GSList *l;
 
        if (gnm_debug_flag ("plugin-func"))
                g_printerr ("Deactivating group %s\n", sfg->category_name);
 
        GO_INIT_RET_ERROR_INFO (ret_error);
-       GO_SLIST_FOREACH (sfg->function_name_list, char, fname,
-               gnm_func_free (gnm_func_lookup (fname, NULL));
-       );
+
+       for (l = sfg->function_name_list; l; l = l->next) {
+               const char *fname = l->data;
+               GnmFunc *func = gnm_func_lookup (fname, NULL);
+               g_object_unref (func);
+       }
        service->is_active = FALSE;
 }
 
@@ -741,26 +742,43 @@ function_group_loader_data_free (gpointer data)
        g_free (ld);
 }
 
-static gboolean
-gnm_plugin_loader_module_func_desc_load (GOPluginService *service,
-                                        char const *name,
-                                        GnmFuncDescriptor *res)
+static void
+gnm_plugin_loader_module_func_load_stub (GOPluginService *service,
+                                        GnmFunc *func)
 {
        ServiceLoaderDataFunctionGroup *loader_data;
-       gpointer func_index_ptr;
+       gpointer index_ptr;
+       GnmFuncDescriptor *desc;
+       const char *name;
 
-       g_return_val_if_fail (GNM_IS_PLUGIN_SERVICE_FUNCTION_GROUP (service), FALSE);
-       g_return_val_if_fail (name != NULL, FALSE);
+       g_return_if_fail (GNM_IS_PLUGIN_SERVICE_FUNCTION_GROUP (service));
+       g_return_if_fail (GNM_IS_FUNC (func));
 
+       name = gnm_func_get_name (func, FALSE);
        loader_data = g_object_get_data (G_OBJECT (service), "loader_data");
-       if (g_hash_table_lookup_extended (loader_data->function_indices, (gpointer) name,
-                                         NULL, &func_index_ptr)) {
-               int i = GPOINTER_TO_INT (func_index_ptr);
-               *res = loader_data->module_fn_info_array[i];
-               return TRUE;
+       if (!g_hash_table_lookup_extended (loader_data->function_indices,
+                                          (gpointer)name,
+                                          NULL, &index_ptr))
+               return; // Failed
+
+       desc = loader_data->module_fn_info_array + GPOINTER_TO_INT (index_ptr);
+
+       func->help       = desc->help ? desc->help : NULL;
+       func->impl_status = desc->impl_status;
+       func->test_status = desc->test_status;
+       func->flags       = desc->flags;
+       if (desc->fn_args != NULL) {
+               func->fn.args.func      = desc->fn_args;
+               func->fn.args.arg_spec  = desc->arg_spec;
+               gnm_func_set_function_type (func, GNM_FUNC_TYPE_ARGS);
+       } else if (desc->fn_nodes != NULL) {
+               func->fn.nodes          = desc->fn_nodes;
+               gnm_func_set_function_type (func, GNM_FUNC_TYPE_NODES);
+       } else {
+               g_warning ("Invalid function descriptor with no function");
        }
-       return FALSE;
 }
+
 static void
 gnm_plugin_loader_module_load_service_function_group (GOPluginLoader  *loader,
                                                      GOPluginService *service,
@@ -782,7 +800,7 @@ gnm_plugin_loader_module_load_service_function_group (GOPluginLoader  *loader,
                gint i;
 
                cbs = go_plugin_service_get_cbs (service);
-               cbs->func_desc_load = &gnm_plugin_loader_module_func_desc_load;
+               cbs->load_stub = &gnm_plugin_loader_module_func_load_stub;
 
                loader_data = g_new (ServiceLoaderDataFunctionGroup, 1);
                loader_data->module_fn_info_array = module_fn_info_array;
@@ -949,7 +967,7 @@ gplm_service_unload (GOPluginLoader *l, GOPluginService *s, GOErrorInfo **err)
 {
        if (GNM_IS_PLUGIN_SERVICE_FUNCTION_GROUP (s)) {
                GnmPluginServiceFunctionGroupCallbacks *cbs = go_plugin_service_get_cbs (s);
-               cbs->func_desc_load = NULL;
+               cbs->load_stub = NULL;
        } else if (GNM_IS_PLUGIN_SERVICE_UI (s)) {
                GnmPluginServiceUICallbacks *cbs = go_plugin_service_get_cbs (s);
                cbs->plugin_func_exec_action = NULL;
diff --git a/src/gnm-plugin.h b/src/gnm-plugin.h
index d15ba79b6..c062e2143 100644
--- a/src/gnm-plugin.h
+++ b/src/gnm-plugin.h
@@ -20,8 +20,7 @@ GType gnm_plugin_loader_module_get_type (void);
 GType gnm_plugin_service_function_group_get_type (void);
 typedef struct GnmPluginServiceFunctionGroup_  GnmPluginServiceFunctionGroup;
 typedef struct {
-       gboolean (*func_desc_load) (GOPluginService *service, char const *name,
-                                   GnmFuncDescriptor *res);
+       void (*load_stub) (GOPluginService *service, GnmFunc *func);
 } GnmPluginServiceFunctionGroupCallbacks;
 
 #define GNM_PLUGIN_SERVICE_UI_TYPE  (gnm_plugin_service_ui_get_type ())
diff --git a/src/gnumeric-fwd.h b/src/gnumeric-fwd.h
index 87f69664e..c1a83c265 100644
--- a/src/gnumeric-fwd.h
+++ b/src/gnumeric-fwd.h
@@ -46,7 +46,7 @@ typedef struct _GnmFilterCondition    GnmFilterCondition;
 typedef struct _GnmFont                        GnmFont;
 typedef struct _GnmFontMetrics         GnmFontMetrics;
 typedef struct GnmFT_       GnmFT; /* does not really belong here */
-typedef struct _GnmFunc                        GnmFunc;
+typedef struct GnmFunc_                        GnmFunc;
 typedef struct _GnmFuncDescriptor      GnmFuncDescriptor;
 typedef struct _GnmFuncEvalInfo         GnmFuncEvalInfo;
 typedef struct _GnmFuncGroup           GnmFuncGroup;
diff --git a/src/gutils.c b/src/gutils.c
index 40cefcc4e..6f12d1f8c 100644
--- a/src/gutils.c
+++ b/src/gutils.c
@@ -51,7 +51,7 @@ running_in_tree (void)
        if (!argv0)
                return FALSE;
 
-       /* Sometime we see, e.g., "lt-gnumeric" as basename.  */
+       /* Sometimes we see, e.g., "lt-gnumeric" as basename.  */
        {
                char *base = g_path_get_basename (argv0);
                gboolean has_lt_prefix = (strncmp (base, "lt-", 3) == 0);
diff --git a/src/sheet.c b/src/sheet.c
index 2ed8c0bb2..dc36c0a3e 100644
--- a/src/sheet.c
+++ b/src/sheet.c
@@ -97,7 +97,7 @@ enum {
        LAST_SIGNAL
 };
 
-static guint signals [LAST_SIGNAL] = { 0 };
+static guint signals[LAST_SIGNAL] = { 0 };
 
 typedef struct {
        GObjectClass parent;
diff --git a/src/tools/analysis-anova.c b/src/tools/analysis-anova.c
index 9503191a1..b08ff56d6 100644
--- a/src/tools/analysis-anova.c
+++ b/src/tools/analysis-anova.c
@@ -95,25 +95,25 @@ analysis_tool_anova_two_factor_no_rep_engine_run (data_analysis_output_t *dao,
        GnmFunc *fd_finv;
 
        fd_index = gnm_func_lookup_or_add_placeholder ("INDEX");
-       gnm_func_ref (fd_index);
+       gnm_func_inc_usage (fd_index);
        fd_offset = gnm_func_lookup_or_add_placeholder ("OFFSET");
-       gnm_func_ref (fd_offset);
+       gnm_func_inc_usage (fd_offset);
        fd_count = gnm_func_lookup_or_add_placeholder ("COUNT");
-       gnm_func_ref (fd_count);
+       gnm_func_inc_usage (fd_count);
        fd_sum = gnm_func_lookup_or_add_placeholder ("SUM");
-       gnm_func_ref (fd_sum);
+       gnm_func_inc_usage (fd_sum);
        fd_sumsq = gnm_func_lookup_or_add_placeholder ("SUMSQ");
-       gnm_func_ref (fd_sumsq);
+       gnm_func_inc_usage (fd_sumsq);
        fd_average = gnm_func_lookup_or_add_placeholder ("AVERAGE");
-       gnm_func_ref (fd_average);
+       gnm_func_inc_usage (fd_average);
        fd_var = gnm_func_lookup_or_add_placeholder ("VAR");
-       gnm_func_ref (fd_var);
+       gnm_func_inc_usage (fd_var);
        fd_if = gnm_func_lookup_or_add_placeholder ("IF");
-       gnm_func_ref (fd_if);
+       gnm_func_inc_usage (fd_if);
        fd_fdist = gnm_func_lookup_or_add_placeholder ("FDIST");
-       gnm_func_ref (fd_fdist);
+       gnm_func_inc_usage (fd_fdist);
        fd_finv = gnm_func_lookup_or_add_placeholder ("FINV");
-       gnm_func_ref (fd_finv);
+       gnm_func_inc_usage (fd_finv);
 
        dao_set_merge (dao, 0, 0, 4, 0);
        dao_set_italic (dao, 0, 0, 0, 0);
@@ -384,16 +384,16 @@ analysis_tool_anova_two_factor_no_rep_engine_run (data_analysis_output_t *dao,
        } else
                dao_set_cell (dao, 0, 0, _("Insufficient space available for ANOVA table."));
 
-       gnm_func_unref (fd_index);
-       gnm_func_unref (fd_count);
-       gnm_func_unref (fd_offset);
-       gnm_func_unref (fd_sum);
-       gnm_func_unref (fd_sumsq);
-       gnm_func_unref (fd_average);
-       gnm_func_unref (fd_var);
-       gnm_func_unref (fd_if);
-       gnm_func_unref (fd_finv);
-       gnm_func_unref (fd_fdist);
+       gnm_func_dec_usage (fd_index);
+       gnm_func_dec_usage (fd_count);
+       gnm_func_dec_usage (fd_offset);
+       gnm_func_dec_usage (fd_sum);
+       gnm_func_dec_usage (fd_sumsq);
+       gnm_func_dec_usage (fd_average);
+       gnm_func_dec_usage (fd_var);
+       gnm_func_dec_usage (fd_if);
+       gnm_func_dec_usage (fd_finv);
+       gnm_func_dec_usage (fd_fdist);
 
        gnm_expr_free (expr_region);
 
@@ -433,25 +433,25 @@ analysis_tool_anova_two_factor_engine_run (data_analysis_output_t *dao,
        GnmFunc *fd_finv;
 
        fd_index = gnm_func_lookup_or_add_placeholder ("INDEX");
-       gnm_func_ref (fd_index);
+       gnm_func_inc_usage (fd_index);
        fd_offset = gnm_func_lookup_or_add_placeholder ("OFFSET");
-       gnm_func_ref (fd_offset);
+       gnm_func_inc_usage (fd_offset);
        fd_count = gnm_func_lookup_or_add_placeholder ("COUNT");
-       gnm_func_ref (fd_count);
+       gnm_func_inc_usage (fd_count);
        fd_sum = gnm_func_lookup_or_add_placeholder ("SUM");
-       gnm_func_ref (fd_sum);
+       gnm_func_inc_usage (fd_sum);
        fd_sumsq = gnm_func_lookup_or_add_placeholder ("SUMSQ");
-       gnm_func_ref (fd_sumsq);
+       gnm_func_inc_usage (fd_sumsq);
        fd_average = gnm_func_lookup_or_add_placeholder ("AVERAGE");
-       gnm_func_ref (fd_average);
+       gnm_func_inc_usage (fd_average);
        fd_var = gnm_func_lookup_or_add_placeholder ("VAR");
-       gnm_func_ref (fd_var);
+       gnm_func_inc_usage (fd_var);
        fd_if = gnm_func_lookup_or_add_placeholder ("IF");
-       gnm_func_ref (fd_if);
+       gnm_func_inc_usage (fd_if);
        fd_fdist = gnm_func_lookup_or_add_placeholder ("FDIST");
-       gnm_func_ref (fd_fdist);
+       gnm_func_inc_usage (fd_fdist);
        fd_finv = gnm_func_lookup_or_add_placeholder ("FINV");
-       gnm_func_ref (fd_finv);
+       gnm_func_inc_usage (fd_finv);
 
        dao_set_merge (dao, 0, 0, 4, 0);
        dao_set_italic (dao, 0, 0, 0, 0);
@@ -790,16 +790,16 @@ analysis_tool_anova_two_factor_engine_run (data_analysis_output_t *dao,
        } else
                dao_set_cell (dao, 0, 0, _("Insufficient space available for ANOVA table."));
 
-       gnm_func_unref (fd_index);
-       gnm_func_unref (fd_count);
-       gnm_func_unref (fd_offset);
-       gnm_func_unref (fd_sum);
-       gnm_func_unref (fd_sumsq);
-       gnm_func_unref (fd_average);
-       gnm_func_unref (fd_var);
-       gnm_func_unref (fd_if);
-       gnm_func_unref (fd_finv);
-       gnm_func_unref (fd_fdist);
+       gnm_func_dec_usage (fd_index);
+       gnm_func_dec_usage (fd_count);
+       gnm_func_dec_usage (fd_offset);
+       gnm_func_dec_usage (fd_sum);
+       gnm_func_dec_usage (fd_sumsq);
+       gnm_func_dec_usage (fd_average);
+       gnm_func_dec_usage (fd_var);
+       gnm_func_dec_usage (fd_if);
+       gnm_func_dec_usage (fd_finv);
+       gnm_func_dec_usage (fd_fdist);
 
        gnm_expr_free (expr_source);
        gnm_expr_free (expr_total_count);
diff --git a/src/tools/analysis-auto-expression.c b/src/tools/analysis-auto-expression.c
index fa6b0343b..e6dd21045 100644
--- a/src/tools/analysis-auto-expression.c
+++ b/src/tools/analysis-auto-expression.c
@@ -78,7 +78,7 @@ analysis_tool_auto_expression_engine_clean (gpointer specs)
 {
        analysis_tools_data_auto_expression_t *info = specs;
 
-       gnm_func_unref (info->func);
+       gnm_func_dec_usage (info->func);
        info->func = NULL;
 
        return analysis_tool_generic_clean (specs);
diff --git a/src/tools/analysis-chi-squared.c b/src/tools/analysis-chi-squared.c
index 55e6275be..ee4a69f6f 100644
--- a/src/tools/analysis-chi-squared.c
+++ b/src/tools/analysis-chi-squared.c
@@ -133,15 +133,15 @@ analysis_tool_chi_squared_engine_run (data_analysis_output_t *dao,
                           gnm_expr_new_constant (value_new_float (info->alpha)),
                           make_cellref (0,-2)));
 
-       gnm_func_unref (fd_mmult);
-       gnm_func_unref (fd_row);
-       gnm_func_unref (fd_column);
-       gnm_func_unref (fd_transpose);
-       gnm_func_unref (fd_sum);
-       gnm_func_unref (fd_min);
-       gnm_func_unref (fd_offset);
-       gnm_func_unref (fd_chiinv);
-       gnm_func_unref (fd_chidist);
+       gnm_func_dec_usage (fd_mmult);
+       gnm_func_dec_usage (fd_row);
+       gnm_func_dec_usage (fd_column);
+       gnm_func_dec_usage (fd_transpose);
+       gnm_func_dec_usage (fd_sum);
+       gnm_func_dec_usage (fd_min);
+       gnm_func_dec_usage (fd_offset);
+       gnm_func_dec_usage (fd_chiinv);
+       gnm_func_dec_usage (fd_chidist);
 
        gnm_expr_free (expr_expect);
        gnm_expr_free (expr_region);
diff --git a/src/tools/analysis-exp-smoothing.c b/src/tools/analysis-exp-smoothing.c
index 44d87482a..86f389c22 100644
--- a/src/tools/analysis-exp-smoothing.c
+++ b/src/tools/analysis-exp-smoothing.c
@@ -94,15 +94,15 @@ analysis_tool_exponential_smoothing_engine_ses_h_run (data_analysis_output_t *da
 
        if (info->std_error_flag) {
                fd_sqrt = gnm_func_lookup_or_add_placeholder ("SQRT");
-               gnm_func_ref (fd_sqrt);
+               gnm_func_inc_usage (fd_sqrt);
                fd_sumxmy2 = gnm_func_lookup_or_add_placeholder ("SUMXMY2");
-               gnm_func_ref (fd_sumxmy2);
+               gnm_func_inc_usage (fd_sumxmy2);
        }
 
        fd_index = gnm_func_lookup_or_add_placeholder ("INDEX");
-       gnm_func_ref (fd_index);
+       gnm_func_inc_usage (fd_index);
        fd_offset = gnm_func_lookup_or_add_placeholder ("OFFSET");
-       gnm_func_ref (fd_offset);
+       gnm_func_inc_usage (fd_offset);
 
        if (info->show_graph)
                create_line_plot (&plot, &so);
@@ -243,11 +243,11 @@ analysis_tool_exponential_smoothing_engine_ses_h_run (data_analysis_output_t *da
 
        gnm_expr_free (expr_alpha);
        if (fd_sqrt != NULL)
-               gnm_func_unref (fd_sqrt);
+               gnm_func_dec_usage (fd_sqrt);
        if (fd_sumxmy2 != NULL)
-               gnm_func_unref (fd_sumxmy2);
-       gnm_func_unref (fd_offset);
-       gnm_func_unref (fd_index);
+               gnm_func_dec_usage (fd_sumxmy2);
+       gnm_func_dec_usage (fd_offset);
+       gnm_func_dec_usage (fd_index);
 
        dao_redraw_respan (dao);
 
@@ -272,16 +272,16 @@ analysis_tool_exponential_smoothing_engine_ses_r_run (data_analysis_output_t *da
 
        if (info->std_error_flag) {
                fd_sqrt = gnm_func_lookup_or_add_placeholder ("SQRT");
-               gnm_func_ref (fd_sqrt);
+               gnm_func_inc_usage (fd_sqrt);
                fd_sumxmy2 = gnm_func_lookup_or_add_placeholder ("SUMXMY2");
-               gnm_func_ref (fd_sumxmy2);
+               gnm_func_inc_usage (fd_sumxmy2);
        }
        fd_average = gnm_func_lookup_or_add_placeholder ("AVERAGE");
-       gnm_func_ref (fd_average);
+       gnm_func_inc_usage (fd_average);
        fd_index = gnm_func_lookup_or_add_placeholder ("INDEX");
-       gnm_func_ref (fd_index);
+       gnm_func_inc_usage (fd_index);
        fd_offset = gnm_func_lookup_or_add_placeholder ("OFFSET");
-       gnm_func_ref (fd_offset);
+       gnm_func_inc_usage (fd_offset);
 
        if (info->show_graph)
                create_line_plot (&plot, &so);
@@ -426,12 +426,12 @@ analysis_tool_exponential_smoothing_engine_ses_r_run (data_analysis_output_t *da
 
        gnm_expr_free (expr_alpha);
        if (fd_sqrt != NULL)
-               gnm_func_unref (fd_sqrt);
+               gnm_func_dec_usage (fd_sqrt);
        if (fd_sumxmy2 != NULL)
-               gnm_func_unref (fd_sumxmy2);
-       gnm_func_unref (fd_average);
-       gnm_func_unref (fd_offset);
-       gnm_func_unref (fd_index);
+               gnm_func_dec_usage (fd_sumxmy2);
+       gnm_func_dec_usage (fd_average);
+       gnm_func_dec_usage (fd_offset);
+       gnm_func_dec_usage (fd_index);
 
        dao_redraw_respan (dao);
 
@@ -457,17 +457,17 @@ analysis_tool_exponential_smoothing_engine_des_run (data_analysis_output_t *dao,
 
        if (info->std_error_flag) {
                fd_sqrt = gnm_func_lookup_or_add_placeholder ("SQRT");
-               gnm_func_ref (fd_sqrt);
+               gnm_func_inc_usage (fd_sqrt);
                fd_sumxmy2 = gnm_func_lookup_or_add_placeholder ("SUMXMY2");
-               gnm_func_ref (fd_sumxmy2);
+               gnm_func_inc_usage (fd_sumxmy2);
        }
 
        fd_linest = gnm_func_lookup_or_add_placeholder ("LINEST");
-       gnm_func_ref (fd_linest);
+       gnm_func_inc_usage (fd_linest);
        fd_index = gnm_func_lookup_or_add_placeholder ("INDEX");
-       gnm_func_ref (fd_index);
+       gnm_func_inc_usage (fd_index);
        fd_offset = gnm_func_lookup_or_add_placeholder ("OFFSET");
-       gnm_func_ref (fd_offset);
+       gnm_func_inc_usage (fd_offset);
 
        if (info->show_graph)
                create_line_plot (&plot, &so);
@@ -659,12 +659,12 @@ analysis_tool_exponential_smoothing_engine_des_run (data_analysis_output_t *dao,
        gnm_expr_free (expr_alpha);
        gnm_expr_free (expr_gamma);
        if (fd_sqrt != NULL)
-               gnm_func_unref (fd_sqrt);
+               gnm_func_dec_usage (fd_sqrt);
        if (fd_sumxmy2 != NULL)
-               gnm_func_unref (fd_sumxmy2);
-       gnm_func_unref (fd_linest);
-       gnm_func_unref (fd_offset);
-       gnm_func_unref (fd_index);
+               gnm_func_dec_usage (fd_sumxmy2);
+       gnm_func_dec_usage (fd_linest);
+       gnm_func_dec_usage (fd_offset);
+       gnm_func_dec_usage (fd_index);
 
        dao_redraw_respan (dao);
 
@@ -695,23 +695,23 @@ analysis_tool_exponential_smoothing_engine_ates_run (data_analysis_output_t *dao
 
        if (info->std_error_flag) {
                fd_sqrt = gnm_func_lookup_or_add_placeholder ("SQRT");
-               gnm_func_ref (fd_sqrt);
+               gnm_func_inc_usage (fd_sqrt);
                fd_sumxmy2 = gnm_func_lookup_or_add_placeholder ("SUMXMY2");
-               gnm_func_ref (fd_sumxmy2);
+               gnm_func_inc_usage (fd_sumxmy2);
        }
 
        fd_linest = gnm_func_lookup_or_add_placeholder ("LINEST");
-       gnm_func_ref (fd_linest);
+       gnm_func_inc_usage (fd_linest);
        fd_index = gnm_func_lookup_or_add_placeholder ("INDEX");
-       gnm_func_ref (fd_index);
+       gnm_func_inc_usage (fd_index);
        fd_average = gnm_func_lookup_or_add_placeholder ("AVERAGE");
-       gnm_func_ref (fd_average);
+       gnm_func_inc_usage (fd_average);
        fd_if = gnm_func_lookup_or_add_placeholder ("IF");
-       gnm_func_ref (fd_if);
+       gnm_func_inc_usage (fd_if);
        fd_mod = gnm_func_lookup_or_add_placeholder ("mod");
-       gnm_func_ref (fd_mod);
+       gnm_func_inc_usage (fd_mod);
        fd_row = gnm_func_lookup_or_add_placeholder ("row");
-       gnm_func_ref (fd_row);
+       gnm_func_inc_usage (fd_row);
 
        if (info->show_graph)
                create_line_plot (&plot, &so);
@@ -977,15 +977,15 @@ analysis_tool_exponential_smoothing_engine_ates_run (data_analysis_output_t *dao
        gnm_expr_free (expr_gamma);
        gnm_expr_free (expr_delta);
        if (fd_sqrt != NULL)
-               gnm_func_unref (fd_sqrt);
+               gnm_func_dec_usage (fd_sqrt);
        if (fd_sumxmy2 != NULL)
-               gnm_func_unref (fd_sumxmy2);
-       gnm_func_unref (fd_linest);
-       gnm_func_unref (fd_index);
-       gnm_func_unref (fd_average);
-       gnm_func_unref (fd_if);
-       gnm_func_unref (fd_mod);
-       gnm_func_unref (fd_row);
+               gnm_func_dec_usage (fd_sumxmy2);
+       gnm_func_dec_usage (fd_linest);
+       gnm_func_dec_usage (fd_index);
+       gnm_func_dec_usage (fd_average);
+       gnm_func_dec_usage (fd_if);
+       gnm_func_dec_usage (fd_mod);
+       gnm_func_dec_usage (fd_row);
 
        dao_redraw_respan (dao);
 
@@ -1016,25 +1016,25 @@ analysis_tool_exponential_smoothing_engine_mtes_run (data_analysis_output_t *dao
 
        if (info->std_error_flag) {
                fd_sqrt = gnm_func_lookup_or_add_placeholder ("SQRT");
-               gnm_func_ref (fd_sqrt);
+               gnm_func_inc_usage (fd_sqrt);
                fd_sumsq = gnm_func_lookup_or_add_placeholder ("SUMSQ");
-               gnm_func_ref (fd_sumsq);
+               gnm_func_inc_usage (fd_sumsq);
        }
 
        fd_linest = gnm_func_lookup_or_add_placeholder ("LINEST");
-       gnm_func_ref (fd_linest);
+       gnm_func_inc_usage (fd_linest);
        fd_index = gnm_func_lookup_or_add_placeholder ("INDEX");
-       gnm_func_ref (fd_index);
+       gnm_func_inc_usage (fd_index);
        fd_offset = gnm_func_lookup_or_add_placeholder ("OFFSET");
-       gnm_func_ref (fd_offset);
+       gnm_func_inc_usage (fd_offset);
        fd_average = gnm_func_lookup_or_add_placeholder ("AVERAGE");
-       gnm_func_ref (fd_average);
+       gnm_func_inc_usage (fd_average);
        fd_if = gnm_func_lookup_or_add_placeholder ("IF");
-       gnm_func_ref (fd_if);
+       gnm_func_inc_usage (fd_if);
        fd_mod = gnm_func_lookup_or_add_placeholder ("mod");
-       gnm_func_ref (fd_mod);
+       gnm_func_inc_usage (fd_mod);
        fd_row = gnm_func_lookup_or_add_placeholder ("row");
-       gnm_func_ref (fd_row);
+       gnm_func_inc_usage (fd_row);
 
        if (info->show_graph)
                create_line_plot (&plot, &so);
@@ -1352,16 +1352,16 @@ analysis_tool_exponential_smoothing_engine_mtes_run (data_analysis_output_t *dao
        gnm_expr_free (expr_gamma);
        gnm_expr_free (expr_delta);
        if (fd_sqrt != NULL)
-               gnm_func_unref (fd_sqrt);
+               gnm_func_dec_usage (fd_sqrt);
        if (fd_sumsq != NULL)
-               gnm_func_unref (fd_sumsq);
-       gnm_func_unref (fd_linest);
-       gnm_func_unref (fd_offset);
-       gnm_func_unref (fd_index);
-       gnm_func_unref (fd_average);
-       gnm_func_unref (fd_if);
-       gnm_func_unref (fd_mod);
-       gnm_func_unref (fd_row);
+               gnm_func_dec_usage (fd_sumsq);
+       gnm_func_dec_usage (fd_linest);
+       gnm_func_dec_usage (fd_offset);
+       gnm_func_dec_usage (fd_index);
+       gnm_func_dec_usage (fd_average);
+       gnm_func_dec_usage (fd_if);
+       gnm_func_dec_usage (fd_mod);
+       gnm_func_dec_usage (fd_row);
 
        dao_redraw_respan (dao);
 
diff --git a/src/tools/analysis-frequency.c b/src/tools/analysis-frequency.c
index 8ac854db3..e96df17d9 100644
--- a/src/tools/analysis-frequency.c
+++ b/src/tools/analysis-frequency.c
@@ -51,23 +51,23 @@ analysis_tool_frequency_engine_run (data_analysis_output_t *dao,
        GnmFunc *fd_exact = NULL;
 
        fd_sum = gnm_func_lookup_or_add_placeholder ("SUM");
-       gnm_func_ref (fd_sum);
+       gnm_func_inc_usage (fd_sum);
        fd_if = gnm_func_lookup_or_add_placeholder ("IF");
-       gnm_func_ref (fd_if);
+       gnm_func_inc_usage (fd_if);
        fd_index = gnm_func_lookup_or_add_placeholder ("INDEX");
-       gnm_func_ref (fd_index);
+       gnm_func_inc_usage (fd_index);
        fd_isblank = gnm_func_lookup_or_add_placeholder ("ISBLANK");
-       gnm_func_ref (fd_isblank);
+       gnm_func_inc_usage (fd_isblank);
 
        if (info->exact) {
                fd_exact = gnm_func_lookup_or_add_placeholder ("EXACT");
-               gnm_func_ref (fd_exact);
+               gnm_func_inc_usage (fd_exact);
        }
        if (info->percentage) {
                fd_rows = gnm_func_lookup_or_add_placeholder ("ROWS");
-               gnm_func_ref (fd_rows);
+               gnm_func_inc_usage (fd_rows);
                fd_columns = gnm_func_lookup_or_add_placeholder ("COLUMNS");
-               gnm_func_ref (fd_columns);
+               gnm_func_inc_usage (fd_columns);
        }
        /* General Info */
 
@@ -190,16 +190,16 @@ analysis_tool_frequency_engine_run (data_analysis_output_t *dao,
                gnm_expr_free (expr_count);
        }
 
-       gnm_func_unref (fd_if);
-       gnm_func_unref (fd_sum);
-       gnm_func_unref (fd_index);
-       gnm_func_unref (fd_isblank);
+       gnm_func_dec_usage (fd_if);
+       gnm_func_dec_usage (fd_sum);
+       gnm_func_dec_usage (fd_index);
+       gnm_func_dec_usage (fd_isblank);
        if (fd_rows != NULL)
-               gnm_func_unref (fd_rows);
+               gnm_func_dec_usage (fd_rows);
        if (fd_columns != NULL)
-               gnm_func_unref (fd_columns);
+               gnm_func_dec_usage (fd_columns);
        if (fd_exact != NULL)
-               gnm_func_unref (fd_exact);
+               gnm_func_dec_usage (fd_exact);
 
        /* Create Chart if requested */
        if (info->chart != NO_CHART) {
diff --git a/src/tools/analysis-histogram.c b/src/tools/analysis-histogram.c
index d77c9779b..12f1b2d42 100644
--- a/src/tools/analysis-histogram.c
+++ b/src/tools/analysis-histogram.c
@@ -142,11 +142,11 @@ analysis_tool_histogram_engine_run (data_analysis_output_t *dao,
        char const *format;
 
        fd_small = gnm_func_lookup_or_add_placeholder ("SMALL");
-       gnm_func_ref (fd_small);
+       gnm_func_inc_usage (fd_small);
 
        if (info->base.labels) {
                fd_index = gnm_func_lookup_or_add_placeholder ("INDEX");
-               gnm_func_ref (fd_index);
+               gnm_func_inc_usage (fd_index);
        }
 
 
@@ -212,12 +212,12 @@ analysis_tool_histogram_engine_run (data_analysis_output_t *dao,
                        GnmFunc *fd_min;
 
                        fd_min = gnm_func_lookup_or_add_placeholder ("MIN");
-                       gnm_func_ref (fd_min);
+                       gnm_func_inc_usage (fd_min);
                        dao_set_cell_expr (dao, to_col, i_start,
                                           gnm_expr_new_funcall1
                                           (fd_min,
                                            gnm_expr_new_constant (value_dup (val))));
-                       gnm_func_unref (fd_min);
+                       gnm_func_dec_usage (fd_min);
                }
 
                if (info->max_given)
@@ -226,12 +226,12 @@ analysis_tool_histogram_engine_run (data_analysis_output_t *dao,
                        GnmFunc *fd_max;
 
                        fd_max = gnm_func_lookup_or_add_placeholder ("MAX");
-                       gnm_func_ref (fd_max);
+                       gnm_func_inc_usage (fd_max);
                        dao_set_cell_expr (dao, to_col, i_start + i_limit - 1,
                                           gnm_expr_new_funcall1
                                           (fd_max,
                                            gnm_expr_new_constant (value_dup (val))));
-                       gnm_func_unref (fd_max);
+                       gnm_func_dec_usage (fd_max);
                }
 
                value_release (val);
@@ -347,9 +347,9 @@ analysis_tool_histogram_engine_run (data_analysis_output_t *dao,
        if (expr_bin != NULL)
                gnm_expr_free (expr_bin);
 
-       gnm_func_unref (fd_small);
+       gnm_func_dec_usage (fd_small);
        if (fd_index != NULL)
-               gnm_func_unref (fd_index);
+               gnm_func_dec_usage (fd_index);
 
        /* Create Chart if requested */
        if (info->chart != NO_CHART) {
diff --git a/src/tools/analysis-kaplan-meier.c b/src/tools/analysis-kaplan-meier.c
index 1eabd5574..8d43c3469 100644
--- a/src/tools/analysis-kaplan-meier.c
+++ b/src/tools/analysis-kaplan-meier.c
@@ -76,21 +76,21 @@ analysis_tool_kaplan_meier_engine_run (data_analysis_output_t *dao,
        GSList *gl = info->group_list;
 
        fd_small = gnm_func_lookup_or_add_placeholder ("SMALL");
-       gnm_func_ref (fd_small);
+       gnm_func_inc_usage (fd_small);
        fd_if = gnm_func_lookup_or_add_placeholder ("IF");
-       gnm_func_ref (fd_if);
+       gnm_func_inc_usage (fd_if);
        fd_iserror = gnm_func_lookup_or_add_placeholder ("ISERROR");
-       gnm_func_ref (fd_iserror);
+       gnm_func_inc_usage (fd_iserror);
        fd_sum = gnm_func_lookup_or_add_placeholder ("SUM");
-       gnm_func_ref (fd_sum);
+       gnm_func_inc_usage (fd_sum);
 
        if (info->std_err) {
                fd_sqrt = gnm_func_lookup_or_add_placeholder ("SQRT");
-               gnm_func_ref (fd_sqrt);
+               gnm_func_inc_usage (fd_sqrt);
        }
        if (info->median) {
                fd_min = gnm_func_lookup_or_add_placeholder ("MIN");
-               gnm_func_ref (fd_min);
+               gnm_func_inc_usage (fd_min);
        }
 
        rows =  info->base.range_1->v_range.cell.b.row
@@ -523,7 +523,7 @@ analysis_tool_kaplan_meier_engine_run (data_analysis_output_t *dao,
                GnmExpr const *expr_death_total = gnm_expr_new_constant (value_new_int (0));
 
                fd_chidist = gnm_func_lookup_or_add_placeholder ("CHIDIST");
-               gnm_func_ref (fd_chidist);
+               gnm_func_inc_usage (fd_chidist);
 
                dao_set_italic (dao, 1, logrank_test_y_offset, 1, logrank_test_y_offset+3);
                set_cell_text_col (dao, 1, logrank_test_y_offset,
@@ -605,7 +605,7 @@ analysis_tool_kaplan_meier_engine_run (data_analysis_output_t *dao,
                                                make_cellref (0,-1));
                dao_set_cell_expr (dao, 2, logrank_test_y_offset + 3, expr_p);
 
-               gnm_func_unref (fd_chidist);
+               gnm_func_dec_usage (fd_chidist);
        }
 
 
@@ -616,14 +616,14 @@ analysis_tool_kaplan_meier_engine_run (data_analysis_output_t *dao,
        if (expr_group_data != NULL)
                gnm_expr_free (expr_group_data);
 
-       gnm_func_unref (fd_small);
-       gnm_func_unref (fd_if);
-       gnm_func_unref (fd_iserror);
-       gnm_func_unref (fd_sum);
+       gnm_func_dec_usage (fd_small);
+       gnm_func_dec_usage (fd_if);
+       gnm_func_dec_usage (fd_iserror);
+       gnm_func_dec_usage (fd_sum);
        if (fd_sqrt != NULL)
-               gnm_func_unref (fd_sqrt);
+               gnm_func_dec_usage (fd_sqrt);
        if (fd_min != NULL)
-               gnm_func_unref (fd_min);
+               gnm_func_dec_usage (fd_min);
 
        dao_redraw_respan (dao);
 
diff --git a/src/tools/analysis-normality.c b/src/tools/analysis-normality.c
index b691f5bf5..12e15820e 100644
--- a/src/tools/analysis-normality.c
+++ b/src/tools/analysis-normality.c
@@ -88,9 +88,9 @@ analysis_tool_normality_engine_run (data_analysis_output_t *dao,
        }
 
        fd = gnm_func_lookup_or_add_placeholder (fdname);
-       gnm_func_ref (fd);
+       gnm_func_inc_usage (fd);
        fd_if = gnm_func_lookup_or_add_placeholder ("IF");
-       gnm_func_ref (fd_if);
+       gnm_func_inc_usage (fd_if);
 
        dao_set_italic (dao, 0, 0, 0, 5);
         dao_set_cell (dao, 0, 0, _(testname));
@@ -172,8 +172,8 @@ analysis_tool_normality_engine_run (data_analysis_output_t *dao,
        }
 
 
-       gnm_func_unref (fd);
-       gnm_func_unref (fd_if);
+       gnm_func_dec_usage (fd);
+       gnm_func_dec_usage (fd_if);
 
        dao_redraw_respan (dao);
        return 0;
diff --git a/src/tools/analysis-one-mean-test.c b/src/tools/analysis-one-mean-test.c
index 39c8bbb5a..b7fd17184 100644
--- a/src/tools/analysis-one-mean-test.c
+++ b/src/tools/analysis-one-mean-test.c
@@ -49,19 +49,19 @@ analysis_tool_one_mean_test_engine_run (data_analysis_output_t *dao,
        GnmFunc *fd_count;
 
        fd_count = gnm_func_lookup_or_add_placeholder ("COUNT");
-       gnm_func_ref (fd_count);
+       gnm_func_inc_usage (fd_count);
        fd_mean = gnm_func_lookup_or_add_placeholder ("AVERAGE");
-       gnm_func_ref (fd_mean);
+       gnm_func_inc_usage (fd_mean);
        fd_var = gnm_func_lookup_or_add_placeholder ("VAR");
-       gnm_func_ref (fd_var);
+       gnm_func_inc_usage (fd_var);
        fd_sqrt = gnm_func_lookup_or_add_placeholder ("SQRT");
-       gnm_func_ref (fd_sqrt);
+       gnm_func_inc_usage (fd_sqrt);
        fd_abs = gnm_func_lookup_or_add_placeholder ("ABS");
-       gnm_func_ref (fd_abs);
+       gnm_func_inc_usage (fd_abs);
        fd_tdist = gnm_func_lookup_or_add_placeholder ("TDIST");
-       gnm_func_ref (fd_tdist);
+       gnm_func_inc_usage (fd_tdist);
        fd_iferror = gnm_func_lookup_or_add_placeholder ("IFERROR");
-       gnm_func_ref (fd_iferror);
+       gnm_func_inc_usage (fd_iferror);
 
        dao_set_italic (dao, 0, 0, 0, 9);
        set_cell_text_col (dao, 0, 0, _("/Student-t Test"
@@ -129,13 +129,13 @@ analysis_tool_one_mean_test_engine_run (data_analysis_output_t *dao,
                                              gnm_expr_new_constant (value_new_int (2)));
                dao_set_cell_expr (dao, col, 9, expr);
        }
-       gnm_func_unref (fd_count);
-       gnm_func_unref (fd_mean);
-       gnm_func_unref (fd_var);
-       gnm_func_unref (fd_abs);
-       gnm_func_unref (fd_sqrt);
-       gnm_func_unref (fd_tdist);
-       gnm_func_unref (fd_iferror);
+       gnm_func_dec_usage (fd_count);
+       gnm_func_dec_usage (fd_mean);
+       gnm_func_dec_usage (fd_var);
+       gnm_func_dec_usage (fd_abs);
+       gnm_func_dec_usage (fd_sqrt);
+       gnm_func_dec_usage (fd_tdist);
+       gnm_func_dec_usage (fd_iferror);
 
        dao_redraw_respan (dao);
 
diff --git a/src/tools/analysis-principal-components.c b/src/tools/analysis-principal-components.c
index 81e76b864..b5ab82571 100644
--- a/src/tools/analysis-principal-components.c
+++ b/src/tools/analysis-principal-components.c
@@ -69,25 +69,25 @@ analysis_tool_principal_components_engine_run (data_analysis_output_t *dao,
        }
 
        fd_mean = gnm_func_lookup_or_add_placeholder ("AVERAGE");
-       gnm_func_ref (fd_mean);
+       gnm_func_inc_usage (fd_mean);
        fd_var = gnm_func_lookup_or_add_placeholder ("VAR");
-       gnm_func_ref (fd_var);
+       gnm_func_inc_usage (fd_var);
        fd_eigen = gnm_func_lookup_or_add_placeholder ("EIGEN");
-       gnm_func_ref (fd_eigen);
+       gnm_func_inc_usage (fd_eigen);
        fd_mmult = gnm_func_lookup_or_add_placeholder ("MMULT");
-       gnm_func_ref (fd_mmult);
+       gnm_func_inc_usage (fd_mmult);
        fd_munit = gnm_func_lookup_or_add_placeholder ("MUNIT");
-       gnm_func_ref (fd_munit);
+       gnm_func_inc_usage (fd_munit);
        fd_sqrt = gnm_func_lookup_or_add_placeholder ("SQRT");
-       gnm_func_ref (fd_sqrt);
+       gnm_func_inc_usage (fd_sqrt);
        fd_count = gnm_func_lookup_or_add_placeholder ("COUNT");
-       gnm_func_ref (fd_count);
+       gnm_func_inc_usage (fd_count);
        fd_sum = gnm_func_lookup_or_add_placeholder ("SUM");
-       gnm_func_ref (fd_sum);
+       gnm_func_inc_usage (fd_sum);
        fd_and = gnm_func_lookup_or_add_placeholder ("AND");
-       gnm_func_ref (fd_and);
+       gnm_func_inc_usage (fd_and);
        fd_if = gnm_func_lookup_or_add_placeholder ("IF");
-       gnm_func_ref (fd_if);
+       gnm_func_inc_usage (fd_if);
 
        dao_set_bold (dao, 0, 0, 0, 0);
        dao_set_italic (dao, 0, 0, 0, 11 + 3 * l);
@@ -186,16 +186,16 @@ analysis_tool_principal_components_engine_run (data_analysis_output_t *dao,
                                       expr_munit));
        dao_set_array_expr (dao, 1, 10 + 2 * l, l, l, expr);
 
-       gnm_func_unref (fd_mean);
-       gnm_func_unref (fd_var);
-       gnm_func_unref (fd_eigen);
-       gnm_func_unref (fd_mmult);
-       gnm_func_unref (fd_munit);
-       gnm_func_unref (fd_sqrt);
-       gnm_func_unref (fd_count);
-       gnm_func_unref (fd_sum);
-       gnm_func_unref (fd_and);
-       gnm_func_unref (fd_if);
+       gnm_func_dec_usage (fd_mean);
+       gnm_func_dec_usage (fd_var);
+       gnm_func_dec_usage (fd_eigen);
+       gnm_func_dec_usage (fd_mmult);
+       gnm_func_dec_usage (fd_munit);
+       gnm_func_dec_usage (fd_sqrt);
+       gnm_func_dec_usage (fd_count);
+       gnm_func_dec_usage (fd_sum);
+       gnm_func_dec_usage (fd_and);
+       gnm_func_dec_usage (fd_if);
 
        dao_redraw_respan (dao);
        return 0;
diff --git a/src/tools/analysis-sign-test.c b/src/tools/analysis-sign-test.c
index e02be4691..604ef5831 100644
--- a/src/tools/analysis-sign-test.c
+++ b/src/tools/analysis-sign-test.c
@@ -54,19 +54,19 @@ analysis_tool_sign_test_engine_run (data_analysis_output_t *dao,
        GnmFunc *fd_iferror;
 
        fd_median = gnm_func_lookup_or_add_placeholder ("MEDIAN");
-       gnm_func_ref (fd_median);
+       gnm_func_inc_usage (fd_median);
        fd_if = gnm_func_lookup_or_add_placeholder ("IF");
-       gnm_func_ref (fd_if);
+       gnm_func_inc_usage (fd_if);
        fd_sum = gnm_func_lookup_or_add_placeholder ("SUM");
-       gnm_func_ref (fd_sum);
+       gnm_func_inc_usage (fd_sum);
        fd_min = gnm_func_lookup_or_add_placeholder ("MIN");
-       gnm_func_ref (fd_min);
+       gnm_func_inc_usage (fd_min);
        fd_binomdist = gnm_func_lookup_or_add_placeholder ("BINOMDIST");
-       gnm_func_ref (fd_binomdist);
+       gnm_func_inc_usage (fd_binomdist);
        fd_isnumber = gnm_func_lookup_or_add_placeholder ("ISNUMBER");
-       gnm_func_ref (fd_isnumber);
+       gnm_func_inc_usage (fd_isnumber);
        fd_iferror = gnm_func_lookup_or_add_placeholder ("IFERROR");
-       gnm_func_ref (fd_iferror);
+       gnm_func_inc_usage (fd_iferror);
 
        dao_set_italic (dao, 0, 0, 0, 9);
        set_cell_text_col (dao, 0, 0, _("/Sign Test"
@@ -157,13 +157,13 @@ analysis_tool_sign_test_engine_run (data_analysis_output_t *dao,
                dao_set_cell_array_expr (dao, col + 1, 7, expr);
        }
 
-       gnm_func_unref (fd_median);
-       gnm_func_unref (fd_if);
-       gnm_func_unref (fd_min);
-       gnm_func_unref (fd_sum);
-       gnm_func_unref (fd_binomdist);
-       gnm_func_unref (fd_isnumber);
-       gnm_func_unref (fd_iferror);
+       gnm_func_dec_usage (fd_median);
+       gnm_func_dec_usage (fd_if);
+       gnm_func_dec_usage (fd_min);
+       gnm_func_dec_usage (fd_sum);
+       gnm_func_dec_usage (fd_binomdist);
+       gnm_func_dec_usage (fd_isnumber);
+       gnm_func_dec_usage (fd_iferror);
 
        dao_redraw_respan (dao);
 
@@ -196,19 +196,19 @@ analysis_tool_sign_test_two_engine_run (data_analysis_output_t *dao,
        GnmFunc *fd_iferror;
 
        fd_median = gnm_func_lookup_or_add_placeholder ("MEDIAN");
-       gnm_func_ref (fd_median);
+       gnm_func_inc_usage (fd_median);
        fd_if = gnm_func_lookup_or_add_placeholder ("IF");
-       gnm_func_ref (fd_if);
+       gnm_func_inc_usage (fd_if);
        fd_sum = gnm_func_lookup_or_add_placeholder ("SUM");
-       gnm_func_ref (fd_sum);
+       gnm_func_inc_usage (fd_sum);
        fd_min = gnm_func_lookup_or_add_placeholder ("MIN");
-       gnm_func_ref (fd_min);
+       gnm_func_inc_usage (fd_min);
        fd_binomdist = gnm_func_lookup_or_add_placeholder ("BINOMDIST");
-       gnm_func_ref (fd_binomdist);
+       gnm_func_inc_usage (fd_binomdist);
        fd_isnumber = gnm_func_lookup_or_add_placeholder ("ISNUMBER");
-       gnm_func_ref (fd_isnumber);
+       gnm_func_inc_usage (fd_isnumber);
        fd_iferror = gnm_func_lookup_or_add_placeholder ("IFERROR");
-       gnm_func_ref (fd_iferror);
+       gnm_func_inc_usage (fd_iferror);
 
        dao_set_italic (dao, 0, 0, 0, 9);
        set_cell_text_col (dao, 0, 0, _("/Sign Test"
@@ -323,13 +323,13 @@ analysis_tool_sign_test_two_engine_run (data_analysis_output_t *dao,
                                    GNM_EXPR_OP_MULT, make_cellref (0,-1));
        dao_set_cell_array_expr (dao, 1, 7, expr);
 
-       gnm_func_unref (fd_median);
-       gnm_func_unref (fd_if);
-       gnm_func_unref (fd_min);
-       gnm_func_unref (fd_sum);
-       gnm_func_unref (fd_binomdist);
-       gnm_func_unref (fd_isnumber);
-       gnm_func_unref (fd_iferror);
+       gnm_func_dec_usage (fd_median);
+       gnm_func_dec_usage (fd_if);
+       gnm_func_dec_usage (fd_min);
+       gnm_func_dec_usage (fd_sum);
+       gnm_func_dec_usage (fd_binomdist);
+       gnm_func_dec_usage (fd_isnumber);
+       gnm_func_dec_usage (fd_iferror);
 
        value_release (val_1);
        value_release (val_2);
diff --git a/src/tools/analysis-signed-rank-test.c b/src/tools/analysis-signed-rank-test.c
index dd41acd31..48ed5c3e1 100644
--- a/src/tools/analysis-signed-rank-test.c
+++ b/src/tools/analysis-signed-rank-test.c
@@ -238,17 +238,17 @@ analysis_tool_signed_rank_test_engine_run (data_analysis_output_t *dao,
                dao_set_cell_expr (dao, col + 1, 9, expr);
        }
 
-       gnm_func_unref (fd_median);
-       gnm_func_unref (fd_if);
-       gnm_func_unref (fd_min);
-       gnm_func_unref (fd_sum);
-       gnm_func_unref (fd_normdist);
-       gnm_func_unref (fd_isnumber);
-       gnm_func_unref (fd_iferror);
-       gnm_func_unref (fd_rank);
-       gnm_func_unref (fd_abs);
-       gnm_func_unref (fd_sqrt);
-       gnm_func_unref (fd_max);
+       gnm_func_dec_usage (fd_median);
+       gnm_func_dec_usage (fd_if);
+       gnm_func_dec_usage (fd_min);
+       gnm_func_dec_usage (fd_sum);
+       gnm_func_dec_usage (fd_normdist);
+       gnm_func_dec_usage (fd_isnumber);
+       gnm_func_dec_usage (fd_iferror);
+       gnm_func_dec_usage (fd_rank);
+       gnm_func_dec_usage (fd_abs);
+       gnm_func_dec_usage (fd_sqrt);
+       gnm_func_dec_usage (fd_max);
 
        dao_redraw_respan (dao);
 
@@ -505,17 +505,17 @@ analysis_tool_signed_rank_test_two_engine_run (data_analysis_output_t *dao,
                                    GNM_EXPR_OP_MULT, make_cellref (0,-1));
        dao_set_cell_array_expr (dao, 1, 10, expr);
 
-       gnm_func_unref (fd_median);
-       gnm_func_unref (fd_if);
-       gnm_func_unref (fd_min);
-       gnm_func_unref (fd_sum);
-       gnm_func_unref (fd_normdist);
-       gnm_func_unref (fd_isnumber);
-       gnm_func_unref (fd_iferror);
-       gnm_func_unref (fd_rank);
-       gnm_func_unref (fd_abs);
-       gnm_func_unref (fd_sqrt);
-       gnm_func_unref (fd_max);
+       gnm_func_dec_usage (fd_median);
+       gnm_func_dec_usage (fd_if);
+       gnm_func_dec_usage (fd_min);
+       gnm_func_dec_usage (fd_sum);
+       gnm_func_dec_usage (fd_normdist);
+       gnm_func_dec_usage (fd_isnumber);
+       gnm_func_dec_usage (fd_iferror);
+       gnm_func_dec_usage (fd_rank);
+       gnm_func_dec_usage (fd_abs);
+       gnm_func_dec_usage (fd_sqrt);
+       gnm_func_dec_usage (fd_max);
 
        value_release (val_1);
        value_release (val_2);
diff --git a/src/tools/analysis-tools.c b/src/tools/analysis-tools.c
index d09887b46..59ee76897 100644
--- a/src/tools/analysis-tools.c
+++ b/src/tools/analysis-tools.c
@@ -223,9 +223,9 @@ analysis_tools_write_a_label (GnmValue *val, data_analysis_output_t *dao,
                GnmFunc *fd_cell;
 
                fd_concatenate = gnm_func_lookup_or_add_placeholder ("CONCATENATE");
-               gnm_func_ref (fd_concatenate);
+               gnm_func_inc_usage (fd_concatenate);
                fd_cell = gnm_func_lookup_or_add_placeholder ("CELL");
-               gnm_func_ref (fd_cell);
+               gnm_func_inc_usage (fd_cell);
 
                dao_set_cell_expr (dao, x, y, gnm_expr_new_funcall3
                                   (fd_concatenate, gnm_expr_new_constant (value_new_string (label)),
@@ -234,8 +234,8 @@ analysis_tools_write_a_label (GnmValue *val, data_analysis_output_t *dao,
                                                           gnm_expr_new_constant (value_new_string (str)),
                                                           gnm_expr_new_constant (value_dup (val)))));
 
-               gnm_func_unref (fd_concatenate);
-               gnm_func_unref (fd_cell);
+               gnm_func_dec_usage (fd_concatenate);
+               gnm_func_dec_usage (fd_cell);
        }
 }
 
@@ -566,6 +566,14 @@ int analysis_tool_calc_length (analysis_tools_data_generic_t *info)
        return result;
 }
 
+/**
+ * analysis_tool_get_function:
+ * @name: name of function
+ * @dao:
+ *
+ * Returns: (transfer full): the function named @name or a placeholder.
+ * The usage count of the function is incremented.
+ */
 GnmFunc *
 analysis_tool_get_function (char const *name,
                            data_analysis_output_t *dao)
@@ -573,7 +581,7 @@ analysis_tool_get_function (char const *name,
        GnmFunc *fd;
 
        fd = gnm_func_lookup_or_add_placeholder (name);
-       gnm_func_ref (fd);
+       gnm_func_inc_usage (fd);
        return fd;
 }
 
@@ -603,7 +611,7 @@ analysis_tool_table (data_analysis_output_t *dao,
        dao_set_cell_printf (dao, 0, 0, "%s", title);
 
        fd = gnm_func_lookup_or_add_placeholder (functionname);
-       gnm_func_ref (fd);
+       gnm_func_inc_usage (fd);
 
        for (col = 1, inputdata = info->input; inputdata != NULL;
             inputdata = inputdata->next, col++) {
@@ -650,7 +658,7 @@ analysis_tool_table (data_analysis_output_t *dao,
        }
 
        g_slist_free_full (inputexpr, (GDestroyNotify)gnm_expr_free);
-       if (fd) gnm_func_unref (fd);
+       if (fd) gnm_func_dec_usage (fd);
 
        dao_redraw_respan (dao);
        return FALSE;
@@ -795,29 +803,29 @@ summary_statistics (data_analysis_output_t *dao,
        GnmFunc *fd_sqrt;
 
        fd_mean = gnm_func_lookup_or_add_placeholder ("AVERAGE");
-       gnm_func_ref (fd_mean);
+       gnm_func_inc_usage (fd_mean);
        fd_median = gnm_func_lookup_or_add_placeholder (info->use_ssmedian ? "SSMEDIAN" : "MEDIAN");
-       gnm_func_ref (fd_median);
+       gnm_func_inc_usage (fd_median);
        fd_mode = gnm_func_lookup_or_add_placeholder ("MODE");
-       gnm_func_ref (fd_mode);
+       gnm_func_inc_usage (fd_mode);
        fd_stdev = gnm_func_lookup_or_add_placeholder ("STDEV");
-       gnm_func_ref (fd_stdev);
+       gnm_func_inc_usage (fd_stdev);
        fd_var = gnm_func_lookup_or_add_placeholder ("VAR");
-       gnm_func_ref (fd_var);
+       gnm_func_inc_usage (fd_var);
        fd_kurt = gnm_func_lookup_or_add_placeholder ("KURT");
-       gnm_func_ref (fd_kurt);
+       gnm_func_inc_usage (fd_kurt);
        fd_skew = gnm_func_lookup_or_add_placeholder ("SKEW");
-       gnm_func_ref (fd_skew);
+       gnm_func_inc_usage (fd_skew);
        fd_min = gnm_func_lookup_or_add_placeholder ("MIN");
-       gnm_func_ref (fd_min);
+       gnm_func_inc_usage (fd_min);
        fd_max = gnm_func_lookup_or_add_placeholder ("MAX");
-       gnm_func_ref (fd_max);
+       gnm_func_inc_usage (fd_max);
        fd_sum = gnm_func_lookup_or_add_placeholder ("SUM");
-       gnm_func_ref (fd_sum);
+       gnm_func_inc_usage (fd_sum);
        fd_count = gnm_func_lookup_or_add_placeholder ("COUNT");
-       gnm_func_ref (fd_count);
+       gnm_func_inc_usage (fd_count);
        fd_sqrt = gnm_func_lookup_or_add_placeholder ("SQRT");
-       gnm_func_ref (fd_sqrt);
+       gnm_func_inc_usage (fd_sqrt);
 
         dao_set_cell (dao, 0, 0, NULL);
 
@@ -935,18 +943,18 @@ summary_statistics (data_analysis_output_t *dao,
                dao_set_cell_expr (dao, col + 1, 2, expr);
        }
 
-       gnm_func_unref (fd_mean);
-       gnm_func_unref (fd_median);
-       gnm_func_unref (fd_mode);
-       gnm_func_unref (fd_stdev);
-       gnm_func_unref (fd_var);
-       gnm_func_unref (fd_kurt);
-       gnm_func_unref (fd_skew);
-       gnm_func_unref (fd_min);
-       gnm_func_unref (fd_max);
-       gnm_func_unref (fd_sum);
-       gnm_func_unref (fd_count);
-       gnm_func_unref (fd_sqrt);
+       gnm_func_dec_usage (fd_mean);
+       gnm_func_dec_usage (fd_median);
+       gnm_func_dec_usage (fd_mode);
+       gnm_func_dec_usage (fd_stdev);
+       gnm_func_dec_usage (fd_var);
+       gnm_func_dec_usage (fd_kurt);
+       gnm_func_dec_usage (fd_skew);
+       gnm_func_dec_usage (fd_min);
+       gnm_func_dec_usage (fd_max);
+       gnm_func_dec_usage (fd_sum);
+       gnm_func_dec_usage (fd_count);
+       gnm_func_dec_usage (fd_sqrt);
 }
 
 static void
@@ -974,15 +982,15 @@ confidence_level (data_analysis_output_t *dao,
         dao_set_cell (dao, 0, 0, NULL);
 
        fd_mean = gnm_func_lookup_or_add_placeholder ("AVERAGE");
-       gnm_func_ref (fd_mean);
+       gnm_func_inc_usage (fd_mean);
        fd_var = gnm_func_lookup_or_add_placeholder ("VAR");
-       gnm_func_ref (fd_var);
+       gnm_func_inc_usage (fd_var);
        fd_count = gnm_func_lookup_or_add_placeholder ("COUNT");
-       gnm_func_ref (fd_count);
+       gnm_func_inc_usage (fd_count);
        fd_tinv = gnm_func_lookup_or_add_placeholder ("TINV");
-       gnm_func_ref (fd_tinv);
+       gnm_func_inc_usage (fd_tinv);
        fd_sqrt = gnm_func_lookup_or_add_placeholder ("SQRT");
-       gnm_func_ref (fd_sqrt);
+       gnm_func_inc_usage (fd_sqrt);
 
 
        for (col = 0; data != NULL; data = data->next, col++) {
@@ -1034,11 +1042,11 @@ confidence_level (data_analysis_output_t *dao,
                                                        expr));
        }
 
-       gnm_func_unref (fd_mean);
-       gnm_func_unref (fd_var);
-       gnm_func_unref (fd_count);
-       gnm_func_unref (fd_tinv);
-       gnm_func_unref (fd_sqrt);
+       gnm_func_dec_usage (fd_mean);
+       gnm_func_dec_usage (fd_var);
+       gnm_func_dec_usage (fd_count);
+       gnm_func_dec_usage (fd_tinv);
+       gnm_func_dec_usage (fd_sqrt);
 }
 
 static void
@@ -1049,7 +1057,7 @@ kth_smallest_largest (data_analysis_output_t *dao,
         guint col;
        GSList *data = info->base.input;
        GnmFunc *fd = gnm_func_lookup_or_add_placeholder (func);
-       gnm_func_ref (fd);
+       gnm_func_inc_usage (fd);
 
        dao_set_italic (dao, 0, 1, 0, 1);
         dao_set_cell_printf (dao, 0, 1, label, k);
@@ -1072,7 +1080,7 @@ kth_smallest_largest (data_analysis_output_t *dao,
                dao_set_cell_expr (dao, col + 1, 1, expr);
        }
 
-       gnm_func_unref (fd);
+       gnm_func_dec_usage (fd);
 }
 
 /* Descriptive Statistics
@@ -1172,11 +1180,11 @@ analysis_tool_sampling_engine_run (data_analysis_output_t *dao,
 
        if (info->base.labels || info->periodic) {
                fd_index = gnm_func_lookup_or_add_placeholder ("INDEX");
-               gnm_func_ref (fd_index);
+               gnm_func_inc_usage (fd_index);
        }
        if (!info->periodic) {
                fd_randdiscrete = gnm_func_lookup_or_add_placeholder ("RANDDISCRETE");
-               gnm_func_ref (fd_randdiscrete);
+               gnm_func_inc_usage (fd_randdiscrete);
        }
 
        for (l = info->base.input, source = 1; l; l = l->next, source++) {
@@ -1299,9 +1307,9 @@ analysis_tool_sampling_engine_run (data_analysis_output_t *dao,
        }
 
        if (fd_index != NULL)
-               gnm_func_unref (fd_index);
+               gnm_func_dec_usage (fd_index);
        if (fd_randdiscrete != NULL)
-               gnm_func_unref (fd_randdiscrete);
+               gnm_func_dec_usage (fd_randdiscrete);
 
        dao_redraw_respan (dao);
 
@@ -1410,17 +1418,17 @@ analysis_tool_ztest_engine_run (data_analysis_output_t *dao,
                                        "/z Critical two-tail"));
 
        fd_mean = gnm_func_lookup_or_add_placeholder ("AVERAGE");
-       gnm_func_ref (fd_mean);
+       gnm_func_inc_usage (fd_mean);
        fd_normsdist = gnm_func_lookup_or_add_placeholder ("NORMSDIST");
-       gnm_func_ref (fd_normsdist);
+       gnm_func_inc_usage (fd_normsdist);
        fd_abs = gnm_func_lookup_or_add_placeholder ("ABS");
-       gnm_func_ref (fd_abs);
+       gnm_func_inc_usage (fd_abs);
        fd_sqrt = gnm_func_lookup_or_add_placeholder ("SQRT");
-       gnm_func_ref (fd_sqrt);
+       gnm_func_inc_usage (fd_sqrt);
        fd_count = gnm_func_lookup_or_add_placeholder ("COUNT");
-       gnm_func_ref (fd_count);
+       gnm_func_inc_usage (fd_count);
        fd_normsinv = gnm_func_lookup_or_add_placeholder ("NORMSINV");
-       gnm_func_ref (fd_normsinv);
+       gnm_func_inc_usage (fd_normsinv);
 
        val_1 = value_dup (info->base.range_1);
        expr_1 = gnm_expr_new_constant (value_dup (val_1));
@@ -1561,12 +1569,12 @@ analysis_tool_ztest_engine_run (data_analysis_output_t *dao,
                    GNM_EXPR_OP_DIV,
                    gnm_expr_new_constant (value_new_int (2))))));
 
-       gnm_func_unref (fd_mean);
-       gnm_func_unref (fd_normsdist);
-       gnm_func_unref (fd_abs);
-       gnm_func_unref (fd_sqrt);
-       gnm_func_unref (fd_count);
-       gnm_func_unref (fd_normsinv);
+       gnm_func_dec_usage (fd_mean);
+       gnm_func_dec_usage (fd_normsdist);
+       gnm_func_dec_usage (fd_abs);
+       gnm_func_dec_usage (fd_sqrt);
+       gnm_func_dec_usage (fd_count);
+       gnm_func_dec_usage (fd_normsinv);
 
        /* And finish up */
 
@@ -1664,27 +1672,27 @@ analysis_tool_ttest_paired_engine_run (data_analysis_output_t *dao,
                                        "/t Critical two-tail"));
 
        fd_mean = gnm_func_lookup_or_add_placeholder ("AVERAGE");
-       gnm_func_ref (fd_mean);
+       gnm_func_inc_usage (fd_mean);
        fd_var = gnm_func_lookup_or_add_placeholder ("VAR");
-       gnm_func_ref (fd_var);
+       gnm_func_inc_usage (fd_var);
        fd_count = gnm_func_lookup_or_add_placeholder ("COUNT");
-       gnm_func_ref (fd_count);
+       gnm_func_inc_usage (fd_count);
        fd_correl = gnm_func_lookup_or_add_placeholder ("CORREL");
-       gnm_func_ref (fd_correl);
+       gnm_func_inc_usage (fd_correl);
        fd_tinv = gnm_func_lookup_or_add_placeholder ("TINV");
-       gnm_func_ref (fd_tinv);
+       gnm_func_inc_usage (fd_tinv);
        fd_tdist = gnm_func_lookup_or_add_placeholder ("TDIST");
-       gnm_func_ref (fd_tdist);
+       gnm_func_inc_usage (fd_tdist);
        fd_abs = gnm_func_lookup_or_add_placeholder ("ABS");
-       gnm_func_ref (fd_abs);
+       gnm_func_inc_usage (fd_abs);
        fd_isodd = gnm_func_lookup_or_add_placeholder ("ISODD");
-       gnm_func_ref (fd_isodd);
+       gnm_func_inc_usage (fd_isodd);
        fd_isnumber = gnm_func_lookup_or_add_placeholder ("ISNUMBER");
-       gnm_func_ref (fd_isnumber);
+       gnm_func_inc_usage (fd_isnumber);
        fd_if = gnm_func_lookup_or_add_placeholder ("IF");
-       gnm_func_ref (fd_if);
+       gnm_func_inc_usage (fd_if);
        fd_sum = gnm_func_lookup_or_add_placeholder ("SUM");
-       gnm_func_ref (fd_sum);
+       gnm_func_inc_usage (fd_sum);
 
        val_1 = value_dup (info->base.range_1);
        val_2 = value_dup (info->base.range_2);
@@ -1853,17 +1861,17 @@ analysis_tool_ttest_paired_engine_run (data_analysis_output_t *dao,
        value_release (val_1);
        value_release (val_2);
 
-       gnm_func_unref (fd_count);
-       gnm_func_unref (fd_correl);
-       gnm_func_unref (fd_mean);
-       gnm_func_unref (fd_var);
-       gnm_func_unref (fd_tinv);
-       gnm_func_unref (fd_tdist);
-       gnm_func_unref (fd_abs);
-       gnm_func_unref (fd_isodd);
-       gnm_func_unref (fd_isnumber);
-       gnm_func_unref (fd_if);
-       gnm_func_unref (fd_sum);
+       gnm_func_dec_usage (fd_count);
+       gnm_func_dec_usage (fd_correl);
+       gnm_func_dec_usage (fd_mean);
+       gnm_func_dec_usage (fd_var);
+       gnm_func_dec_usage (fd_tinv);
+       gnm_func_dec_usage (fd_tdist);
+       gnm_func_dec_usage (fd_abs);
+       gnm_func_dec_usage (fd_isodd);
+       gnm_func_dec_usage (fd_isnumber);
+       gnm_func_dec_usage (fd_if);
+       gnm_func_dec_usage (fd_sum);
 
        dao_redraw_respan (dao);
 
@@ -1946,17 +1954,17 @@ analysis_tool_ttest_eqvar_engine_run (data_analysis_output_t *dao,
        val_2 = value_dup (info->base.range_2);
 
        fd_mean = gnm_func_lookup_or_add_placeholder ("AVERAGE");
-       gnm_func_ref (fd_mean);
+       gnm_func_inc_usage (fd_mean);
        fd_count = gnm_func_lookup_or_add_placeholder ("COUNT");
-       gnm_func_ref (fd_count);
+       gnm_func_inc_usage (fd_count);
        fd_var = gnm_func_lookup_or_add_placeholder ("VAR");
-       gnm_func_ref (fd_var);
+       gnm_func_inc_usage (fd_var);
        fd_tdist = gnm_func_lookup_or_add_placeholder ("TDIST");
-       gnm_func_ref (fd_tdist);
+       gnm_func_inc_usage (fd_tdist);
        fd_abs = gnm_func_lookup_or_add_placeholder ("ABS");
-       gnm_func_ref (fd_abs);
+       gnm_func_inc_usage (fd_abs);
        fd_tinv = gnm_func_lookup_or_add_placeholder ("TINV");
-       gnm_func_ref (fd_tinv);
+       gnm_func_inc_usage (fd_tinv);
 
        /* Labels */
        analysis_tools_write_label_ftest (val_1, dao, 1, 0,
@@ -2159,12 +2167,12 @@ analysis_tool_ttest_eqvar_engine_run (data_analysis_output_t *dao,
        value_release (val_1);
        value_release (val_2);
 
-       gnm_func_unref (fd_mean);
-       gnm_func_unref (fd_var);
-       gnm_func_unref (fd_count);
-       gnm_func_unref (fd_tdist);
-       gnm_func_unref (fd_abs);
-       gnm_func_unref (fd_tinv);
+       gnm_func_dec_usage (fd_mean);
+       gnm_func_dec_usage (fd_var);
+       gnm_func_dec_usage (fd_count);
+       gnm_func_dec_usage (fd_tdist);
+       gnm_func_dec_usage (fd_abs);
+       gnm_func_dec_usage (fd_tinv);
 
        dao_redraw_respan (dao);
 
@@ -2242,17 +2250,17 @@ analysis_tool_ttest_neqvar_engine_run (data_analysis_output_t *dao,
        val_2 = value_dup (info->base.range_2);
 
        fd_mean = gnm_func_lookup_or_add_placeholder ("AVERAGE");
-       gnm_func_ref (fd_mean);
+       gnm_func_inc_usage (fd_mean);
        fd_var = gnm_func_lookup_or_add_placeholder ("VAR");
-       gnm_func_ref (fd_var);
+       gnm_func_inc_usage (fd_var);
        fd_count = gnm_func_lookup_or_add_placeholder ("COUNT");
-       gnm_func_ref (fd_count);
+       gnm_func_inc_usage (fd_count);
        fd_tdist = gnm_func_lookup_or_add_placeholder ("TDIST");
-       gnm_func_ref (fd_tdist);
+       gnm_func_inc_usage (fd_tdist);
        fd_abs = gnm_func_lookup_or_add_placeholder ("ABS");
-       gnm_func_ref (fd_abs);
+       gnm_func_inc_usage (fd_abs);
        fd_tinv = gnm_func_lookup_or_add_placeholder ("TINV");
-       gnm_func_ref (fd_tinv);
+       gnm_func_inc_usage (fd_tinv);
 
        /* Labels */
        analysis_tools_write_label_ftest (val_1, dao, 1, 0,
@@ -2450,12 +2458,12 @@ analysis_tool_ttest_neqvar_engine_run (data_analysis_output_t *dao,
 
        /* And finish up */
 
-       gnm_func_unref (fd_mean);
-       gnm_func_unref (fd_var);
-       gnm_func_unref (fd_count);
-       gnm_func_unref (fd_tdist);
-       gnm_func_unref (fd_abs);
-       gnm_func_unref (fd_tinv);
+       gnm_func_dec_usage (fd_mean);
+       gnm_func_dec_usage (fd_var);
+       gnm_func_dec_usage (fd_count);
+       gnm_func_dec_usage (fd_tdist);
+       gnm_func_dec_usage (fd_abs);
+       gnm_func_dec_usage (fd_tinv);
 
        value_release (val_1);
        value_release (val_2);
@@ -2516,7 +2524,7 @@ analysis_tool_ftest_engine_run (data_analysis_output_t *dao,
        GnmFunc *fd_finv;
 
        fd_finv = gnm_func_lookup_or_add_placeholder ("FINV");
-       gnm_func_ref (fd_finv);
+       gnm_func_inc_usage (fd_finv);
 
        dao_set_italic (dao, 0, 0, 0, 11);
        dao_set_cell (dao, 0, 0, _("F-Test"));
@@ -2540,7 +2548,7 @@ analysis_tool_ftest_engine_run (data_analysis_output_t *dao,
        /* Mean */
        {
                GnmFunc *fd_mean = gnm_func_lookup_or_add_placeholder ("AVERAGE");
-               gnm_func_ref (fd_mean);
+               gnm_func_inc_usage (fd_mean);
 
                dao_set_cell_expr
                        (dao, 1, 1,
@@ -2554,13 +2562,13 @@ analysis_tool_ftest_engine_run (data_analysis_output_t *dao,
                         (fd_mean,
                          gnm_expr_new_constant (value_dup (val_2))));
 
-               gnm_func_unref (fd_mean);
+               gnm_func_dec_usage (fd_mean);
        }
 
        /* Variance */
        {
                GnmFunc *fd_var = gnm_func_lookup_or_add_placeholder ("VAR");
-               gnm_func_ref (fd_var);
+               gnm_func_inc_usage (fd_var);
 
                dao_set_cell_expr
                        (dao, 1, 2,
@@ -2573,13 +2581,13 @@ analysis_tool_ftest_engine_run (data_analysis_output_t *dao,
                         gnm_expr_new_constant (value_dup (val_2)));
                dao_set_cell_expr (dao, 2, 2, gnm_expr_copy (expr_var_denum));
 
-               gnm_func_unref (fd_var);
+               gnm_func_dec_usage (fd_var);
        }
 
         /* Count */
        {
                GnmFunc *fd_count = gnm_func_lookup_or_add_placeholder ("COUNT");
-               gnm_func_ref (fd_count);
+               gnm_func_inc_usage (fd_count);
 
                dao_set_cell_expr
                        (dao, 1, 3,
@@ -2592,7 +2600,7 @@ analysis_tool_ftest_engine_run (data_analysis_output_t *dao,
                         gnm_expr_new_constant (value_dup (val_2)));
                dao_set_cell_expr (dao, 2, 3, gnm_expr_copy (expr_count_denum));
 
-               gnm_func_unref (fd_count);
+               gnm_func_dec_usage (fd_count);
        }
 
        /* df */
@@ -2625,7 +2633,7 @@ analysis_tool_ftest_engine_run (data_analysis_output_t *dao,
                GnmFunc *fd_fdist = gnm_func_lookup_or_add_placeholder ("FDIST");
                const GnmExpr *arg3;
 
-               gnm_func_ref (fd_fdist);
+               gnm_func_inc_usage (fd_fdist);
 
                if (dao_cell_is_visible (dao, 2, 2)) {
                        arg3 = make_cellref (1, -2);
@@ -2646,7 +2654,7 @@ analysis_tool_ftest_engine_run (data_analysis_output_t *dao,
                          make_cellref (0, -2),
                          arg3));
 
-               gnm_func_unref (fd_fdist);
+               gnm_func_dec_usage (fd_fdist);
        }
 
        /* F critical right-tail */
@@ -2699,7 +2707,7 @@ analysis_tool_ftest_engine_run (data_analysis_output_t *dao,
        {
                GnmFunc *fd_min = gnm_func_lookup_or_add_placeholder ("MIN");
 
-               gnm_func_ref (fd_min);
+               gnm_func_inc_usage (fd_min);
 
                dao_set_cell_expr
                        (dao, 1, 10,
@@ -2710,7 +2718,7 @@ analysis_tool_ftest_engine_run (data_analysis_output_t *dao,
                          (fd_min,
                           make_cellref (0, -4),
                           make_cellref (0, -2))));
-               gnm_func_unref (fd_min);
+               gnm_func_dec_usage (fd_min);
        }
 
        /* F critical two-tail (left) */
@@ -2746,7 +2754,7 @@ analysis_tool_ftest_engine_run (data_analysis_output_t *dao,
        value_release (val_1);
        value_release (val_2);
 
-       gnm_func_unref (fd_finv);
+       gnm_func_dec_usage (fd_finv);
 
        dao_redraw_respan (dao);
        return FALSE;
@@ -3415,25 +3423,25 @@ analysis_tool_regression_engine_run (data_analysis_output_t *dao,
                value_release (val_2);
        }
 
-       gnm_func_unref (fd_linest);
-       gnm_func_unref (fd_index);
-       gnm_func_unref (fd_fdist);
-       gnm_func_unref (fd_sum);
-       gnm_func_unref (fd_sqrt);
-       gnm_func_unref (fd_tdist);
-       gnm_func_unref (fd_abs);
-       gnm_func_unref (fd_tinv);
-       gnm_func_unref (fd_transpose);
+       gnm_func_dec_usage (fd_linest);
+       gnm_func_dec_usage (fd_index);
+       gnm_func_dec_usage (fd_fdist);
+       gnm_func_dec_usage (fd_sum);
+       gnm_func_dec_usage (fd_sqrt);
+       gnm_func_dec_usage (fd_tdist);
+       gnm_func_dec_usage (fd_abs);
+       gnm_func_dec_usage (fd_tinv);
+       gnm_func_dec_usage (fd_transpose);
        if (fd_concatenate != NULL)
-               gnm_func_unref (fd_concatenate);
+               gnm_func_dec_usage (fd_concatenate);
        if (fd_cell != NULL)
-               gnm_func_unref (fd_cell);
+               gnm_func_dec_usage (fd_cell);
        if (fd_offset != NULL)
-               gnm_func_unref (fd_offset);
+               gnm_func_dec_usage (fd_offset);
        if (fd_sumproduct != NULL)
-               gnm_func_unref (fd_sumproduct);
+               gnm_func_dec_usage (fd_sumproduct);
        if (fd_leverage != NULL)
-               gnm_func_unref (fd_leverage);
+               gnm_func_dec_usage (fd_leverage);
 
        dao_redraw_respan (dao);
 
@@ -3541,11 +3549,11 @@ analysis_tool_regression_simple_engine_run (data_analysis_output_t *dao,
        gnm_expr_free (expr_observ);
        gnm_expr_free (expr_val_dep);
 
-       gnm_func_unref (fd_fdist);
-       gnm_func_unref (fd_linest);
-       gnm_func_unref (fd_index);
-       gnm_func_unref (fd_rows);
-       gnm_func_unref (fd_columns);
+       gnm_func_dec_usage (fd_fdist);
+       gnm_func_dec_usage (fd_linest);
+       gnm_func_dec_usage (fd_index);
+       gnm_func_dec_usage (fd_rows);
+       gnm_func_dec_usage (fd_columns);
 
        dao_redraw_respan (dao);
 
@@ -3676,22 +3684,22 @@ analysis_tool_moving_average_engine_run (data_analysis_output_t *dao,
        if (info->base.labels || info->ma_type == moving_average_type_wma
            || info->ma_type== moving_average_type_spencer_ma) {
                fd_index = gnm_func_lookup_or_add_placeholder ("INDEX");
-               gnm_func_ref (fd_index);
+               gnm_func_inc_usage (fd_index);
        }
        if (info->std_error_flag) {
                fd_sqrt = gnm_func_lookup_or_add_placeholder ("SQRT");
-               gnm_func_ref (fd_sqrt);
+               gnm_func_inc_usage (fd_sqrt);
                fd_sumxmy2 = gnm_func_lookup_or_add_placeholder ("SUMXMY2");
-               gnm_func_ref (fd_sumxmy2);
+               gnm_func_inc_usage (fd_sumxmy2);
        }
        if (moving_average_type_wma == info->ma_type || moving_average_type_spencer_ma == info->ma_type) {
                fd_sum = gnm_func_lookup_or_add_placeholder ("SUM");
-               gnm_func_ref (fd_sum);
+               gnm_func_inc_usage (fd_sum);
        }
        fd_average = gnm_func_lookup_or_add_placeholder ("AVERAGE");
-       gnm_func_ref (fd_average);
+       gnm_func_inc_usage (fd_average);
        fd_offset = gnm_func_lookup_or_add_placeholder ("OFFSET");
-       gnm_func_ref (fd_offset);
+       gnm_func_inc_usage (fd_offset);
 
        if (info->show_graph) {
                GogGraph     *graph;
@@ -3954,15 +3962,15 @@ analysis_tool_moving_average_engine_run (data_analysis_output_t *dao,
                dao_set_sheet_object (dao, 0, 1, so);
 
        if (fd_index != NULL)
-               gnm_func_unref (fd_index);
+               gnm_func_dec_usage (fd_index);
        if (fd_sqrt != NULL)
-               gnm_func_unref (fd_sqrt);
+               gnm_func_dec_usage (fd_sqrt);
        if (fd_sumxmy2 != NULL)
-               gnm_func_unref (fd_sumxmy2);
+               gnm_func_dec_usage (fd_sumxmy2);
        if (fd_sum != NULL)
-               gnm_func_unref (fd_sum);
-       gnm_func_unref (fd_average);
-       gnm_func_unref (fd_offset);
+               gnm_func_dec_usage (fd_sum);
+       gnm_func_dec_usage (fd_average);
+       gnm_func_dec_usage (fd_offset);
 
        dao_redraw_respan (dao);
 
@@ -4024,15 +4032,15 @@ analysis_tool_ranking_engine_run (data_analysis_output_t *dao,
        GnmFunc *fd_percentrank;
 
        fd_large = gnm_func_lookup_or_add_placeholder ("LARGE");
-       gnm_func_ref (fd_large);
+       gnm_func_inc_usage (fd_large);
        fd_row = gnm_func_lookup_or_add_placeholder ("ROW");
-       gnm_func_ref (fd_row);
+       gnm_func_inc_usage (fd_row);
        fd_rank = gnm_func_lookup_or_add_placeholder ("RANK");
-       gnm_func_ref (fd_rank);
+       gnm_func_inc_usage (fd_rank);
        fd_match = gnm_func_lookup_or_add_placeholder ("MATCH");
-       gnm_func_ref (fd_match);
+       gnm_func_inc_usage (fd_match);
        fd_percentrank = gnm_func_lookup_or_add_placeholder ("PERCENTRANK");
-       gnm_func_ref (fd_percentrank);
+       gnm_func_inc_usage (fd_percentrank);
 
        dao_set_merge (dao, 0, 0, 1, 0);
        dao_set_italic (dao, 0, 0, 0, 0);
@@ -4082,7 +4090,7 @@ analysis_tool_ranking_engine_run (data_analysis_output_t *dao,
                        GnmExpr const *expr_rows;
                        GnmFunc *fd_count;
                        fd_count = gnm_func_lookup_or_add_placeholder ("COUNT");
-                       gnm_func_ref (fd_count);
+                       gnm_func_inc_usage (fd_count);
 
                        expr_rows = gnm_expr_new_funcall1
                                (fd_count, gnm_expr_new_constant (value_dup (val_org)));
@@ -4102,7 +4110,7 @@ analysis_tool_ranking_engine_run (data_analysis_output_t *dao,
                                 GNM_EXPR_OP_DIV,
                                 gnm_expr_new_constant (value_new_int (2)));
 
-                       gnm_func_unref (fd_count);
+                       gnm_func_dec_usage (fd_count);
                }
                expr_percentile = gnm_expr_new_funcall3 (fd_percentrank,
                                                         gnm_expr_new_constant (value_dup (val_org)),
@@ -4122,11 +4130,11 @@ analysis_tool_ranking_engine_run (data_analysis_output_t *dao,
                gnm_expr_free (expr_percentile);
        }
 
-       gnm_func_unref (fd_large);
-       gnm_func_unref (fd_row);
-       gnm_func_unref (fd_rank);
-       gnm_func_unref (fd_match);
-       gnm_func_unref (fd_percentrank);
+       gnm_func_dec_usage (fd_large);
+       gnm_func_dec_usage (fd_row);
+       gnm_func_dec_usage (fd_rank);
+       gnm_func_dec_usage (fd_match);
+       gnm_func_dec_usage (fd_percentrank);
 
        dao_redraw_respan (dao);
 
@@ -4199,15 +4207,15 @@ analysis_tool_anova_single_engine_run (data_analysis_output_t *dao, gpointer spe
                                        "/Variance"));
 
        fd_mean = gnm_func_lookup_or_add_placeholder ("AVERAGE");
-       gnm_func_ref (fd_mean);
+       gnm_func_inc_usage (fd_mean);
        fd_var = gnm_func_lookup_or_add_placeholder ("VAR");
-       gnm_func_ref (fd_var);
+       gnm_func_inc_usage (fd_var);
        fd_sum = gnm_func_lookup_or_add_placeholder ("SUM");
-       gnm_func_ref (fd_sum);
+       gnm_func_inc_usage (fd_sum);
        fd_count = gnm_func_lookup_or_add_placeholder ("COUNT");
-       gnm_func_ref (fd_count);
+       gnm_func_inc_usage (fd_count);
        fd_devsq = gnm_func_lookup_or_add_placeholder ("DEVSQ");
-       gnm_func_ref (fd_devsq);
+       gnm_func_inc_usage (fd_devsq);
 
        dao->offset_row += 4;
        if (dao->rows <= dao->offset_row)
@@ -4417,7 +4425,7 @@ analysis_tool_anova_single_engine_run (data_analysis_output_t *dao, gpointer spe
                        }
 
                        fd_fdist = gnm_func_lookup_or_add_placeholder ("FDIST");
-                       gnm_func_ref (fd_fdist);
+                       gnm_func_inc_usage (fd_fdist);
 
                        dao_set_cell_expr
                                (dao, 5, 2,
@@ -4425,7 +4433,7 @@ analysis_tool_anova_single_engine_run (data_analysis_output_t *dao, gpointer spe
                                 (fd_fdist,
                                  arg1, arg2, arg3));
                        if (fd_fdist)
-                               gnm_func_unref (fd_fdist);
+                               gnm_func_dec_usage (fd_fdist);
                }
                {
                        /* Critical F*/
@@ -4439,7 +4447,7 @@ analysis_tool_anova_single_engine_run (data_analysis_output_t *dao, gpointer spe
                                arg3 = expr_wdof;
 
                        fd_finv = gnm_func_lookup_or_add_placeholder ("FINV");
-                       gnm_func_ref (fd_finv);
+                       gnm_func_inc_usage (fd_finv);
 
                        dao_set_cell_expr
                                (dao, 6, 2,
@@ -4449,17 +4457,17 @@ analysis_tool_anova_single_engine_run (data_analysis_output_t *dao, gpointer spe
                                  (value_new_float (info->alpha)),
                                  make_cellref (-4, 0),
                                  arg3));
-                       gnm_func_unref (fd_finv);
+                       gnm_func_dec_usage (fd_finv);
                }
        }
 
 finish_anova_single_factor_tool:
 
-       gnm_func_unref (fd_mean);
-       gnm_func_unref (fd_var);
-       gnm_func_unref (fd_sum);
-       gnm_func_unref (fd_count);
-       gnm_func_unref (fd_devsq);
+       gnm_func_dec_usage (fd_mean);
+       gnm_func_dec_usage (fd_var);
+       gnm_func_dec_usage (fd_sum);
+       gnm_func_dec_usage (fd_count);
+       gnm_func_dec_usage (fd_devsq);
 
        dao->offset_row = 0;
        dao->offset_col = 0;
@@ -4520,7 +4528,7 @@ analysis_tool_fourier_engine_run (data_analysis_output_t *dao,
        GnmFunc *fd_fourier;
 
        fd_fourier = gnm_func_lookup_or_add_placeholder ("FOURIER");
-       gnm_func_ref (fd_fourier);
+       gnm_func_inc_usage (fd_fourier);
 
        dao_set_merge (dao, 0, 0, 1, 0);
        dao_set_italic (dao, 0, 0, 0, 0);
@@ -4555,7 +4563,7 @@ analysis_tool_fourier_engine_run (data_analysis_output_t *dao,
                dao->offset_col += 2;
        }
 
-       gnm_func_unref (fd_fourier);
+       gnm_func_dec_usage (fd_fourier);
 
        dao_redraw_respan (dao);
 
diff --git a/src/tools/analysis-wilcoxon-mann-whitney.c b/src/tools/analysis-wilcoxon-mann-whitney.c
index f893f78ce..1e615db41 100644
--- a/src/tools/analysis-wilcoxon-mann-whitney.c
+++ b/src/tools/analysis-wilcoxon-mann-whitney.c
@@ -73,13 +73,13 @@ GnmExpr const *analysis_tool_combine_area (GnmValue *val_1, GnmValue *val_2, Wor
        }
 
        fd_array = gnm_func_lookup_or_add_placeholder ("ARRAY");
-       gnm_func_ref (fd_array);
+       gnm_func_inc_usage (fd_array);
 
        expr = gnm_expr_new_funcall2 (fd_array,
                                      gnm_expr_new_constant (value_dup (val_1)),
                                      gnm_expr_new_constant (value_dup (val_2)));
 
-       gnm_func_unref (fd_array);
+       gnm_func_dec_usage (fd_array);
 
        return expr;
 }
@@ -110,25 +110,25 @@ analysis_tool_wilcoxon_mann_whitney_engine_run (data_analysis_output_t *dao,
        Workbook *wb = dao->sheet ? dao->sheet->workbook : NULL;
 
        fd_count = gnm_func_lookup_or_add_placeholder ("COUNT");
-       gnm_func_ref (fd_count);
+       gnm_func_inc_usage (fd_count);
        fd_sum = gnm_func_lookup_or_add_placeholder ("SUM");
-       gnm_func_ref (fd_sum);
+       gnm_func_inc_usage (fd_sum);
        fd_rows = gnm_func_lookup_or_add_placeholder ("ROWS");
-       gnm_func_ref (fd_rows);
+       gnm_func_inc_usage (fd_rows);
        fd_rank_avg = gnm_func_lookup_or_add_placeholder ("RANK.AVG");
-       gnm_func_ref (fd_rank_avg);
+       gnm_func_inc_usage (fd_rank_avg);
        fd_rank = gnm_func_lookup_or_add_placeholder ("RANK");
-       gnm_func_ref (fd_rank);
+       gnm_func_inc_usage (fd_rank);
        fd_min = gnm_func_lookup_or_add_placeholder ("MIN");
-       gnm_func_ref (fd_min);
+       gnm_func_inc_usage (fd_min);
        fd_normdist = gnm_func_lookup_or_add_placeholder ("NORMDIST");
-       gnm_func_ref (fd_normdist);
+       gnm_func_inc_usage (fd_normdist);
        fd_sqrt = gnm_func_lookup_or_add_placeholder ("SQRT");
-       gnm_func_ref (fd_sqrt);
+       gnm_func_inc_usage (fd_sqrt);
        fd_if = gnm_func_lookup_or_add_placeholder ("IF");
-       gnm_func_ref (fd_if);
+       gnm_func_inc_usage (fd_if);
        fd_isblank = gnm_func_lookup_or_add_placeholder ("ISBLANK");
-       gnm_func_ref (fd_isblank);
+       gnm_func_inc_usage (fd_isblank);
 
        dao_set_italic (dao, 0, 0, 0, 8);
        dao_set_italic (dao, 0, 1, 3, 1);
@@ -323,16 +323,16 @@ analysis_tool_wilcoxon_mann_whitney_engine_run (data_analysis_output_t *dao,
 
        gnm_expr_free (expr_total);
 
-       gnm_func_unref (fd_count);
-       gnm_func_unref (fd_sum);
-       gnm_func_unref (fd_rows);
-       gnm_func_unref (fd_rank_avg);
-       gnm_func_unref (fd_rank);
-       gnm_func_unref (fd_min);
-       gnm_func_unref (fd_normdist);
-       gnm_func_unref (fd_sqrt);
-       gnm_func_unref (fd_if);
-       gnm_func_unref (fd_isblank);
+       gnm_func_dec_usage (fd_count);
+       gnm_func_dec_usage (fd_sum);
+       gnm_func_dec_usage (fd_rows);
+       gnm_func_dec_usage (fd_rank_avg);
+       gnm_func_dec_usage (fd_rank);
+       gnm_func_dec_usage (fd_min);
+       gnm_func_dec_usage (fd_normdist);
+       gnm_func_dec_usage (fd_sqrt);
+       gnm_func_dec_usage (fd_if);
+       gnm_func_dec_usage (fd_isblank);
 
        dao_redraw_respan (dao);
        return 0;
diff --git a/src/tools/random-generator-cor.c b/src/tools/random-generator-cor.c
index b621fb418..6297b55b0 100644
--- a/src/tools/random-generator-cor.c
+++ b/src/tools/random-generator-cor.c
@@ -52,7 +52,7 @@ tool_random_cor_engine_run (data_analysis_output_t *dao,
                GnmExpr const *expr_cholesky;
 
                fd_cholesky = gnm_func_lookup_or_add_placeholder ("CHOLESKY");
-               gnm_func_ref (fd_cholesky);
+               gnm_func_inc_usage (fd_cholesky);
                expr_cholesky = gnm_expr_new_funcall1
                        (fd_cholesky, expr_matrix);
 
@@ -62,7 +62,7 @@ tool_random_cor_engine_run (data_analysis_output_t *dao,
                dao_set_array_expr (dao, 0, 1, info->variables, info->variables,
                                    expr_cholesky);
 
-               gnm_func_unref (fd_cholesky);
+               gnm_func_dec_usage (fd_cholesky);
 
                expr_matrix = dao_get_rangeref (dao, 0, 1, info->variables - 1, info->variables);
                dao->offset_row += info->variables + 2;
@@ -73,7 +73,7 @@ tool_random_cor_engine_run (data_analysis_output_t *dao,
        dao_set_cell (dao, 0, 0, _("Uncorrelated Random Variables"));
 
        fd_rand = gnm_func_lookup_or_add_placeholder ("RANDNORM");
-       gnm_func_ref (fd_rand);
+       gnm_func_inc_usage (fd_rand);
        expr_rand = gnm_expr_new_funcall2 (fd_rand,
                                           gnm_expr_new_constant (value_new_int (0)),
                                           gnm_expr_new_constant (value_new_int (1)));
@@ -81,14 +81,14 @@ tool_random_cor_engine_run (data_analysis_output_t *dao,
                for (j = 1; j <= info->count; j++)
                        dao_set_cell_expr (dao, i, j, gnm_expr_copy (expr_rand));
        gnm_expr_free (expr_rand);
-       gnm_func_unref (fd_rand);
+       gnm_func_dec_usage (fd_rand);
 
        dao->offset_col += info->variables + 1;
 
        fd_mmult = gnm_func_lookup_or_add_placeholder ("MMULT");
-       gnm_func_ref (fd_mmult);
+       gnm_func_inc_usage (fd_mmult);
        fd_transpose = gnm_func_lookup_or_add_placeholder ("TRANSPOSE");
-       gnm_func_ref (fd_transpose);
+       gnm_func_inc_usage (fd_transpose);
 
        dao_set_merge (dao, 0, 0, info->variables - 1, 0);
        dao_set_italic (dao, 0, 0, 0, 0);
@@ -106,8 +106,8 @@ tool_random_cor_engine_run (data_analysis_output_t *dao,
 
        gnm_expr_free (expr_rand);
 
-       gnm_func_unref (fd_mmult);
-       gnm_func_unref (fd_transpose);
+       gnm_func_dec_usage (fd_mmult);
+       gnm_func_dec_usage (fd_transpose);
        dao_redraw_respan (dao);
 
        return FALSE;
diff --git a/src/wbc-gtk.c b/src/wbc-gtk.c
index 528851166..14bbaa7cd 100644
--- a/src/wbc-gtk.c
+++ b/src/wbc-gtk.c
@@ -4012,7 +4012,7 @@ cb_auto_expr_insert_formula (WBCGtk *wbcg, gboolean below)
                      "auto-expr-func", &(specs->func), NULL);
        if (specs->func == NULL) {
                specs->func =  gnm_func_lookup_or_add_placeholder ("sum");
-               gnm_func_ref (specs->func);
+               gnm_func_inc_usage (specs->func);
        }
 
        cmd_analysis_tool (GNM_WBC (wbcg), scg_sheet (scg),
diff --git a/src/widgets/gnm-expr-entry.c b/src/widgets/gnm-expr-entry.c
index fb0882a4e..5a3cf927f 100644
--- a/src/widgets/gnm-expr-entry.c
+++ b/src/widgets/gnm-expr-entry.c
@@ -722,7 +722,7 @@ gee_delete_tooltip (GnmExprEntry *gee, gboolean remove_completion)
                gee->tooltip.tooltip = NULL;
        }
        if (gee->tooltip.fd) {
-               gnm_func_unref (gee->tooltip.fd);
+               gnm_func_dec_usage (gee->tooltip.fd);
                gee->tooltip.fd = NULL;
        }
        if (gee->tooltip.handlerid != 0 && gee->entry != NULL) {
@@ -863,7 +863,7 @@ gee_set_tooltip (GnmExprEntry *gee, GnmFunc *fd, gint args, gboolean had_stuff)
        gee_delete_tooltip (gee, FALSE);
 
        gee->tooltip.fd = fd;
-       gnm_func_ref (gee->tooltip.fd);
+       gnm_func_inc_usage (gee->tooltip.fd);
 
        fdname = gnm_func_get_name (fd, localized_function_names);
 
@@ -987,7 +987,7 @@ gee_set_tooltip_completion (GnmExprEntry *gee, GSList *list, guint start, guint
        }
        g_string_free (str, TRUE);
        g_string_free (str_marked, TRUE);
-       g_slist_free_full (list, (GDestroyNotify) gnm_func_unref);
+       g_slist_free_full (list, (GDestroyNotify) gnm_func_dec_usage);
        return show_tool_tip;
 }
 
diff --git a/src/workbook-view.c b/src/workbook-view.c
index b83020181..57e6ed5fe 100644
--- a/src/workbook-view.c
+++ b/src/workbook-view.c
@@ -614,10 +614,10 @@ wb_view_auto_expr_func (WorkbookView *wbv, GnmFunc *func)
                return;
 
        if (wbv->auto_expr.func)
-               gnm_func_unref (wbv->auto_expr.func);
+               gnm_func_dec_usage (wbv->auto_expr.func);
 
        if (func)
-               gnm_func_ref (func);
+               gnm_func_inc_usage (func);
        wbv->auto_expr.func = func;
 
        wb_view_auto_expr_recalc (wbv);
@@ -905,16 +905,15 @@ workbook_view_class_init (GObjectClass *gobject_class)
        gobject_class->get_property = wb_view_get_property;
        gobject_class->dispose = wb_view_dispose;
 
-       /* FIXME?  Make a boxed type.  */
         g_object_class_install_property
                (gobject_class,
                 PROP_AUTO_EXPR_FUNC,
-                g_param_spec_boxed ("auto-expr-func",
-                                    P_("Auto-expression function"),
-                                    P_("The automatically computed sheet function."),
-                                    gnm_func_get_type (),
-                                    GSF_PARAM_STATIC |
-                                    G_PARAM_READWRITE));
+                g_param_spec_object ("auto-expr-func",
+                                     P_("Auto-expression function"),
+                                     P_("The automatically computed sheet function."),
+                                     GNM_FUNC_TYPE,
+                                     GSF_PARAM_STATIC |
+                                     G_PARAM_READWRITE));
         g_object_class_install_property
                (gobject_class,
                 PROP_AUTO_EXPR_DESCR,


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]