diff --git a/Makefile.am b/Makefile.am
index 572a994..1697e2b 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -13,8 +13,8 @@
 phosphor_inventory_CFLAGS = $(SDBUSPLUS_CFLAGS)
 
 libmanagercommon_la_SOURCES = \
-	events.cpp \
 	errors.cpp \
+	functor.cpp \
 	manager.cpp
 libmanagercommon_la_LIBADD = $(SDBUSPLUS_LIBS) $(PHOSPHOR_DBUS_INTERFACES_LIBS)
 libmanagercommon_la_CFLAGS = $(SDBUSPLUS_CFLAGS) $(PHOSPHOR_DBUS_INTERACES_CFLAGS)
diff --git a/actions.hpp b/actions.hpp
deleted file mode 100644
index 31932b2..0000000
--- a/actions.hpp
+++ /dev/null
@@ -1,101 +0,0 @@
-#pragma once
-
-#include <utility>
-#include <memory>
-#include <functional>
-#include "utils.hpp"
-#include "types.hpp"
-
-namespace phosphor
-{
-namespace inventory
-{
-namespace manager
-{
-
-class Manager;
-
-using Action = std::function<void (sdbusplus::bus::bus&, Manager&)>;
-
-/** @brief make_action
- *
- *  Adapt an action function object.
- *
- *  @param[in] action - The action being adapted.
- *  @returns - The adapted action.
- *
- *  @tparam T - The type of the action being adapted.
- */
-template <typename T>
-auto make_action(T&& action)
-{
-    return Action(std::forward<T>(action));
-}
-
-namespace actions
-{
-
-/** @brief Destroy objects action.  */
-inline auto destroyObjects(std::vector<const char*>&& paths)
-{
-    return [ = ](auto&, auto & m)
-    {
-        m.destroyObjects(paths);
-    };
-}
-
-/** @brief Create objects action.  */
-inline auto createObjects(
-    std::map<sdbusplus::message::object_path, Object>&& objs)
-{
-    return [ = ](auto&, auto & m)
-    {
-        m.createObjects(objs);
-    };
-}
-
-/** @brief Set a property action.
- *
- *  Invoke the requested method with a reference to the requested
- *  sdbusplus server binding interface as a parameter.
- *
- *  @tparam T - The sdbusplus server binding interface type.
- *  @tparam U - The type of the sdbusplus server binding member
- *      function that sets the property.
- *  @tparam V - The property value type.
- *
- *  @param[in] paths - The DBus paths on which the property should
- *      be set.
- *  @param[in] iface - The DBus interface hosting the property.
- *  @param[in] member - Pointer to sdbusplus server binding member.
- *  @param[in] value - The value the property should be set to.
- *
- *  @returns - A function object that sets the requested property
- *      to the requested value.
- */
-template <typename T, typename U, typename V>
-auto setProperty(
-    std::vector<const char*>&& paths, const char* iface,
-    U&& member, V&& value)
-{
-    // The manager is the only parameter passed to actions.
-    // Bind the path, interface, interface member function pointer,
-    // and value to a lambda.  When it is called, forward the
-    // path, interface and value on to the manager member function.
-    return [paths, iface, member,
-                  value = std::forward<V>(value)](auto&, auto & m)
-    {
-        for (auto p : paths)
-        {
-            m.template invokeMethod<T>(
-                p, iface, member, value);
-        }
-    };
-}
-
-} // namespace actions
-} // namespace manager
-} // namespace inventory
-} // namespace phosphor
-
-// vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4
diff --git a/events.hpp b/events.hpp
index ef9d085..38c24e4 100644
--- a/events.hpp
+++ b/events.hpp
@@ -1,10 +1,6 @@
 #pragma once
 
