diff --git a/functor.hpp b/functor.hpp
index 265e467..50fdcfa 100644
--- a/functor.hpp
+++ b/functor.hpp
@@ -45,15 +45,51 @@
     return Filter(std::forward<T>(filter));
 }
 
+/** @brief make_path_condition
+ *
+ *  Adapt a path_condition function object.
+ *
+ *  @param[in] filter - The functor being adapted.
+ *  @returns - The adapted functor.
+ *
+ *  @tparam T - The type of the functor being adapted.
+ */
+template <typename T>
+auto make_path_condition(T&& condition)
+{
+    return PathCondition(std::forward<T>(condition));
+}
+
+template <typename T, typename ...Args>
+auto callArrayWithStatus(T&& container, Args&& ...args)
+{
+    for (auto f : container)
+    {
+        if (!f(std::forward<Args>(args)...))
+        {
+            return false;
+        }
+    }
+    return true;
+}
+
 namespace functor
 {
 
 /** @brief Destroy objects action.  */
-inline auto destroyObjects(std::vector<const char*>&& paths)
+inline auto destroyObjects(
+    std::vector<const char*>&& paths,
+    std::vector<PathCondition>&& conditions)
 {
-    return [ = ](auto&, auto & m)
+    return [ = ](auto & b, auto & m)
     {
-        m.destroyObjects(paths);
+        for (const auto& p : paths)
+        {
+            if (callArrayWithStatus(conditions, p, b, m))
+            {
+                m.destroyObjects({p});
+            }
+        }
     };
 }
 
@@ -88,20 +124,27 @@
  */
 template <typename T, typename U, typename V>
 auto setProperty(
-    std::vector<const char*>&& paths, const char* iface,
-    U&& member, V&& value)
+    std::vector<const char*>&& paths,
+    std::vector<PathCondition>&& conditions,
+    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)
+    return [paths, conditions = conditions, iface,
+                  member,
+                  value = std::forward<V>(value)](auto & b, auto & m)
     {
         for (auto p : paths)
         {
-            m.template invokeMethod<T>(
-                p, iface, member, value);
+            if (callArrayWithStatus(conditions, p, b, m))
+            {
+                m.template invokeMethod<T>(
+                    p, iface, member, value);
+            }
         }
     };
 }
@@ -199,7 +242,7 @@
             const char* iface,
             const char* property,
             const char* service) :
-            _path(path),
+            _path(path ? path : std::string()),
             _iface(iface),
             _property(property),
             _service(service) {}
@@ -216,6 +259,15 @@
             sdbusplus::message::message&,
             Manager&) const;
 
+        /** @brief Test a property value.
+         *
+         * Make a DBus call and test the value of any property.
+         */
+        bool operator()(
+            const std::string&,
+            sdbusplus::bus::bus&,
+            Manager&) const;
+
     private:
         std::string _path;
         std::string _iface;
