diff --git a/src/EntityManager.cpp b/src/EntityManager.cpp
index b28dc9a..35fadb9 100644
--- a/src/EntityManager.cpp
+++ b/src/EntityManager.cpp
@@ -515,27 +515,6 @@
     return true;
 }
 
-// template function to add array as dbus property
-template <typename PropertyType>
-void addArrayToDbus(const std::string& name, const nlohmann::json& array,
-                    sdbusplus::asio::dbus_interface* iface,
-                    sdbusplus::asio::PropertyPermission permission)
-{
-    std::vector<PropertyType> values;
-    for (const auto& property : array)
-    {
-        auto ptr = property.get_ptr<const PropertyType*>();
-        if (ptr != nullptr)
-        {
-            values.emplace_back(*ptr);
-        }
-    }
-    // todo(james), currently there are no reason to persist arrays, get around
-    // to it if needed
-
-    iface->register_property(name, values, permission);
-}
-
 template <typename JsonType>
 bool setJsonFromPointer(const std::string& ptrStr, const JsonType& value,
                         nlohmann::json& systemConfiguration)
@@ -553,6 +532,53 @@
     }
 }
 
+// template function to add array as dbus property
+template <typename PropertyType>
+void addArrayToDbus(const std::string& name, const nlohmann::json& array,
+                    sdbusplus::asio::dbus_interface* iface,
+                    sdbusplus::asio::PropertyPermission permission,
+                    nlohmann::json& systemConfiguration,
+                    const std::string& jsonPointerString)
+{
+    std::vector<PropertyType> values;
+    for (const auto& property : array)
+    {
+        auto ptr = property.get_ptr<const PropertyType*>();
+        if (ptr != nullptr)
+        {
+            values.emplace_back(*ptr);
+        }
+    }
+
+    if (permission == sdbusplus::asio::PropertyPermission::readOnly)
+    {
+        iface->register_property(name, values);
+    }
+    else
+    {
+        iface->register_property(
+            name, values,
+            [&systemConfiguration,
+             jsonPointerString{std::string(jsonPointerString)}](
+                const std::vector<PropertyType>& newVal,
+                std::vector<PropertyType>& val) {
+                val = newVal;
+                if (!setJsonFromPointer(jsonPointerString, val,
+                                        systemConfiguration))
+                {
+                    std::cerr << "error setting json field\n";
+                    return -1;
+                }
+                if (!writeJsonFiles(systemConfiguration))
+                {
+                    std::cerr << "error setting json file\n";
+                    return -1;
+                }
+                return 1;
+            });
+    }
+}
+
 template <typename PropertyType>
 void addProperty(const std::string& propertyName, const PropertyType& value,
                  sdbusplus::asio::dbus_interface* iface,
@@ -667,7 +693,14 @@
             // all setable numbers are doubles as it is difficult to always
             // create a configuration file with all whole numbers as decimals
             // i.e. 1.0
-            if (dictPair.value().is_number())
+            if (array)
+            {
+                if (dictPair.value()[0].is_number())
+                {
+                    type = nlohmann::json::value_t::number_float;
+                }
+            }
+            else if (dictPair.value().is_number())
             {
                 type = nlohmann::json::value_t::number_float;
             }
@@ -682,7 +715,8 @@
                     // todo: array of bool isn't detected correctly by
                     // sdbusplus, change it to numbers
                     addArrayToDbus<uint64_t>(dictPair.key(), dictPair.value(),
-                                             iface.get(), permission);
+                                             iface.get(), permission,
+                                             systemConfiguration, key);
                 }
 
                 else
@@ -698,7 +732,8 @@
                 if (array)
                 {
                     addArrayToDbus<int64_t>(dictPair.key(), dictPair.value(),
-                                            iface.get(), permission);
+                                            iface.get(), permission,
+                                            systemConfiguration, key);
                 }
                 else
                 {
@@ -713,7 +748,8 @@
                 if (array)
                 {
                     addArrayToDbus<uint64_t>(dictPair.key(), dictPair.value(),
-                                             iface.get(), permission);
+                                             iface.get(), permission,
+                                             systemConfiguration, key);
                 }
                 else
                 {
@@ -729,7 +765,8 @@
                 if (array)
                 {
                     addArrayToDbus<double>(dictPair.key(), dictPair.value(),
-                                           iface.get(), permission);
+                                           iface.get(), permission,
+                                           systemConfiguration, key);
                 }
 
                 else
@@ -744,9 +781,9 @@
             {
                 if (array)
                 {
-                    addArrayToDbus<std::string>(dictPair.key(),
-                                                dictPair.value(), iface.get(),
-                                                permission);
+                    addArrayToDbus<std::string>(
+                        dictPair.key(), dictPair.value(), iface.get(),
+                        permission, systemConfiguration, key);
                 }
                 else
                 {