-#include <utility>
-#include <memory>
-#include <functional>
-#include <sdbusplus/message.hpp>
-#include "utils.hpp"
+#include "types.hpp"
 
 namespace phosphor
 {
@@ -14,8 +10,6 @@
 {
 
 class Manager;
-using Filter = std::function <
-               bool (sdbusplus::bus::bus&, sdbusplus::message::message&, Manager&) >;
 
 /** @struct Event
  *  @brief Event object interface.
@@ -82,236 +76,6 @@
     const char* signature;
 };
 
-/** @brief make_filter
- *
- *  Adapt a filter function object.
- *
- *  @param[in] filter - The filter being adapted.
- *  @returns - The adapted filter.
- *
- *  @tparam T - The type of the filter being adapted.
- */
-template <typename T>
-auto make_filter(T&& filter)
-{
-    return Filter(std::forward<T>(filter));
-}
-
-namespace filters
-{
-namespace property_condition
-{
-
-/** @struct PropertyChangedCondition
- *  @brief Match filter functor that tests a property value.
- *
- *  @tparam T - The type of the property being tested.
- *  @tparam U - The type of the condition checking functor.
- */
-template <typename T, typename U>
-struct PropertyChangedCondition
-{
-        PropertyChangedCondition() = delete;
-        ~PropertyChangedCondition() = default;
-        PropertyChangedCondition(const PropertyChangedCondition&) = default;
-        PropertyChangedCondition& operator=(const PropertyChangedCondition&) = default;
-        PropertyChangedCondition(PropertyChangedCondition&&) = default;
-        PropertyChangedCondition& operator=(PropertyChangedCondition&&) = default;
-        PropertyChangedCondition(const char* iface, const char* property,
-                                 U&& condition) :
-            _iface(iface),
-            _property(property),
-            _condition(std::forward<U>(condition)) { }
-
-        /** @brief Test a property value.
-         *
-         * Extract the property from the PropertiesChanged
-         * message and run the condition test.
-         */
-        bool operator()(
-            sdbusplus::bus::bus&,
-            sdbusplus::message::message& msg,
-            Manager&) const
-        {
-            std::map <
-            std::string,
-                sdbusplus::message::variant<T >> properties;
-            const char* iface = nullptr;
-
-            msg.read(iface);
-            if (!iface || strcmp(iface, _iface))
-            {
-                return false;
-            }
-
-            msg.read(properties);
-            auto it = properties.find(_property);
-            if (it == properties.cend())
-            {
-                return false;
-            }
-
-            return _condition(
-                       std::forward<T>(it->second.template get<T>()));
-        }
-
-    private:
-        const char* _iface;
-        const char* _property;
-        U _condition;
-};
-
-/** @struct PropertyConditionBase
- *  @brief Match filter functor that tests a property value.
- *
- *  Base class for PropertyCondition - factored out code that
- *  doesn't need to be templated.
- */
-struct PropertyConditionBase
-{
-        PropertyConditionBase() = delete;
-        virtual ~PropertyConditionBase() = default;
-        PropertyConditionBase(const PropertyConditionBase&) = default;
-        PropertyConditionBase& operator=(const PropertyConditionBase&) = default;
-        PropertyConditionBase(PropertyConditionBase&&) = default;
-        PropertyConditionBase& operator=(PropertyConditionBase&&) = default;
-
-        /** @brief Constructor
-         *
-         *  The service argument can be nullptr.  If something
-         *  else is provided the function will call the the
-         *  service directly.  If omitted, the function will
-         *  look up the service in the ObjectMapper.
-         *
-         *  @param path - The path of the object containing
-         *     the property to be tested.
-         *  @param iface - The interface hosting the property
-         *     to be tested.
-         *  @param property - The property to be tested.
-         *  @param service - The DBus service hosting the object.
-         */
-        PropertyConditionBase(
-            const char* path,
-            const char* iface,
-            const char* property,
-            const char* service) :
-            _path(path),
-            _iface(iface),
-            _property(property),
-            _service(service) {}
-
-        /** @brief Forward comparison to type specific implementation. */
-        virtual bool eval(sdbusplus::message::message&) const = 0;
-
-        /** @brief Test a property value.
-         *
-         * Make a DBus call and test the value of any property.
-         */
-        bool operator()(
-            sdbusplus::bus::bus&,
-            sdbusplus::message::message&,
-            Manager&) const;
-
-    private:
-        std::string _path;
-        std::string _iface;
-        std::string _property;
-        const char* _service;
-};
-
-/** @struct PropertyCondition
- *  @brief Match filter functor that tests a property value.
- *
- *  @tparam T - The type of the property being tested.
- *  @tparam U - The type of the condition checking functor.
- */
-template <typename T, typename U>
-struct PropertyCondition final : public PropertyConditionBase
-{
-        PropertyCondition() = delete;
-        ~PropertyCondition() = default;
-        PropertyCondition(const PropertyCondition&) = default;
-        PropertyCondition& operator=(const PropertyCondition&) = default;
-        PropertyCondition(PropertyCondition&&) = default;
-        PropertyCondition& operator=(PropertyCondition&&) = default;
-
-        /** @brief Constructor
-         *
-         *  The service argument can be nullptr.  If something
-         *  else is provided the function will call the the
-         *  service directly.  If omitted, the function will
-         *  look up the service in the ObjectMapper.
-         *
-         *  @param path - The path of the object containing
-         *     the property to be tested.
-         *  @param iface - The interface hosting the property
-         *     to be tested.
-         *  @param property - The property to be tested.
-         *  @param condition - The test to run on the property.
-         *  @param service - The DBus service hosting the object.
-         */
-        PropertyCondition(
-            const char* path,
-            const char* iface,
-            const char* property,
-            U&& condition,
-            const char* service) :
-            PropertyConditionBase(path, iface, property, service),
-            _condition(std::forward<decltype(condition)>(condition)) {}
-
-        /** @brief Test a property value.
-         *
-         * Make a DBus call and test the value of any property.
-         */
-        bool eval(sdbusplus::message::message& msg) const override
-        {
-            sdbusplus::message::variant<T> value;
-            msg.read(value);
-            return _condition(
-                       std::forward<T>(value.template get<T>()));
-        }
-
-    private:
-        U _condition;
-};
-
-} // namespace property_condition
-
-/** @brief Implicit type deduction for constructing PropertyChangedCondition.  */
-template <typename T>
-auto propertyChangedTo(
-    const char* iface,
-    const char* property,
-    T&& val)
-{
-    auto condition = [val = std::forward<T>(val)](T && arg)
-    {
-        return arg == val;
-    };
-    using U = decltype(condition);
-    return property_condition::PropertyChangedCondition<T, U>(
-               iface, property, std::move(condition));
-}
-
-/** @brief Implicit type deduction for constructing PropertyCondition.  */
-template <typename T>
-auto propertyIs(
-    const char* path,
-    const char* iface,
-    const char* property,
-    T&& val,
-    const char* service = nullptr)
-{
-    auto condition = [val = std::forward<T>(val)](T && arg)
-    {
-        return arg == val;
-    };
-    using U = decltype(condition);
-    return property_condition::PropertyCondition<T, U>(
-               path, iface, property, std::move(condition), service);
-}
-
-} // namespace filters
 } // namespace manager
 } // namespace inventory
 } // namespace phosphor
