diff --git a/control/json/config_base.hpp b/control/json/config_base.hpp
index 2f282f8..17287ce 100644
--- a/control/json/config_base.hpp
+++ b/control/json/config_base.hpp
@@ -15,8 +15,6 @@
  */
 #pragma once
 
-#include "types.hpp"
-
 #include <nlohmann/json.hpp>
 #include <phosphor-logging/log.hpp>
 
@@ -28,6 +26,9 @@
 using json = nlohmann::json;
 using namespace phosphor::logging;
 
+using PropertyVariantType =
+    std::variant<bool, int32_t, int64_t, double, std::string>;
+
 /**
  * @class ConfigBase - Base configuration object
  *
diff --git a/control/json/manager.cpp b/control/json/manager.cpp
index cf8b070..0cbb9d7 100644
--- a/control/json/manager.cpp
+++ b/control/json/manager.cpp
@@ -13,6 +13,8 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+#include "config.h"
+
 #include "manager.hpp"
 
 #include "fan.hpp"
@@ -69,6 +71,8 @@
             itZone->second->addFan(std::move(fan.second));
         }
     }
+
+    bus.request_name(CONTROL_BUSNAME);
 }
 
 const std::vector<std::string>& Manager::getActiveProfiles()
diff --git a/control/json/zone.cpp b/control/json/zone.cpp
index 485773c..c0ecfe4 100644
--- a/control/json/zone.cpp
+++ b/control/json/zone.cpp
@@ -18,8 +18,6 @@
 #include "zone.hpp"
 
 #include "fan.hpp"
-#include "functor.hpp"
-#include "handlers.hpp"
 
 #include <cereal/archives/json.hpp>
 #include <cereal/cereal.hpp>
@@ -43,7 +41,9 @@
 using namespace phosphor::logging;
 namespace fs = std::filesystem;
 
-const std::map<std::string, std::map<std::string, propHandler>>
+const std::map<std::string,
+               std::map<std::string, std::function<std::function<void(Zone*)>(
+                                         const json&, bool)>>>
     Zone::_intfPropHandlers = {{thermModeIntf,
                                 {{supportedProp, zone::property::supported},
                                  {currentProp, zone::property::current}}}};
@@ -260,7 +260,12 @@
                 throw std::runtime_error(
                     "Configured property function not available");
             }
-            auto zHandler = propFunc->second(property, persist);
+            auto propHandler = propFunc->second(property, persist);
+            // Only call non-null set property handler functions
+            if (propHandler)
+            {
+                propHandler(this);
+            }
         }
     }
 }
@@ -290,13 +295,13 @@
 
 /**
  * Properties of interfaces supported by the zone configuration that return
- * a ZoneHandler function that sets the zone's property value(s).
+ * a handler function that sets the zone's property value(s) and persist state.
  */
 namespace zone::property
 {
-// Get a zone handler function for the configured values of the "Supported"
-// property
-ZoneHandler supported(const json& jsonObj, bool persist)
+// Get a set property handler function for the configured values of the
+// "Supported" property
+std::function<void(Zone*)> supported(const json& jsonObj, bool persist)
 {
     std::vector<std::string> values;
     if (!jsonObj.contains("values"))
@@ -322,30 +327,31 @@
         }
     }
 
-    // TODO Use this zone object's extended `supported` method in the handler
-    return make_zoneHandler(handler::setZoneProperty<std::vector<std::string>>(
-        Zone::thermModeIntf, Zone::supportedProp, &control::Zone::supported,
-        std::move(values), persist));
+    return Zone::setProperty<std::vector<std::string>>(
+        Zone::thermModeIntf, Zone::supportedProp, &Zone::supported,
+        std::move(values), persist);
 }
 
-// Get a zone handler function for a configured value of the "Current"
+// Get a set property handler function for a configured value of the "Current"
 // property
-ZoneHandler current(const json& jsonObj, bool persist)
+std::function<void(Zone*)> current(const json& jsonObj, bool persist)
 {
     // Use default value for "Current" property if no "value" entry given
     if (!jsonObj.contains("value"))
     {
-        log<level::ERR>("No 'value' found for \"Current\" property, "
-                        "using default",
-                        entry("JSON=%s", jsonObj.dump().c_str()));
-        return {};
+        log<level::INFO>("No 'value' found for \"Current\" property, "
+                         "using default",
+                         entry("JSON=%s", jsonObj.dump().c_str()));
+        // Set persist state of property
+        return Zone::setPropertyPersist(Zone::thermModeIntf, Zone::currentProp,
+                                        persist);
     }
 
-    // TODO Use this zone object's `current` method in the handler
-    return make_zoneHandler(handler::setZoneProperty<std::string>(
-        Zone::thermModeIntf, Zone::currentProp, &control::Zone::current,
-        jsonObj["value"].get<std::string>(), persist));
+    return Zone::setProperty<std::string>(
+        Zone::thermModeIntf, Zone::currentProp, &Zone::current,
+        jsonObj["value"].get<std::string>(), persist);
 }