diff --git a/events.cpp b/functor.cpp
similarity index 94%
rename from events.cpp
rename to functor.cpp
index 6f5bb59..a657257 100644
--- a/events.cpp
+++ b/functor.cpp
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-#include "events.hpp"
+#include "functor.hpp"
 #include <sdbusplus/bus.hpp>
 
 namespace phosphor
@@ -22,9 +22,7 @@
 {
 namespace manager
 {
-namespace filters
-{
-namespace property_condition
+namespace functor
 {
 
 bool PropertyConditionBase::operator()(
@@ -87,8 +85,7 @@
     return eval(hostResponseMsg);
 }
 
-} // namespace property_condition
-} // namespace filters
+} // namespace functor
 } // namespace manager
 } // namespace inventory
 } // namespace phosphor
diff --git a/functor.hpp b/functor.hpp
new file mode 100644
index 0000000..265e467
--- /dev/null
+++ b/functor.hpp
@@ -0,0 +1,320 @@
+#pragma once
+
+#include <utility>
+#include <memory>
+#include <sdbusplus/bus.hpp>
+#include "utils.hpp"
+#include "types.hpp"
+
+namespace phosphor
+{
+namespace inventory
+{
+namespace manager
+{
+
+class Manager;
+
+/** @brief make_action
+ *
+ *  Adapt an action function object.
+ *
+ *  @param[in] action - The action being adapted.
+ *  @returns - The adapted action.
+ *
+ *  @tparam T - The type of the action being adapted.
+ */
+template <typename T>
+auto make_action(T&& action)
+{
+    return Action(std::forward<T>(action));
+}
+
+/** @brief make_filter
+ *
+ *  Adapt a filter function object.
+ *
+ *  @param[in] filter - The filter being adapted.
+ *  @returns - The adapted filter.
+ *
+ *  @tparam T - The type of the filter being adapted.
+ */
+template <typename T>
+auto make_filter(T&& filter)
+{
+    return Filter(std::forward<T>(filter));
+}
+
+namespace functor
+{
+
+/** @brief Destroy objects action.  */
+inline auto destroyObjects(std::vector<const char*>&& paths)
+{
+    return [ = ](auto&, auto & m)
+    {
+        m.destroyObjects(paths);
+    };
+}
+
+/** @brief Create objects action.  */
+inline auto createObjects(
+    std::map<sdbusplus::message::object_path, Object>&& objs)
+{
+    return [ = ](auto&, auto & m)
+    {
+        m.createObjects(objs);
+    };
+}
+
+/** @brief Set a property action.
+ *
+ *  Invoke the requested method with a reference to the requested
+ *  sdbusplus server binding interface as a parameter.
+ *
+ *  @tparam T - The sdbusplus server binding interface type.
+ *  @tparam U - The type of the sdbusplus server binding member
+ *      function that sets the property.
+ *  @tparam V - The property value type.
+ *
+ *  @param[in] paths - The DBus paths on which the property should
+ *      be set.
+ *  @param[in] iface - The DBus interface hosting the property.
+ *  @param[in] member - Pointer to sdbusplus server binding member.
+ *  @param[in] value - The value the property should be set to.
+ *
+ *  @returns - A function object that sets the requested property
+ *      to the requested value.
+ */
+template <typename T, typename U, typename V>
+auto setProperty(
+    std::vector<const char*>&& paths, const char* iface,
+    U&& member, V&& value)
+{
+    // The manager is the only parameter passed to actions.
+    // Bind the path, interface, interface member function pointer,
+    // and value to a lambda.  When it is called, forward the
+    // path, interface and value on to the manager member function.
+    return [paths, iface, member,
+                  value = std::forward<V>(value)](auto&, auto & m)
+    {
+        for (auto p : paths)
+        {
+            m.template invokeMethod<T>(
+                p, iface, member, value);
+        }
+    };
+}
+
+/** @struct PropertyChangedCondition
+ *  @brief Match filter functor that tests a property value.
+ *
+ *  @tparam T - The type of the property being tested.
+ *  @tparam U - The type of the condition checking functor.
+ */
+template <typename T, typename U>
+struct PropertyChangedCondition
+{
+        PropertyChangedCondition() = delete;
+        ~PropertyChangedCondition() = default;
+        PropertyChangedCondition(const PropertyChangedCondition&) = default;
+        PropertyChangedCondition& operator=(const PropertyChangedCondition&) = default;
+        PropertyChangedCondition(PropertyChangedCondition&&) = default;
+        PropertyChangedCondition& operator=(PropertyChangedCondition&&) = default;
+        PropertyChangedCondition(const char* iface, const char* property,
+                                 U&& condition) :
+            _iface(iface),
+            _property(property),
+            _condition(std::forward<U>(condition)) { }
+
+        /** @brief Test a property value.
+         *
+         * Extract the property from the PropertiesChanged
+         * message and run the condition test.
+         */
+        bool operator()(
+            sdbusplus::bus::bus&,
+            sdbusplus::message::message& msg,
+            Manager&) const
+        {
+            std::map <
+            std::string,
+                sdbusplus::message::variant<T >> properties;
+            const char* iface = nullptr;
+
+            msg.read(iface);
+            if (!iface || strcmp(iface, _iface))
+            {
+                return false;
+            }
+
+            msg.read(properties);
+            auto it = properties.find(_property);
+            if (it == properties.cend())
+            {
+                return false;
+            }
+
+            return _condition(
+                       std::forward<T>(it->second.template get<T>()));
+        }
+
+    private:
+        const char* _iface;
+        const char* _property;
+        U _condition;
+};
+
+/** @struct PropertyConditionBase
+ *  @brief Match filter functor that tests a property value.
+ *
+ *  Base class for PropertyCondition - factored out code that
+ *  doesn't need to be templated.
+ */
+struct PropertyConditionBase
+{
+        PropertyConditionBase() = delete;
+        virtual ~PropertyConditionBase() = default;
+        PropertyConditionBase(const PropertyConditionBase&) = default;
+        PropertyConditionBase& operator=(const PropertyConditionBase&) = default;
+        PropertyConditionBase(PropertyConditionBase&&) = default;
+        PropertyConditionBase& operator=(PropertyConditionBase&&) = default;
+
+        /** @brief Constructor
+         *
+         *  The service argument can be nullptr.  If something
+         *  else is provided the function will call the the
+         *  service directly.  If omitted, the function will
+         *  look up the service in the ObjectMapper.
+         *
+         *  @param path - The path of the object containing
+         *     the property to be tested.
+         *  @param iface - The interface hosting the property
+         *     to be tested.
+         *  @param property - The property to be tested.
+         *  @param service - The DBus service hosting the object.
+         */
+        PropertyConditionBase(
+            const char* path,
+            const char* iface,
+            const char* property,
+            const char* service) :
+            _path(path),
+            _iface(iface),
+            _property(property),
+            _service(service) {}
+
+        /** @brief Forward comparison to type specific implementation. */
+        virtual bool eval(sdbusplus::message::message&) const = 0;
+
+        /** @brief Test a property value.
+         *
+         * Make a DBus call and test the value of any property.
+         */
+        bool operator()(
+            sdbusplus::bus::bus&,
+            sdbusplus::message::message&,
+            Manager&) const;
+
+    private:
+        std::string _path;
+        std::string _iface;
+        std::string _property;
+        const char* _service;
+};
+
+/** @struct PropertyCondition
+ *  @brief Match filter functor that tests a property value.
+ *
+ *  @tparam T - The type of the property being tested.
+ *  @tparam U - The type of the condition checking functor.
+ */
+template <typename T, typename U>
+struct PropertyCondition final : public PropertyConditionBase
+{
+        PropertyCondition() = delete;
+        ~PropertyCondition() = default;
+        PropertyCondition(const PropertyCondition&) = default;
+        PropertyCondition& operator=(const PropertyCondition&) = default;
+        PropertyCondition(PropertyCondition&&) = default;
+        PropertyCondition& operator=(PropertyCondition&&) = default;
+
+        /** @brief Constructor
+         *
+         *  The service argument can be nullptr.  If something
+         *  else is provided the function will call the the
+         *  service directly.  If omitted, the function will
+         *  look up the service in the ObjectMapper.
+         *
+         *  @param path - The path of the object containing
+         *     the property to be tested.
+         *  @param iface - The interface hosting the property
+         *     to be tested.
+         *  @param property - The property to be tested.
+         *  @param condition - The test to run on the property.
+         *  @param service - The DBus service hosting the object.
+         */
+        PropertyCondition(
+            const char* path,
+            const char* iface,
+            const char* property,
+            U&& condition,
+            const char* service) :
+            PropertyConditionBase(path, iface, property, service),
+            _condition(std::forward<decltype(condition)>(condition)) {}
+
+        /** @brief Test a property value.
+         *
+         * Make a DBus call and test the value of any property.
+         */
+        bool eval(sdbusplus::message::message& msg) const override
+        {
+            sdbusplus::message::variant<T> value;
+            msg.read(value);
+            return _condition(
+                       std::forward<T>(value.template get<T>()));
+        }
+
+    private:
+        U _condition;
+};
+
+/** @brief Implicit type deduction for constructing PropertyChangedCondition.  */
+template <typename T>
+auto propertyChangedTo(
+    const char* iface,
+    const char* property,
+    T&& val)
+{
+    auto condition = [val = std::forward<T>(val)](T && arg)
+    {
+        return arg == val;
+    };
+    using U = decltype(condition);
+    return PropertyChangedCondition<T, U>(
+               iface, property, std::move(condition));
+}
+
+/** @brief Implicit type deduction for constructing PropertyCondition.  */
+template <typename T>
+auto propertyIs(
+    const char* path,
+    const char* iface,
+    const char* property,
+    T&& val,
+    const char* service = nullptr)
+{
+    auto condition = [val = std::forward<T>(val)](T && arg)
+    {
+        return arg == val;
+    };
+    using U = decltype(condition);
+    return PropertyCondition<T, U>(
+               path, iface, property, std::move(condition), service);
+}
+} // namespace functor
+} // namespace manager
+} // namespace inventory
+} // namespace phosphor
+
+// vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4
diff --git a/generated.mako.cpp b/generated.mako.cpp
index fe2c6cb..235e58a 100644
--- a/generated.mako.cpp
+++ b/generated.mako.cpp
@@ -3,6 +3,7 @@
 // This file was auto generated.  Do not edit.
 #include "manager.hpp"
 #include "utils.hpp"
+#include "functor.hpp"
 % for i in interfaces:
 #include <${i.header()}>
 % endfor
diff --git a/manager.hpp b/manager.hpp
index 806a9a4..797880b 100644
--- a/manager.hpp
+++ b/manager.hpp
@@ -7,7 +7,7 @@
 #include <sdbusplus/server.hpp>
 #include <xyz/openbmc_project/Inventory/Manager/server.hpp>
 #include "events.hpp"
-#include "actions.hpp"
+#include "functor.hpp"
 #include "types.hpp"
 
 namespace phosphor
diff --git a/pimgen.py b/pimgen.py
index be66bb0..2193c90 100755
--- a/pimgen.py
+++ b/pimgen.py
@@ -67,7 +67,7 @@
     '''Associate a template name with its namespace.'''
 
     def __init__(self, **kw):
-        self.namespace = kw.pop('namespace')
+        self.namespace = kw.pop('namespace', [])
         super(Template, self).__init__(**kw)
 
     def qualified(self):
@@ -206,44 +206,24 @@
         super(Vector, self).__init__(**kw)
 
 
-class Wrapper(MethodCall):
-    '''Convenience type for functions that wrap other functions.'''
-
-    def __init__(self, **kw):
-        m = MethodCall(
-            name=kw.pop('name'),
-            namespace=kw.pop('namespace', []),
-            templates=kw.pop('templates', []),
-            args=kw.pop('args', []))
-
-        kw['name'] = kw.pop('wrapper_name')
-        kw['namespace'] = kw.pop('wrapper_namespace', [])
-        kw['args'] = [m]
-        super(Wrapper, self).__init__(**kw)
-
-
-class Filter(Wrapper):
+class Filter(MethodCall):
     '''Convenience type for filters'''
 
     def __init__(self, **kw):