+
 } // namespace zone::property
 
 } // namespace phosphor::fan::control::json
diff --git a/control/json/zone.hpp b/control/json/zone.hpp
index 9a0afb2..45dea20 100644
--- a/control/json/zone.hpp
+++ b/control/json/zone.hpp
@@ -36,9 +36,6 @@
 using ThermalObject = sdbusplus::server::object::object<
     sdbusplus::xyz::openbmc_project::Control::server::ThermalMode>;
 
-/* Interface property handler function */
-using propHandler = std::function<ZoneHandler(const json&, bool)>;
-
 /**
  * @class Zone - Represents a configured fan control zone
  *
@@ -193,6 +190,58 @@
      */
     std::string current(std::string value) override;
 
+    /**
+     * @brief A handler function to set/update a property on a zone
+     * @details Sets or updates a zone's dbus property to the given value using
+     * the provided base dbus object's set property function
+     *
+     * @param[in] intf - Interface on zone object
+     * @param[in] prop - Property on interface
+     * @param[in] func - Zone object's set property function pointer
+     * @param[in] value - Value to set property to
+     * @param[in] persist - Persist property value or not
+     *
+     * @return Lambda function
+     *     A lambda function to set/update the zone's dbus property
+     */
+    template <typename T>
+    static auto setProperty(const char* intf, const char* prop,
+                            T (Zone::*func)(T), T&& value, bool persist)
+    {
+        return [=, value = std::forward<T>(value)](Zone* zone) {
+            (zone->*func)(value);
+            if (persist)
+            {
+                zone->setPersisted(intf, prop);
+            }
+        };
+    }
+
+    /**
+     * @brief A handler function to set/update a zone's dbus property's persist
+     * state
+     * @details Sets or updates a zone's dbus property's persist state where the
+     * value of the property is to be left unchanged
+     *
+     * @param[in] intf - Interface on zone object
+     * @param[in] prop - Property on interface
+     * @param[in] persist - Persist property value or not
+     *
+     * @return Lambda function
+     *     A lambda function to set/update the zone's dbus property's persist
+     * state
+     */
+    static auto setPropertyPersist(const char* intf, const char* prop,
+                                   bool persist)
+    {
+        return [=](Zone* zone) {
+            if (persist)
+            {
+                zone->setPersisted(intf, prop);
+            }
+        };
+    }
+
   private:
     /* The zone's default ceiling value for fans */
     uint64_t _defaultCeiling;
@@ -227,8 +276,12 @@
     /* Map of interfaces to persisted properties the zone hosts*/
     std::map<std::string, std::vector<std::string>> _propsPersisted;
 
-    /* Interface to property mapping of their associated handler function */
-    static const std::map<std::string, std::map<std::string, propHandler>>
+    /* Interface to property mapping of their associated set property handler
+     * function */
+    static const std::map<
+        std::string,
+        std::map<std::string,
+                 std::function<std::function<void(Zone*)>(const json&, bool)>>>
         _intfPropHandlers;
 
     /* List of fans included in this zone */
@@ -312,25 +365,29 @@
 
 /**
  * @brief "Supported" property on the "xyz.openbmc_project.Control.ThermalMode"
- * interface
+ * interface parser. Also creates the handler function for the Zone object to
+ * initialize the property according to what's parsed from the configuration.
  *
  * @param[in] jsonObj - JSON object for the "Supported" property
  * @param[in] persist - Whether to persist the value or not
  *
- * @return Zone interface handler function for the property
+ * @return Zone interface set property handler function for the "Supported"
+ * property
  */
-ZoneHandler supported(const json& jsonObj, bool persist);
+std::function<void(Zone*)> supported(const json& jsonObj, bool persist);
 
 /**
  * @brief "Current" property on the "xyz.openbmc_project.Control.ThermalMode"
- * interface
+ * interface parser. Also creates the handler function for the Zone object to
+ * initialize the property according to what's parsed from the configuration.
  *
  * @param[in] jsonObj - JSON object for the "Current" property
  * @param[in] persist - Whether to persist the value or not
  *
- * @return Zone interface handler function for the property
+ * @return Zone interface set property handler function for the "Current"
+ * property
  */
-ZoneHandler current(const json& jsonObj, bool persist);
+std::function<void(Zone*)> current(const json& jsonObj, bool persist);
 
 } // namespace zone::property
 