-        kw['wrapper_name'] = 'make_filter'
-        kw['wrapper_namespace'] = []
-        kw['namespace'] = ['filters']
+        kw['name'] = 'make_filter'
         super(Filter, self).__init__(**kw)
 
 
-class Action(Wrapper):
+class Action(MethodCall):
     '''Convenience type for actions'''
 
     def __init__(self, **kw):
-        kw['wrapper_name'] = 'make_action'
-        kw['wrapper_namespace'] = []
-        kw['namespace'] = ['actions']
+        kw['name'] = 'make_action'
         super(Action, self).__init__(**kw)
 
 
-class CreateObjects(Action):
-    '''Assemble a createObjects action.'''
+class CreateObjects(MethodCall):
+    '''Assemble a createObjects functor.'''
 
     def __init__(self, **kw):
         objs = []
@@ -273,22 +253,24 @@
             objs.append(InitializerList(values=[key_o, value_i]))
 
         kw['args'] = [InitializerList(values=objs)]
+        kw['namespace'] = ['functor']
         super(CreateObjects, self).__init__(**kw)
 
 
-class DestroyObjects(Action):
-    '''Assemble a destroyObject action.'''
+class DestroyObjects(MethodCall):
+    '''Assemble a destroyObject functor.'''
 
     def __init__(self, **kw):
         values = [{'value': x, 'type': 'string'} for x in kw.pop('paths')]
         args = [InitializerList(
             values=[TrivialArgument(**x) for x in values])]
         kw['args'] = args
+        kw['namespace'] = ['functor']
         super(DestroyObjects, self).__init__(**kw)
 
 
-class SetProperty(Action):
-    '''Assemble a setProperty action.'''
+class SetProperty(MethodCall):
+    '''Assemble a setProperty functor.'''
 
     def __init__(self, **kw):
         args = []
@@ -317,11 +299,12 @@
 
         kw['templates'] = [Template(name=name, namespace=namespace)]
         kw['args'] = args
+        kw['namespace'] = ['functor']
         super(SetProperty, self).__init__(**kw)
 
 
-class PropertyChanged(Filter):
-    '''Assemble a propertyChanged filter.'''
+class PropertyChanged(MethodCall):
+    '''Assemble a propertyChanged functor.'''
 
     def __init__(self, **kw):
         args = []
@@ -331,11 +314,12 @@
             decorators=[
                 Literal(kw['value'].get('type', None))], **kw.pop('value')))
         kw['args'] = args
+        kw['namespace'] = ['functor']
         super(PropertyChanged, self).__init__(**kw)
 
 
-class PropertyIs(Filter):
-    '''Assemble a propertyIs filter.'''
+class PropertyIs(MethodCall):
+    '''Assemble a propertyIs functor.'''
 
     def __init__(self, **kw):
         args = []
@@ -351,6 +335,7 @@
             args.append(TrivialArgument(value=service, type='string'))
 
         kw['args'] = args
+        kw['namespace'] = ['functor']
         super(PropertyIs, self).__init__(**kw)
 
 
@@ -373,6 +358,7 @@
 
         filters = [
             self.filter_map[x['name']](**x) for x in kw.pop('filters', [])]
+        filters = [Filter(args=[x]) for x in filters]
         filters = Vector(
             templates=[Template(name='Filter', namespace=[])],
             args=filters)
@@ -392,6 +378,7 @@
         action_type = Template(name='Action', namespace=[])
         action_args = [
             self.action_map[x['name']](**x) for x in kw.pop('actions', [])]
+        action_args = [Action(args=[x]) for x in action_args]
         actions = Vector(
             templates=[action_type],
             args=action_args)
diff --git a/types.hpp b/types.hpp
index fff52d5..d2105aa 100644
--- a/types.hpp
+++ b/types.hpp
@@ -4,6 +4,7 @@
 #include <string>
 #include <sdbusplus/message.hpp>
 #include <experimental/any>
+#include <functional>
 
 namespace phosphor
 {
@@ -12,6 +13,7 @@
 namespace manager
 {
 
+class Manager;
 namespace any_ns = std::experimental;
 
 /** @brief Inventory manager supported property types. */
@@ -27,6 +29,10 @@
 using Interface = InterfaceType<InterfaceVariantType>;
 using Object = ObjectType<InterfaceVariantType>;
 
+using Action = std::function<void (sdbusplus::bus::bus&, Manager&)>;
+using Filter = std::function <
+               bool (sdbusplus::bus::bus&, sdbusplus::message::message&, Manager&) >;
+
 } // namespace manager
 } // namespace inventory
 } // namespace phosphor
