Move to common variant

This saves approximately 34kB in the compressed binary size of bmcweb
due to reduced template instantiations.  This amounts to a 2.5%
reduction in the overall size.

Note, there were a few places where we broke const-correctness in the
form of pulling a non-const reference out of a const variant.  This
new variant now requires const correctness, so some consts are
added where required.

Tested: Code compiles.

Signed-off-by: Ed Tanous <edtanous@google.com>
Change-Id: I6a60c8881c1268627eedb4ffddf16689dc5f6ed2
diff --git a/http/routing.hpp b/http/routing.hpp
index eca1b3a..fe9c7e9 100644
--- a/http/routing.hpp
+++ b/http/routing.hpp
@@ -1,6 +1,7 @@
 #pragma once
 
 #include "common.hpp"
+#include "dbus_utility.hpp"
 #include "error_messages.hpp"
 #include "http_request.hpp"
 #include "http_response.hpp"
@@ -1306,12 +1307,10 @@
         }
 
         crow::connections::systemBus->async_method_call(
-            [&req, asyncResp, &rules, ruleIndex, found](
-                const boost::system::error_code ec,
-                const std::map<
-                    std::string,
-                    std::variant<bool, std::string, std::vector<std::string>>>&
-                    userInfo) {
+            [&req, asyncResp, &rules, ruleIndex,
+             found](const boost::system::error_code ec,
+                    const std::map<std::string, dbus::utility::DbusVariantType>&
+                        userInfo) {
                 if (ec)
                 {
                     BMCWEB_LOG_ERROR << "GetUserInfo failed...";
diff --git a/include/hostname_monitor.hpp b/include/hostname_monitor.hpp
index 1b04af5..17fbe51 100644
--- a/include/hostname_monitor.hpp
+++ b/include/hostname_monitor.hpp
@@ -2,6 +2,7 @@
 #ifdef BMCWEB_ENABLE_SSL
 #include <boost/container/flat_map.hpp>
 #include <dbus_singleton.hpp>
+#include <include/dbus_utility.hpp>
 #include <sdbusplus/bus/match.hpp>
 #include <sdbusplus/message/types.hpp>
 #include <ssl_key_handler.hpp>
@@ -42,7 +43,7 @@
 
     sdbusplus::message::message message(m);
     std::string iface;
-    boost::container::flat_map<std::string, std::variant<std::string>>
+    boost::container::flat_map<std::string, dbus::utility::DbusVariantType>
         changedProperties;
 
     message.read(iface, changedProperties);
diff --git a/include/image_upload.hpp b/include/image_upload.hpp
index 1a0ace0..1b0a09a 100644
--- a/include/image_upload.hpp
+++ b/include/image_upload.hpp
@@ -5,6 +5,7 @@
 #include <boost/uuid/uuid_generators.hpp>
 #include <boost/uuid/uuid_io.hpp>
 #include <dbus_singleton.hpp>
+#include <dbus_utility.hpp>
 
 #include <cstdio>
 #include <fstream>
@@ -64,8 +65,8 @@
 
             sdbusplus::message::object_path path;
             std::vector<std::pair<
-                std::string,
-                std::vector<std::pair<std::string, std::variant<std::string>>>>>
+                std::string, std::vector<std::pair<
+                                 std::string, dbus::utility::DbusVariantType>>>>
                 interfaces;
             m.read(path, interfaces);
 
diff --git a/include/nbd_proxy.hpp b/include/nbd_proxy.hpp
index 7b90e90..ed5265d 100644
--- a/include/nbd_proxy.hpp
+++ b/include/nbd_proxy.hpp
@@ -25,8 +25,6 @@
 #include <privileges.hpp>
 #include <websocket.hpp>
 
-#include <variant>
-
 namespace crow
 {
 
@@ -256,56 +254,54 @@
                    const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
             BMCWEB_LOG_DEBUG << "nbd-proxy.onopen(" << &conn << ")";
 
-            auto getUserInfoHandler =
-                [&conn, asyncResp](
-                    const boost::system::error_code ec,
-                    boost::container::flat_map<
-                        std::string, std::variant<bool, std::string,
-                                                  std::vector<std::string>>>
-                        userInfo) {
-                    if (ec)
-                    {
-                        BMCWEB_LOG_ERROR << "GetUserInfo failed...";
-                        conn.close("Failed to get user information");
-                        return;
-                    }
+            auto getUserInfoHandler = [&conn, asyncResp](
+                                          const boost::system::error_code ec,
+                                          boost::container::flat_map<
+                                              std::string,
+                                              dbus::utility::DbusVariantType>
+                                              userInfo) {
+                if (ec)
+                {
+                    BMCWEB_LOG_ERROR << "GetUserInfo failed...";
+                    conn.close("Failed to get user information");
+                    return;
+                }
 
-                    const std::string* userRolePtr = nullptr;
-                    auto userInfoIter = userInfo.find("UserPrivilege");
-                    if (userInfoIter != userInfo.end())
-                    {
-                        userRolePtr =
-                            std::get_if<std::string>(&userInfoIter->second);
-                    }
+                const std::string* userRolePtr = nullptr;
+                auto userInfoIter = userInfo.find("UserPrivilege");
+                if (userInfoIter != userInfo.end())
+                {
+                    userRolePtr =
+                        std::get_if<std::string>(&userInfoIter->second);
+                }
 
-                    std::string userRole{};
-                    if (userRolePtr != nullptr)
-                    {
-                        userRole = *userRolePtr;
-                        BMCWEB_LOG_DEBUG << "userName = " << conn.getUserName()
-                                         << " userRole = " << *userRolePtr;
-                    }
+                std::string userRole{};
+                if (userRolePtr != nullptr)
+                {
+                    userRole = *userRolePtr;
+                    BMCWEB_LOG_DEBUG << "userName = " << conn.getUserName()
+                                     << " userRole = " << *userRolePtr;
+                }
 
-                    // Get the user privileges from the role
-                    ::redfish::Privileges userPrivileges =
-                        ::redfish::getUserPrivileges(userRole);
+                // Get the user privileges from the role
+                ::redfish::Privileges userPrivileges =
+                    ::redfish::getUserPrivileges(userRole);
 
-                    const ::redfish::Privileges requiredPrivileges{
-                        requiredPrivilegeString};
+                const ::redfish::Privileges requiredPrivileges{
+                    requiredPrivilegeString};
 
-                    if (!userPrivileges.isSupersetOf(requiredPrivileges))
-                    {
-                        BMCWEB_LOG_DEBUG
-                            << "User " << conn.getUserName()
-                            << " not authorized for nbd connection";
-                        conn.close("Unathourized access");
-                        return;
-                    }
+                if (!userPrivileges.isSupersetOf(requiredPrivileges))
+                {
+                    BMCWEB_LOG_DEBUG << "User " << conn.getUserName()
+                                     << " not authorized for nbd connection";
+                    conn.close("Unathourized access");
+                    return;
+                }
 
-                    auto openHandler = [&conn, asyncResp](
-                                           const boost::system::error_code ec,
-                                           const dbus::utility::
-                                               ManagedObjectType& objects) {
+                auto openHandler =
+                    [&conn, asyncResp](
+                        const boost::system::error_code ec,
+                        const dbus::utility::ManagedObjectType& objects) {
                         const std::string* socketValue = nullptr;
                         const std::string* endpointValue = nullptr;
                         const std::string* endpointObjectPath = nullptr;
@@ -404,13 +400,11 @@
 
                         sessions[&conn]->run();
                     };
-                    crow::connections::systemBus->async_method_call(
-                        std::move(openHandler),
-                        "xyz.openbmc_project.VirtualMedia",
-                        "/xyz/openbmc_project/VirtualMedia",
-                        "org.freedesktop.DBus.ObjectManager",
-                        "GetManagedObjects");
-                };
+                crow::connections::systemBus->async_method_call(
+                    std::move(openHandler), "xyz.openbmc_project.VirtualMedia",
+                    "/xyz/openbmc_project/VirtualMedia",
+                    "org.freedesktop.DBus.ObjectManager", "GetManagedObjects");
+            };
 
             crow::connections::systemBus->async_method_call(
                 std::move(getUserInfoHandler),
diff --git a/redfish-core/include/event_service_manager.hpp b/redfish-core/include/event_service_manager.hpp
index 92349cc..16af1be 100644
--- a/redfish-core/include/event_service_manager.hpp
+++ b/redfish-core/include/event_service_manager.hpp
@@ -24,6 +24,7 @@
 
 #include <boost/asio/io_context.hpp>
 #include <boost/container/flat_map.hpp>
+#include <dbus_utility.hpp>
 #include <error_messages.hpp>
 #include <event_service_store.hpp>
 #include <http_client.hpp>
@@ -37,7 +38,6 @@
 #include <fstream>
 #include <memory>
 #include <span>
-#include <variant>
 
 namespace redfish
 {
@@ -500,9 +500,8 @@
     }
 #endif
 
-    void filterAndSendReports(
-        const std::string& id,
-        const std::variant<telemetry::TimestampReadings>& var)
+    void filterAndSendReports(const std::string& id,
+                              const dbus::utility::DbusVariantType& var)
     {
         std::string mrdUri = telemetry::metricReportDefinitionUri + ("/" + id);
 
@@ -1315,8 +1314,7 @@
         }
 
         std::string interface;
-        std::vector<
-            std::pair<std::string, std::variant<telemetry::TimestampReadings>>>
+        std::vector<std::pair<std::string, dbus::utility::DbusVariantType>>
             props;
         std::vector<std::string> invalidProps;
         msg.read(interface, props, invalidProps);
@@ -1330,8 +1328,7 @@
             return;
         }
 
-        const std::variant<telemetry::TimestampReadings>& readings =
-            found->second;
+        const dbus::utility::DbusVariantType& readings = found->second;
         for (const auto& it :
              EventServiceManager::getInstance().subscriptionsMap)
         {
diff --git a/redfish-core/include/utils/fw_utils.hpp b/redfish-core/include/utils/fw_utils.hpp
index c990023..658ca4d 100644
--- a/redfish-core/include/utils/fw_utils.hpp
+++ b/redfish-core/include/utils/fw_utils.hpp
@@ -1,9 +1,9 @@
 #pragma once
 #include <async_resp.hpp>
+#include <dbus_utility.hpp>
 
 #include <algorithm>
 #include <string>
-#include <variant>
 #include <vector>
 
 namespace redfish
@@ -39,9 +39,9 @@
 {
     // Used later to determine running (known on Redfish as active) FW images
     crow::connections::systemBus->async_method_call(
-        [aResp, fwVersionPurpose, activeVersionPropName, populateLinkToImages](
-            const boost::system::error_code ec,
-            const std::variant<std::vector<std::string>>& resp) {
+        [aResp, fwVersionPurpose, activeVersionPropName,
+         populateLinkToImages](const boost::system::error_code ec,
+                               const dbus::utility::DbusVariantType& resp) {
             BMCWEB_LOG_DEBUG << "populateFirmwareInformation enter";
             if (ec)
             {
@@ -132,8 +132,8 @@
                                 const boost::system::error_code ec3,
                                 const boost::container::flat_map<
                                     std::string,
-                                    std::variant<bool, std::string, uint64_t,
-                                                 uint32_t>>& propertiesList) {
+                                    dbus::utility::DbusVariantType>&
+                                    propertiesList) {
                                 if (ec3)
                                 {
                                     BMCWEB_LOG_ERROR << "error_code = " << ec3;
@@ -150,9 +150,9 @@
 
                                 boost::container::flat_map<
                                     std::string,
-                                    std::variant<bool, std::string, uint64_t,
-                                                 uint32_t>>::const_iterator it =
-                                    propertiesList.find("Purpose");
+                                    dbus::utility::DbusVariantType>::
+                                    const_iterator it =
+                                        propertiesList.find("Purpose");
                                 if (it == propertiesList.end())
                                 {
                                     BMCWEB_LOG_ERROR
@@ -331,11 +331,10 @@
     BMCWEB_LOG_DEBUG << "getFwStatus: swId " << *swId << " svc " << dbusSvc;
 
     crow::connections::systemBus->async_method_call(
-        [asyncResp,
-         swId](const boost::system::error_code errorCode,
-               const boost::container::flat_map<
-                   std::string, std::variant<bool, std::string, uint64_t,
-                                             uint32_t>>& propertiesList) {
+        [asyncResp, swId](
+            const boost::system::error_code errorCode,
+            const boost::container::flat_map<
+                std::string, dbus::utility::DbusVariantType>& propertiesList) {
             if (errorCode)
             {
                 // not all fwtypes are updateable, this is ok
@@ -343,9 +342,8 @@
                 return;
             }
             boost::container::flat_map<
-                std::string, std::variant<bool, std::string, uint64_t,
-                                          uint32_t>>::const_iterator it =
-                propertiesList.find("Activation");
+                std::string, dbus::utility::DbusVariantType>::const_iterator
+                it = propertiesList.find("Activation");
             if (it == propertiesList.end())
             {
                 BMCWEB_LOG_DEBUG << "Can't find property \"Activation\"!";
@@ -388,7 +386,7 @@
 {
     crow::connections::systemBus->async_method_call(
         [asyncResp, fwId](const boost::system::error_code ec,
-                          const std::variant<std::vector<std::string>>& resp) {
+                          dbus::utility::DbusVariantType& resp) {
             if (ec)
             {
                 BMCWEB_LOG_DEBUG << " error_code = " << ec
diff --git a/redfish-core/lib/account_service.hpp b/redfish-core/lib/account_service.hpp
index 865a383..46f6a93 100644
--- a/redfish-core/lib/account_service.hpp
+++ b/redfish-core/lib/account_service.hpp
@@ -23,8 +23,6 @@
 #include <registries/privilege_registry.hpp>
 #include <utils/json_utils.hpp>
 
-#include <variant>
-
 namespace redfish
 {
 
@@ -68,10 +66,9 @@
     std::vector<std::pair<std::string, LDAPRoleMapData>> groupRoleList;
 };
 
-using DbusVariantType = std::variant<bool, int32_t, std::string>;
-
 using DbusInterfaceType = boost::container::flat_map<
-    std::string, boost::container::flat_map<std::string, DbusVariantType>>;
+    std::string,
+    boost::container::flat_map<std::string, dbus::utility::DbusVariantType>>;
 
 using ManagedObjectType =
     std::vector<std::pair<sdbusplus::message::object_path, DbusInterfaceType>>;
@@ -295,7 +292,8 @@
                         propertyInterface, "Set",
                         "xyz.openbmc_project.User.PrivilegeMapperEntry",
                         "GroupName",
-                        std::variant<std::string>(std::move(*remoteGroup)));
+                        dbus::utility::DbusVariantType(
+                            std::move(*remoteGroup)));
                 }
 
                 // If "LocalRole" info is provided
@@ -319,7 +317,7 @@
                         propertyInterface, "Set",
                         "xyz.openbmc_project.User.PrivilegeMapperEntry",
                         "Privilege",
-                        std::variant<std::string>(
+                        dbus::utility::DbusVariantType(
                             getPrivilegeFromRoleId(std::move(*localRole))));
                 }
             }
@@ -665,7 +663,7 @@
         },
         ldapDbusService, ldapConfigObject, propertyInterface, "Set",
         ldapConfigInterface, "LDAPServerURI",
-        std::variant<std::string>(serviceAddressList.front()));
+        dbus::utility::DbusVariantType(serviceAddressList.front()));
 }
 /**
  * @brief updates the LDAP Bind DN and updates the
@@ -696,7 +694,8 @@
             BMCWEB_LOG_DEBUG << "Updated the username";
         },
         ldapDbusService, ldapConfigObject, propertyInterface, "Set",
-        ldapConfigInterface, "LDAPBindDN", std::variant<std::string>(username));
+        ldapConfigInterface, "LDAPBindDN",
+        dbus::utility::DbusVariantType(username));
 }
 
 /**
@@ -728,7 +727,7 @@
         },
         ldapDbusService, ldapConfigObject, propertyInterface, "Set",
         ldapConfigInterface, "LDAPBindDNPassword",
-        std::variant<std::string>(password));
+        dbus::utility::DbusVariantType(password));
 }
 
 /**
@@ -771,7 +770,7 @@
         },
         ldapDbusService, ldapConfigObject, propertyInterface, "Set",
         ldapConfigInterface, "LDAPBaseDN",
-        std::variant<std::string>(baseDNList.front()));
+        dbus::utility::DbusVariantType(baseDNList.front()));
 }
 /**
  * @brief updates the LDAP user name attribute and updates the
@@ -807,7 +806,7 @@
         },
         ldapDbusService, ldapConfigObject, propertyInterface, "Set",
         ldapConfigInterface, "UserNameAttribute",
-        std::variant<std::string>(userNameAttribute));
+        dbus::utility::DbusVariantType(userNameAttribute));
 }
 /**
  * @brief updates the LDAP group attribute and updates the
@@ -843,7 +842,7 @@
         },
         ldapDbusService, ldapConfigObject, propertyInterface, "Set",
         ldapConfigInterface, "GroupNameAttribute",
-        std::variant<std::string>(groupsAttribute));
+        dbus::utility::DbusVariantType(groupsAttribute));
 }
 /**
  * @brief updates the LDAP service enable and updates the
@@ -874,7 +873,8 @@
             BMCWEB_LOG_DEBUG << "Updated Service enable = " << serviceEnabled;
         },
         ldapDbusService, ldapConfigObject, propertyInterface, "Set",
-        ldapEnableInterface, "Enabled", std::variant<bool>(serviceEnabled));
+        ldapEnableInterface, "Enabled",
+        dbus::utility::DbusVariantType(serviceEnabled));
 }
 
 inline void
@@ -1197,7 +1197,7 @@
                     "xyz.openbmc_project.User.Manager", dbusObjectPath.c_str(),
                     "org.freedesktop.DBus.Properties", "Set",
                     "xyz.openbmc_project.User.Attributes", "UserEnabled",
-                    std::variant<bool>{*enabled});
+                    dbus::utility::DbusVariantType{*enabled});
             }
 
             if (roleId)
@@ -1227,7 +1227,7 @@
                     "xyz.openbmc_project.User.Manager", dbusObjectPath.c_str(),
                     "org.freedesktop.DBus.Properties", "Set",
                     "xyz.openbmc_project.User.Attributes", "UserPrivilege",
-                    std::variant<std::string>{priv});
+                    dbus::utility::DbusVariantType{priv});
             }
 
             if (locked)
@@ -1256,7 +1256,8 @@
                     "xyz.openbmc_project.User.Manager", dbusObjectPath.c_str(),
                     "org.freedesktop.DBus.Properties", "Set",
                     "xyz.openbmc_project.User.Attributes",
-                    "UserLockedForFailedAttempt", std::variant<bool>{*locked});
+                    "UserLockedForFailedAttempt",
+                    dbus::utility::DbusVariantType{*locked});
             }
         });
 }
@@ -1317,8 +1318,7 @@
                 [asyncResp](
                     const boost::system::error_code ec,
                     const std::vector<
-                        std::pair<std::string,
-                                  std::variant<uint32_t, uint16_t, uint8_t>>>&
+                        std::pair<std::string, dbus::utility::DbusVariantType>>&
                         propertiesList) {
                     if (ec)
                     {
@@ -1328,9 +1328,8 @@
                     BMCWEB_LOG_DEBUG << "Got " << propertiesList.size()
                                      << "properties for AccountService";
                     for (const std::pair<std::string,
-                                         std::variant<uint32_t, uint16_t,
-                                                      uint8_t>>& property :
-                         propertiesList)
+                                         dbus::utility::DbusVariantType>&
+                             property : propertiesList)
                     {
                         if (property.first == "MinPasswordLength")
                         {
@@ -1466,7 +1465,7 @@
                         "org.freedesktop.DBus.Properties", "Set",
                         "xyz.openbmc_project.User.AccountPolicy",
                         "AccountUnlockTimeout",
-                        std::variant<uint32_t>(*unlockTimeout));
+                        dbus::utility::DbusVariantType(*unlockTimeout));
                 }
                 if (lockoutThreshold)
                 {
@@ -1484,7 +1483,7 @@
                         "org.freedesktop.DBus.Properties", "Set",
                         "xyz.openbmc_project.User.AccountPolicy",
                         "MaxLoginAttemptBeforeLockout",
-                        std::variant<uint16_t>(*lockoutThreshold));
+                        dbus::utility::DbusVariantType(*lockoutThreshold));
                 }
             });
 
@@ -1603,9 +1602,8 @@
             // Reading AllGroups property
             crow::connections::systemBus->async_method_call(
                 [asyncResp, username, password{std::move(password)}, roleId,
-                 enabled](
-                    const boost::system::error_code ec,
-                    const std::variant<std::vector<std::string>>& allGroups) {
+                 enabled](const boost::system::error_code ec,
+                          const dbus::utility::DbusVariantType& allGroups) {
                     if (ec)
                     {
                         BMCWEB_LOG_DEBUG << "ERROR with async_method_call";
diff --git a/redfish-core/lib/certificate_service.hpp b/redfish-core/lib/certificate_service.hpp
index 8a78317..3dca18b 100644
--- a/redfish-core/lib/certificate_service.hpp
+++ b/redfish-core/lib/certificate_service.hpp
@@ -3,9 +3,9 @@
 #include <app.hpp>
 #include <boost/convert.hpp>
 #include <boost/convert/strtol.hpp>
+#include <dbus_utility.hpp>
 #include <registries/privilege_registry.hpp>
 
-#include <variant>
 namespace redfish
 {
 namespace certs
@@ -449,10 +449,10 @@
                         messages::internalError(asyncResp->res);
                         return;
                     }
-                    std::vector<
-                        std::pair<std::string,
-                                  std::vector<std::pair<
-                                      std::string, std::variant<std::string>>>>>
+                    std::vector<std::pair<
+                        std::string,
+                        std::vector<std::pair<std::string,
+                                              dbus::utility::DbusVariantType>>>>
                         interfacesProperties;
                     sdbusplus::message::object_path csrObjectPath;
                     m.read(csrObjectPath, interfacesProperties);
@@ -569,9 +569,8 @@
     const std::string& objectPath, const std::string& service, long certId,
     const std::string& certURL, const std::string& name)
 {
-    using PropertyType =
-        std::variant<std::string, uint64_t, std::vector<std::string>>;
-    using PropertiesMap = boost::container::flat_map<std::string, PropertyType>;
+    using PropertiesMap =
+        boost::container::flat_map<std::string, dbus::utility::DbusVariantType>;
     BMCWEB_LOG_DEBUG << "getCertificateProperties Path=" << objectPath
                      << " certId=" << certId << " certURl=" << certURL;
     crow::connections::systemBus->async_method_call(
diff --git a/redfish-core/lib/chassis.hpp b/redfish-core/lib/chassis.hpp
index 6d99313..df7e205 100644
--- a/redfish-core/lib/chassis.hpp
+++ b/redfish-core/lib/chassis.hpp
@@ -20,11 +20,10 @@
 
 #include <app.hpp>
 #include <boost/container/flat_map.hpp>
+#include <dbus_utility.hpp>
 #include <registries/privilege_registry.hpp>
 #include <utils/collection.hpp>
 
-#include <variant>
-
 namespace redfish
 {
 
@@ -40,7 +39,7 @@
     crow::connections::systemBus->async_method_call(
         [aResp{std::move(aResp)}](
             const boost::system::error_code ec,
-            const std::variant<std::string>& chassisState) {
+            const dbus::utility::DbusVariantType& chassisState) {
             if (ec)
             {
                 BMCWEB_LOG_DEBUG << "DBUS response error " << ec;
@@ -76,16 +75,14 @@
  * DBus types primitives for several generic DBus interfaces
  * TODO(Pawel) consider move this to separate file into boost::dbus
  */
-// Note, this is not a very useful Variant, but because it isn't used to get
-// values, it should be as simple as possible
-// TODO(ed) invent a nullvariant type
-using VariantType = std::variant<bool, std::string, uint64_t, uint32_t>;
 using ManagedObjectsType = std::vector<std::pair<
     sdbusplus::message::object_path,
-    std::vector<std::pair<std::string,
-                          std::vector<std::pair<std::string, VariantType>>>>>>;
+    std::vector<std::pair<
+        std::string,
+        std::vector<std::pair<std::string, dbus::utility::DbusVariantType>>>>>>;
 
-using PropertiesType = boost::container::flat_map<std::string, VariantType>;
+using PropertiesType =
+    boost::container::flat_map<std::string, dbus::utility::DbusVariantType>;
 
 inline void getIntrusionByService(std::shared_ptr<bmcweb::AsyncResp> aResp,
                                   const std::string& service,
@@ -95,7 +92,7 @@
 
     crow::connections::systemBus->async_method_call(
         [aResp{std::move(aResp)}](const boost::system::error_code ec,
-                                  const std::variant<std::string>& value) {
+                                  const dbus::utility::DbusVariantType& value) {
             if (ec)
             {
                 // do not add err msg in redfish response, because this is not
@@ -186,7 +183,7 @@
 {
     crow::connections::systemBus->async_method_call(
         [asyncResp](const boost::system::error_code ec,
-                    const std::variant<std::string>& property) {
+                    const dbus::utility::DbusVariantType& property) {
             if (ec)
             {
                 BMCWEB_LOG_DEBUG << "DBUS response error for Location";
@@ -214,7 +211,7 @@
 {
     crow::connections::systemBus->async_method_call(
         [asyncResp](const boost::system::error_code ec,
-                    const std::variant<std::string>& chassisUUID) {
+                    const dbus::utility::DbusVariantType& chassisUUID) {
             if (ec)
             {
                 BMCWEB_LOG_DEBUG << "DBUS response error for UUID";
@@ -282,9 +279,8 @@
                             std::make_shared<HealthPopulate>(asyncResp);
 
                         crow::connections::systemBus->async_method_call(
-                            [health](
-                                const boost::system::error_code ec2,
-                                std::variant<std::vector<std::string>>& resp) {
+                            [health](const boost::system::error_code ec2,
+                                     dbus::utility::DbusVariantType& resp) {
                                 if (ec2)
                                 {
                                     return; // no sensors = no failures
@@ -344,7 +340,8 @@
                             crow::connections::systemBus->async_method_call(
                                 [asyncResp, chassisId(std::string(chassisId))](
                                     const boost::system::error_code ec,
-                                    const std::variant<std::string>& property) {
+                                    const dbus::utility::DbusVariantType&
+                                        property) {
                                     if (ec)
                                     {
                                         BMCWEB_LOG_DEBUG
@@ -386,9 +383,12 @@
                             [asyncResp, chassisId(std::string(chassisId))](
                                 const boost::system::error_code /*ec2*/,
                                 const std::vector<
-                                    std::pair<std::string, VariantType>>&
+                                    std::pair<std::string,
+                                              dbus::utility::DbusVariantType>>&
                                     propertiesList) {
-                                for (const std::pair<std::string, VariantType>&
+                                for (const std::pair<
+                                         std::string,
+                                         dbus::utility::DbusVariantType>&
                                          property : propertiesList)
                                 {
                                     // Store DBus properties that are also
@@ -673,7 +673,7 @@
                 },
                 processName, objectPath, "org.freedesktop.DBus.Properties",
                 "Set", interfaceName, destProperty,
-                std::variant<std::string>{propertyValue});
+                dbus::utility::DbusVariantType{propertyValue});
         },
         busName, path, interface, method, "/", 0, interfaces);
 }
diff --git a/redfish-core/lib/ethernet.hpp b/redfish-core/lib/ethernet.hpp
index 98b556e..79a1f50 100644
--- a/redfish-core/lib/ethernet.hpp
+++ b/redfish-core/lib/ethernet.hpp
@@ -19,13 +19,13 @@
 #include <boost/container/flat_map.hpp>
 #include <boost/container/flat_set.hpp>
 #include <dbus_singleton.hpp>
+#include <dbus_utility.hpp>
 #include <error_messages.hpp>
 #include <registries/privilege_registry.hpp>
 #include <utils/json_utils.hpp>
 
 #include <optional>
 #include <regex>
-#include <variant>
 
 namespace redfish
 {
@@ -34,19 +34,14 @@
  * DBus types primitives for several generic DBus interfaces
  * TODO(Pawel) consider move this to separate file into boost::dbus
  */
-using PropertiesMapType = boost::container::flat_map<
-    std::string, std::variant<std::string, bool, uint8_t, int16_t, uint16_t,
-                              int32_t, uint32_t, int64_t, uint64_t, double>>;
+using PropertiesMapType =
+    boost::container::flat_map<std::string, dbus::utility::DbusVariantType>;
 
 using GetManagedObjects = std::vector<std::pair<
     sdbusplus::message::object_path,
-    std::vector<std::pair<
-        std::string,
-        boost::container::flat_map<
-            std::string,
-            std::variant<std::string, bool, uint8_t, int16_t, uint16_t, int32_t,
-                         uint32_t, int64_t, uint64_t, double,
-                         std::vector<std::string>>>>>>>;
+    std::vector<std::pair<std::string,
+                          boost::container::flat_map<
+                              std::string, dbus::utility::DbusVariantType>>>>>;
 
 enum class LinkType
 {
@@ -614,7 +609,7 @@
         std::string("/xyz/openbmc_project/network/") + ifaceId,
         "org.freedesktop.DBus.Properties", "Set",
         "xyz.openbmc_project.Network.VLAN", "Id",
-        std::variant<uint32_t>(inputVlanId));
+        dbus::utility::DbusVariantType(inputVlanId));
 }
 
 /**
@@ -748,7 +743,7 @@
         "/xyz/openbmc_project/network/" + ifaceId,
         "org.freedesktop.DBus.Properties", "Set",
         "xyz.openbmc_project.Network.EthernetInterface", "DefaultGateway",
-        std::variant<std::string>(gateway));
+        dbus::utility::DbusVariantType(gateway));
 }
 /**
  * @brief Creates a static IPv4 entry
@@ -1055,7 +1050,7 @@
         "xyz.openbmc_project.Network", "/xyz/openbmc_project/network/config",
         "org.freedesktop.DBus.Properties", "Set",
         "xyz.openbmc_project.Network.SystemConfiguration", "HostName",
-        std::variant<std::string>(hostname));
+        dbus::utility::DbusVariantType(hostname));
 }
 
 inline void
@@ -1075,7 +1070,7 @@
         "/xyz/openbmc_project/network/" + ifaceId,
         "org.freedesktop.DBus.Properties", "Set",
         "xyz.openbmc_project.Network.EthernetInterface", "DomainName",
-        std::variant<std::vector<std::string>>(vectorDomainname));
+        dbus::utility::DbusVariantType(vectorDomainname));
 }
 
 inline bool isHostnameValid(const std::string& hostname)
@@ -1154,7 +1149,7 @@
         "/xyz/openbmc_project/network/" + ifaceId,
         "org.freedesktop.DBus.Properties", "Set",
         "xyz.openbmc_project.Network.MACAddress", "MACAddress",
-        std::variant<std::string>(macAddress));
+        dbus::utility::DbusVariantType(macAddress));
 }
 
 inline void setDHCPEnabled(const std::string& ifaceId,
@@ -1177,7 +1172,7 @@
         "/xyz/openbmc_project/network/" + ifaceId,
         "org.freedesktop.DBus.Properties", "Set",
         "xyz.openbmc_project.Network.EthernetInterface", propertyName,
-        std::variant<std::string>{dhcp});
+        dbus::utility::DbusVariantType{dhcp});
 }
 
 inline void setEthernetInterfaceBoolProperty(
@@ -1197,7 +1192,7 @@
         "/xyz/openbmc_project/network/" + ifaceId,
         "org.freedesktop.DBus.Properties", "Set",
         "xyz.openbmc_project.Network.EthernetInterface", propertyName,
-        std::variant<bool>{value});
+        dbus::utility::DbusVariantType{value});
 }
 
 inline void setDHCPv4Config(const std::string& propertyName, const bool& value,
@@ -1217,7 +1212,7 @@
         "/xyz/openbmc_project/network/config/dhcp",
         "org.freedesktop.DBus.Properties", "Set",
         "xyz.openbmc_project.Network.DHCPConfiguration", propertyName,
-        std::variant<bool>{value});
+        dbus::utility::DbusVariantType{value});
 }
 
 inline void handleDHCPPatch(const std::string& ifaceId,
@@ -1550,7 +1545,7 @@
         "/xyz/openbmc_project/network/" + ifaceId,
         "org.freedesktop.DBus.Properties", "Set",
         "xyz.openbmc_project.Network.EthernetInterface", "StaticNameServers",
-        std::variant<std::vector<std::string>>{updatedStaticNameServers});
+        dbus::utility::DbusVariantType{updatedStaticNameServers});
 }
 
 inline void handleIPv6StaticAddressesPatch(
@@ -2172,7 +2167,7 @@
                                     "/xyz/openbmc_project/network/" + ifaceId,
                                     "org.freedesktop.DBus.Properties", "Set",
                                     "xyz.openbmc_project.Network.VLAN", "Id",
-                                    std::variant<uint32_t>(vlanId));
+                                    dbus::utility::DbusVariantType(vlanId));
                             }
                             else
                             {
diff --git a/redfish-core/lib/hypervisor_system.hpp b/redfish-core/lib/hypervisor_system.hpp
index 01d7528..5089206 100644
--- a/redfish-core/lib/hypervisor_system.hpp
+++ b/redfish-core/lib/hypervisor_system.hpp
@@ -4,13 +4,13 @@
 #include <boost/container/flat_map.hpp>
 #include <boost/container/flat_set.hpp>
 #include <dbus_singleton.hpp>
+#include <dbus_utility.hpp>
 #include <error_messages.hpp>
 #include <registries/privilege_registry.hpp>
 #include <utils/json_utils.hpp>
 
 #include <optional>
 #include <utility>
-#include <variant>
 
 // TODO(ed) requestRoutesHypervisorSystems seems to have copy-pasted a
 // lot of code, and has a number of methods that have name conflicts with the
@@ -35,7 +35,7 @@
     BMCWEB_LOG_DEBUG << "Get hypervisor state information.";
     crow::connections::systemBus->async_method_call(
         [aResp](const boost::system::error_code ec,
-                const std::variant<std::string>& hostState) {
+                const dbus::utility::DbusVariantType& hostState) {
             if (ec)
             {
                 BMCWEB_LOG_DEBUG << "DBUS response error " << ec;
@@ -374,7 +374,7 @@
         "/xyz/openbmc_project/network/hypervisor/" + ethIfaceId + "/ipv4/addr0",
         "org.freedesktop.DBus.Properties", "Set",
         "xyz.openbmc_project.Network.IP", "Address",
-        std::variant<std::string>(ipv4Address));
+        dbus::utility::DbusVariantType(ipv4Address));
 }
 
 /**
@@ -406,7 +406,7 @@
         "/xyz/openbmc_project/network/hypervisor/" + ethIfaceId + "/ipv4/addr0",
         "org.freedesktop.DBus.Properties", "Set",
         "xyz.openbmc_project.Network.IP", "PrefixLength",
-        std::variant<uint8_t>(subnet));
+        dbus::utility::DbusVariantType(subnet));
 }
 
 /**
@@ -438,7 +438,7 @@
         "/xyz/openbmc_project/network/hypervisor",
         "org.freedesktop.DBus.Properties", "Set",
         "xyz.openbmc_project.Network.SystemConfiguration", "DefaultGateway",
-        std::variant<std::string>(gateway));
+        dbus::utility::DbusVariantType(gateway));
 }
 
 /**
@@ -540,7 +540,7 @@
         "/xyz/openbmc_project/network/hypervisor/" + ifaceId,
         "org.freedesktop.DBus.Properties", "Set",
         "xyz.openbmc_project.Network.EthernetInterface", "DHCPEnabled",
-        std::variant<std::string>{dhcp});
+        dbus::utility::DbusVariantType{dhcp});
 
     // Set the IPv4 address origin to the DHCP / Static as per the new value
     // of the DHCPEnabled property
@@ -570,7 +570,7 @@
         "/xyz/openbmc_project/network/hypervisor/" + ifaceId + "/ipv4/addr0",
         "org.freedesktop.DBus.Properties", "Set",
         "xyz.openbmc_project.Network.IP", "Origin",
-        std::variant<std::string>(origin));
+        dbus::utility::DbusVariantType(origin));
 }
 
 inline void handleHypervisorIPv4StaticPatch(
@@ -702,7 +702,7 @@
         "/xyz/openbmc_project/network/hypervisor",
         "org.freedesktop.DBus.Properties", "Set",
         "xyz.openbmc_project.Network.SystemConfiguration", "HostName",
-        std::variant<std::string>(hostName));
+        dbus::utility::DbusVariantType(hostName));
 }
 
 inline void
@@ -722,7 +722,7 @@
         "/xyz/openbmc_project/network/hypervisor/" + ifaceId + "/ipv4/addr0",
         "org.freedesktop.DBus.Properties", "Set",
         "xyz.openbmc_project.Object.Enable", "Enabled",
-        std::variant<bool>(isActive));
+        dbus::utility::DbusVariantType(isActive));
 }
 
 inline void requestRoutesHypervisorSystems(App& app)
@@ -738,8 +738,9 @@
                 get)([](const crow::Request&,
                         const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
             crow::connections::systemBus->async_method_call(
-                [asyncResp](const boost::system::error_code ec,
-                            const std::variant<std::string>& /*hostName*/) {
+                [asyncResp](
+                    const boost::system::error_code ec,
+                    const dbus::utility::DbusVariantType& /*hostName*/) {
                     if (ec)
                     {
                         messages::resourceNotFound(asyncResp->res, "System",
@@ -1098,7 +1099,7 @@
                     "/xyz/openbmc_project/state/hypervisor0",
                     "org.freedesktop.DBus.Properties", "Set",
                     "xyz.openbmc_project.State.Host", "RequestedHostTransition",
-                    std::variant<std::string>{std::move(command)});
+                    dbus::utility::DbusVariantType{std::move(command)});
             });
 }
 } // namespace redfish::hypervisor
diff --git a/redfish-core/lib/led.hpp b/redfish-core/lib/led.hpp
index 1fdf5e7..c4a7ed8 100644
--- a/redfish-core/lib/led.hpp
+++ b/redfish-core/lib/led.hpp
@@ -21,8 +21,6 @@
 
 #include <app.hpp>
 
-#include <variant>
-
 namespace redfish
 {
 /**
@@ -39,7 +37,7 @@
     BMCWEB_LOG_DEBUG << "Get led groups";
     crow::connections::systemBus->async_method_call(
         [aResp](const boost::system::error_code ec,
-                const std::variant<bool> asserted) {
+                const dbus::utility::DbusVariantType asserted) {
             // Some systems may not have enclosure_identify_blink object so
             // proceed to get enclosure_identify state.
             if (!ec)
@@ -60,7 +58,7 @@
             }
             crow::connections::systemBus->async_method_call(
                 [aResp](const boost::system::error_code ec2,
-                        const std::variant<bool> asserted2) {
+                        const dbus::utility::DbusVariantType asserted2) {
                     if (!ec2)
                     {
                         const bool* ledOn = std::get_if<bool>(&asserted2);
@@ -151,13 +149,13 @@
                 "/xyz/openbmc_project/led/groups/enclosure_identify",
                 "org.freedesktop.DBus.Properties", "Set",
                 "xyz.openbmc_project.Led.Group", "Asserted",
-                std::variant<bool>(ledOn));
+                dbus::utility::DbusVariantType(ledOn));
         },
         "xyz.openbmc_project.LED.GroupManager",
         "/xyz/openbmc_project/led/groups/enclosure_identify_blink",
         "org.freedesktop.DBus.Properties", "Set",
         "xyz.openbmc_project.Led.Group", "Asserted",
-        std::variant<bool>(ledBlinkng));
+        dbus::utility::DbusVariantType(ledBlinkng));
 }
 
 /**
@@ -173,7 +171,7 @@
     BMCWEB_LOG_DEBUG << "Get LocationIndicatorActive";
     crow::connections::systemBus->async_method_call(
         [aResp](const boost::system::error_code ec,
-                const std::variant<bool> asserted) {
+                const dbus::utility::DbusVariantType asserted) {
             // Some systems may not have enclosure_identify_blink object so
             // proceed to get enclosure_identify state.
             if (!ec)
@@ -194,7 +192,7 @@
             }
             crow::connections::systemBus->async_method_call(
                 [aResp](const boost::system::error_code ec2,
-                        const std::variant<bool> asserted2) {
+                        const dbus::utility::DbusVariantType asserted2) {
                     if (!ec2)
                     {
                         const bool* ledOn = std::get_if<bool>(&asserted2);
@@ -264,13 +262,13 @@
                     "/xyz/openbmc_project/led/groups/enclosure_identify",
                     "org.freedesktop.DBus.Properties", "Set",
                     "xyz.openbmc_project.Led.Group", "Asserted",
-                    std::variant<bool>(ledState));
+                    dbus::utility::DbusVariantType(ledState));
             }
         },
         "xyz.openbmc_project.LED.GroupManager",
         "/xyz/openbmc_project/led/groups/enclosure_identify_blink",
         "org.freedesktop.DBus.Properties", "Set",
         "xyz.openbmc_project.Led.Group", "Asserted",
-        std::variant<bool>(ledState));
+        dbus::utility::DbusVariantType(ledState));
 }
 } // namespace redfish
diff --git a/redfish-core/lib/log_services.hpp b/redfish-core/lib/log_services.hpp
index 074c927..d632552 100644
--- a/redfish-core/lib/log_services.hpp
+++ b/redfish-core/lib/log_services.hpp
@@ -32,6 +32,7 @@
 #include <boost/beast/http.hpp>
 #include <boost/container/flat_map.hpp>
 #include <boost/system/linux_error.hpp>
+#include <dbus_utility.hpp>
 #include <error_messages.hpp>
 #include <registries/privilege_registry.hpp>
 
@@ -102,9 +103,8 @@
 
 namespace fs = std::filesystem;
 
-using GetManagedPropertyType = boost::container::flat_map<
-    std::string, std::variant<std::string, bool, uint8_t, int16_t, uint16_t,
-                              int32_t, uint32_t, int64_t, uint64_t, double>>;
+using GetManagedPropertyType =
+    boost::container::flat_map<std::string, dbus::utility::DbusVariantType>;
 
 using GetManagedObjectsType = boost::container::flat_map<
     sdbusplus::message::object_path,
@@ -736,8 +736,8 @@
                 return task::completed;
             }
             std::vector<std::pair<
-                std::string,
-                std::vector<std::pair<std::string, std::variant<std::string>>>>>
+                std::string, std::vector<std::pair<
+                                 std::string, dbus::utility::DbusVariantType>>>>
                 interfacesList;
 
             sdbusplus::message::object_path objPath;
@@ -900,7 +900,8 @@
 }
 
 inline static void parseCrashdumpParameters(
-    const std::vector<std::pair<std::string, VariantType>>& params,
+    const std::vector<std::pair<std::string, dbus::utility::DbusVariantType>>&
+        params,
     std::string& filename, std::string& timestamp, std::string& logfile)
 {
     for (auto property : params)
@@ -1670,7 +1671,7 @@
                     "/xyz/openbmc_project/logging/entry/" + entryId,
                     "org.freedesktop.DBus.Properties", "Set",
                     "xyz.openbmc_project.Logging.Entry", "Resolved",
-                    std::variant<bool>(*resolved));
+                    dbus::utility::DbusVariantType(*resolved));
             });
 
     BMCWEB_ROUTE(
@@ -2638,7 +2639,9 @@
     auto getStoredLogCallback =
         [asyncResp, logID, &logEntryJson](
             const boost::system::error_code ec,
-            const std::vector<std::pair<std::string, VariantType>>& params) {
+            const std::vector<
+                std::pair<std::string, dbus::utility::DbusVariantType>>&
+                params) {
             if (ec)
             {
                 BMCWEB_LOG_DEBUG << "failed to get log ec: " << ec.message();
@@ -2799,7 +2802,8 @@
                 auto getStoredLogCallback =
                     [asyncResp, logID, fileName](
                         const boost::system::error_code ec,
-                        const std::vector<std::pair<std::string, VariantType>>&
+                        const std::vector<std::pair<
+                            std::string, dbus::utility::DbusVariantType>>&
                             resp) {
                         if (ec)
                         {
@@ -3318,7 +3322,7 @@
     crow::connections::systemBus->async_method_call(
         [aResp, entryCount, skip,
          top](const boost::system::error_code ec,
-              const std::variant<uint16_t>& bootCount) {
+              const dbus::utility::DbusVariantType& bootCount) {
             if (ec)
             {
                 BMCWEB_LOG_DEBUG << "DBUS response error " << ec;
diff --git a/redfish-core/lib/managers.hpp b/redfish-core/lib/managers.hpp
index ca5d8c5..7e5b272 100644
--- a/redfish-core/lib/managers.hpp
+++ b/redfish-core/lib/managers.hpp
@@ -50,7 +50,7 @@
     const char* destProperty = "RequestedBMCTransition";
 
     // Create the D-Bus variant for D-Bus call.
-    VariantType dbusPropertyValue(propertyValue);
+    dbus::utility::DbusVariantType dbusPropertyValue(propertyValue);
 
     crow::connections::systemBus->async_method_call(
         [asyncResp](const boost::system::error_code ec) {
@@ -79,7 +79,7 @@
     const char* destProperty = "RequestedBMCTransition";
 
     // Create the D-Bus variant for D-Bus call.
-    VariantType dbusPropertyValue(propertyValue);
+    dbus::utility::DbusVariantType dbusPropertyValue(propertyValue);
 
     crow::connections::systemBus->async_method_call(
         [asyncResp](const boost::system::error_code ec) {
@@ -1178,11 +1178,11 @@
                 const std::string& path = subtreeLocal[0].first;
                 const std::string& owner = subtreeLocal[0].second[0].first;
                 crow::connections::systemBus->async_method_call(
-                    [path, owner, self](
-                        const boost::system::error_code ec2,
-                        const boost::container::flat_map<
-                            std::string, std::variant<std::vector<std::string>,
-                                                      std::string>>& resp) {
+                    [path, owner,
+                     self](const boost::system::error_code ec2,
+                           const boost::container::flat_map<
+                               std::string, dbus::utility::DbusVariantType>&
+                               resp) {
                         if (ec2)
                         {
                             BMCWEB_LOG_ERROR
@@ -1396,8 +1396,7 @@
                     [self, path, owner](
                         const boost::system::error_code ec2,
                         const boost::container::flat_map<
-                            std::string, std::variant<std::vector<std::string>,
-                                                      std::string>>& r) {
+                            std::string, dbus::utility::DbusVariantType>& r) {
                         if (ec2)
                         {
                             BMCWEB_LOG_ERROR
@@ -1487,7 +1486,7 @@
                 },
                 profileConnection, profilePath,
                 "org.freedesktop.DBus.Properties", "Set", thermalModeIface,
-                "Current", std::variant<std::string>(*profile));
+                "Current", dbus::utility::DbusVariantType(*profile));
         }
 
         for (auto& containerPair : configuration)
@@ -1690,7 +1689,7 @@
 
     crow::connections::systemBus->async_method_call(
         [aResp](const boost::system::error_code ec,
-                const std::variant<std::string>& property) {
+                const dbus::utility::DbusVariantType& property) {
             if (ec)
             {
                 BMCWEB_LOG_DEBUG << "DBUS response error for "
@@ -1722,7 +1721,7 @@
 
     crow::connections::systemBus->async_method_call(
         [aResp](const boost::system::error_code ec,
-                std::variant<uint64_t>& lastResetTime) {
+                dbus::utility::DbusVariantType& lastResetTime) {
             if (ec)
             {
                 BMCWEB_LOG_DEBUG << "D-BUS response error " << ec;
@@ -1853,7 +1852,7 @@
                 "/xyz/openbmc_project/software/" + firmwareId,
                 "org.freedesktop.DBus.Properties", "Set",
                 "xyz.openbmc_project.Software.RedundancyPriority", "Priority",
-                std::variant<uint8_t>(static_cast<uint8_t>(0)));
+                dbus::utility::DbusVariantType(static_cast<uint8_t>(0)));
         },
         "xyz.openbmc_project.Software.BMC.Updater",
         "/xyz/openbmc_project/software", "org.freedesktop.DBus.ObjectManager",
@@ -1898,7 +1897,7 @@
             "xyz.openbmc_project.Time.Manager", "/xyz/openbmc_project/time/bmc",
             "org.freedesktop.DBus.Properties", "Set",
             "xyz.openbmc_project.Time.EpochTime", "Elapsed",
-            std::variant<uint64_t>(durMicroSecs));
+            dbus::utility::DbusVariantType(durMicroSecs));
     }
     else
     {
@@ -2037,7 +2036,7 @@
             {
                 crow::connections::systemBus->async_method_call(
                     [asyncResp](const boost::system::error_code ec,
-                                const std::variant<double>& resp) {
+                                const dbus::utility::DbusVariantType& resp) {
                         if (ec)
                         {
                             BMCWEB_LOG_ERROR << "Error while getting progress";
@@ -2114,9 +2113,9 @@
                             crow::connections::systemBus->async_method_call(
                                 [asyncResp](
                                     const boost::system::error_code ec,
-                                    const std::vector<
-                                        std::pair<std::string,
-                                                  std::variant<std::string>>>&
+                                    const std::vector<std::pair<
+                                        std::string,
+                                        dbus::utility::DbusVariantType>>&
                                         propertiesList) {
                                     if (ec)
                                     {
@@ -2126,7 +2125,7 @@
                                     }
                                     for (const std::pair<
                                              std::string,
-                                             std::variant<std::string>>&
+                                             dbus::utility::DbusVariantType>&
                                              property : propertiesList)
                                     {
                                         const std::string& propertyName =
diff --git a/redfish-core/lib/memory.hpp b/redfish-core/lib/memory.hpp
index 90e54e8..49304e2 100644
--- a/redfish-core/lib/memory.hpp
+++ b/redfish-core/lib/memory.hpp
@@ -19,6 +19,7 @@
 
 #include <app.hpp>
 #include <boost/container/flat_map.hpp>
+#include <dbus_utility.hpp>
 #include <registries/privilege_registry.hpp>
 #include <utils/collection.hpp>
 #include <utils/hex_utils.hpp>
@@ -27,11 +28,8 @@
 namespace redfish
 {
 
-using DimmProperty =
-    std::variant<std::string, std::vector<uint32_t>, std::vector<uint16_t>,
-                 uint64_t, uint32_t, uint16_t, uint8_t, bool>;
-
-using DimmProperties = boost::container::flat_map<std::string, DimmProperty>;
+using DimmProperties =
+    boost::container::flat_map<std::string, dbus::utility::DbusVariantType>;
 
 inline std::string translateMemoryTypeToRedfish(const std::string& memoryType)
 {
@@ -142,9 +140,9 @@
     return "";
 }
 
-inline void dimmPropToHex(const std::shared_ptr<bmcweb::AsyncResp>& aResp,
-                          const char* key,
-                          const std::pair<std::string, DimmProperty>& property)
+inline void dimmPropToHex(
+    const std::shared_ptr<bmcweb::AsyncResp>& aResp, const char* key,
+    const std::pair<std::string, dbus::utility::DbusVariantType>& property)
 {
     const uint16_t* value = std::get_if<uint16_t>(&property.second);
     if (value == nullptr)
@@ -745,8 +743,7 @@
         [aResp{std::move(aResp)}](
             const boost::system::error_code ec,
             const boost::container::flat_map<
-                std::string, std::variant<std::string, uint64_t, uint32_t,
-                                          bool>>& properties) {
+                std::string, dbus::utility::DbusVariantType>& properties) {
             if (ec)
             {
                 BMCWEB_LOG_DEBUG << "DBUS response error";
diff --git a/redfish-core/lib/metric_report.hpp b/redfish-core/lib/metric_report.hpp
index 5ecab77..c36f719 100644
--- a/redfish-core/lib/metric_report.hpp
+++ b/redfish-core/lib/metric_report.hpp
@@ -4,6 +4,7 @@
 #include "utils/telemetry_utils.hpp"
 
 #include <app.hpp>
+#include <dbus_utility.hpp>
 #include <registries/privilege_registry.hpp>
 
 namespace redfish
@@ -34,7 +35,7 @@
 }
 
 inline bool fillReport(nlohmann::json& json, const std::string& id,
-                       const std::variant<TimestampReadings>& var)
+                       const dbus::utility::DbusVariantType& var)
 {
     json["@odata.type"] = "#MetricReport.v1_3_0.MetricReport";
     json["@odata.id"] = telemetry::metricReportUri + std::string("/") + id;
@@ -107,8 +108,7 @@
                         crow::connections::systemBus->async_method_call(
                             [asyncResp,
                              id](const boost::system::error_code ec,
-                                 const std::variant<
-                                     telemetry::TimestampReadings>& ret) {
+                                 const dbus::utility::DbusVariantType& ret) {
                                 if (ec)
                                 {
                                     BMCWEB_LOG_ERROR
diff --git a/redfish-core/lib/metric_report_definition.hpp b/redfish-core/lib/metric_report_definition.hpp
index cb38633..1461fd8 100644
--- a/redfish-core/lib/metric_report_definition.hpp
+++ b/redfish-core/lib/metric_report_definition.hpp
@@ -6,6 +6,7 @@
 
 #include <app.hpp>
 #include <boost/container/flat_map.hpp>
+#include <dbus_utility.hpp>
 #include <registries/privilege_registry.hpp>
 
 #include <tuple>
@@ -23,9 +24,8 @@
 
 inline void fillReportDefinition(
     const std::shared_ptr<bmcweb::AsyncResp>& asyncResp, const std::string& id,
-    const std::vector<
-        std::pair<std::string, std::variant<std::string, bool, uint64_t,
-                                            ReadingParameters>>>& ret)
+    const std::vector<std::pair<std::string, dbus::utility::DbusVariantType>>&
+        ret)
 {
     asyncResp->res.jsonValue["@odata.type"] =
         "#MetricReportDefinition.v1_3_0.MetricReportDefinition";
@@ -421,12 +421,11 @@
                const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
                const std::string& id) {
                 crow::connections::systemBus->async_method_call(
-                    [asyncResp, id](
-                        const boost::system::error_code ec,
-                        const std::vector<std::pair<
-                            std::string,
-                            std::variant<std::string, bool, uint64_t,
-                                         telemetry::ReadingParameters>>>& ret) {
+                    [asyncResp,
+                     id](const boost::system::error_code ec,
+                         const std::vector<std::pair<
+                             std::string, dbus::utility::DbusVariantType>>&
+                             ret) {
                         if (ec.value() == EBADR ||
                             ec == boost::system::errc::host_unreachable)
                         {
diff --git a/redfish-core/lib/network_protocol.hpp b/redfish-core/lib/network_protocol.hpp
index 9acf5d4..e7411ac 100644
--- a/redfish-core/lib/network_protocol.hpp
+++ b/redfish-core/lib/network_protocol.hpp
@@ -20,6 +20,7 @@
 #include "redfish_util.hpp"
 
 #include <app.hpp>
+#include <dbus_utility.hpp>
 #include <registries/privilege_registry.hpp>
 #include <utils/json_utils.hpp>
 #include <utils/stl_utils.hpp>
@@ -231,7 +232,7 @@
         "xyz.openbmc_project.Settings", "/xyz/openbmc_project/time/sync_method",
         "org.freedesktop.DBus.Properties", "Set",
         "xyz.openbmc_project.Time.Synchronization", "TimeSyncMethod",
-        std::variant<std::string>{timeSyncMethod});
+        dbus::utility::DbusVariantType{timeSyncMethod});
 }
 
 inline void
@@ -283,7 +284,7 @@
                             service, objectPath,
                             "org.freedesktop.DBus.Properties", "Set", interface,
                             "NTPServers",
-                            std::variant<std::vector<std::string>>{ntpServers});
+                            dbus::utility::DbusVariantType{ntpServers});
                     }
                 }
             }
@@ -326,7 +327,8 @@
                         entry.second.begin()->first, entry.first,
                         "org.freedesktop.DBus.Properties", "Set",
                         "xyz.openbmc_project.Control.Service.Attributes",
-                        "Running", std::variant<bool>{protocolEnabled});
+                        "Running",
+                        dbus::utility::DbusVariantType{protocolEnabled});
 
                     crow::connections::systemBus->async_method_call(
                         [asyncResp](const boost::system::error_code ec2) {
@@ -339,7 +341,8 @@
                         entry.second.begin()->first, entry.first,
                         "org.freedesktop.DBus.Properties", "Set",
                         "xyz.openbmc_project.Control.Service.Attributes",
-                        "Enabled", std::variant<bool>{protocolEnabled});
+                        "Enabled",
+                        dbus::utility::DbusVariantType{protocolEnabled});
                 }
             }
         },
@@ -368,7 +371,7 @@
 {
     crow::connections::systemBus->async_method_call(
         [asyncResp](const boost::system::error_code errorCode,
-                    const std::variant<std::string>& timeSyncMethod) {
+                    const dbus::utility::DbusVariantType& timeSyncMethod) {
             if (errorCode)
             {
                 return;
diff --git a/redfish-core/lib/pcie.hpp b/redfish-core/lib/pcie.hpp
index 1872c02..1904c26 100644
--- a/redfish-core/lib/pcie.hpp
+++ b/redfish-core/lib/pcie.hpp
@@ -18,6 +18,7 @@
 
 #include <app.hpp>
 #include <boost/system/linux_error.hpp>
+#include <dbus_utility.hpp>
 #include <registries/privilege_registry.hpp>
 
 namespace redfish
@@ -143,76 +144,93 @@
                const std::string& device)
 
             {
-                auto getPCIeDeviceCallback = [asyncResp, device](
-                                                 const boost::system::error_code
-                                                     ec,
-                                                 boost::container::flat_map<
-                                                     std::string,
-                                                     std::variant<std::string>>&
-                                                     pcieDevProperties) {
-                    if (ec)
-                    {
-                        BMCWEB_LOG_DEBUG
-                            << "failed to get PCIe Device properties ec: "
-                            << ec.value() << ": " << ec.message();
-                        if (ec.value() ==
-                            boost::system::linux_error::bad_request_descriptor)
+                auto getPCIeDeviceCallback =
+                    [asyncResp,
+                     device](const boost::system::error_code ec,
+                             boost::container::flat_map<
+                                 std::string, dbus::utility::DbusVariantType>&
+                                 pcieDevProperties) {
+                        if (ec)
                         {
-                            messages::resourceNotFound(asyncResp->res,
-                                                       "PCIeDevice", device);
-                        }
-                        else
-                        {
-                            messages::internalError(asyncResp->res);
-                        }
-                        return;
-                    }
-
-                    asyncResp->res.jsonValue = {
-                        {"@odata.type", "#PCIeDevice.v1_4_0.PCIeDevice"},
-                        {"@odata.id",
-                         "/redfish/v1/Systems/system/PCIeDevices/" + device},
-                        {"Name", "PCIe Device"},
-                        {"Id", device}};
-
-                    if (std::string* property = std::get_if<std::string>(
-                            &pcieDevProperties["Manufacturer"]);
-                        property)
-                    {
-                        asyncResp->res.jsonValue["Manufacturer"] = *property;
-                    }
-
-                    if (std::string* property = std::get_if<std::string>(
-                            &pcieDevProperties["DeviceType"]);
-                        property)
-                    {
-                        asyncResp->res.jsonValue["DeviceType"] = *property;
-                    }
-
-                    if (std::string* property = std::get_if<std::string>(
-                            &pcieDevProperties["GenerationInUse"]);
-                        property)
-                    {
-                        std::optional<std::string> generationInUse =
-                            redfishPcieGenerationFromDbus(*property);
-                        if (!generationInUse)
-                        {
-                            messages::internalError(asyncResp->res);
+                            BMCWEB_LOG_DEBUG
+                                << "failed to get PCIe Device properties ec: "
+                                << ec.value() << ": " << ec.message();
+                            if (ec.value() == boost::system::linux_error::
+                                                  bad_request_descriptor)
+                            {
+                                messages::resourceNotFound(
+                                    asyncResp->res, "PCIeDevice", device);
+                            }
+                            else
+                            {
+                                messages::internalError(asyncResp->res);
+                            }
                             return;
                         }
-                        if (*generationInUse == "")
+
+                        asyncResp->res.jsonValue = {
+                            {"@odata.type", "#PCIeDevice.v1_4_0.PCIeDevice"},
+                            {"@odata.id",
+                             "/redfish/v1/Systems/system/PCIeDevices/" +
+                                 device},
+                            {"Name", "PCIe Device"},
+                            {"Id", device}};
+
+                        if (std::string* property = std::get_if<std::string>(
+                                &pcieDevProperties["Manufacturer"]);
+                            property)
                         {
-                            // unknown, no need to handle
-                            return;
+                            asyncResp->res.jsonValue["Manufacturer"] =
+                                *property;
                         }
-                        asyncResp->res.jsonValue["PCIeInterface"]["PcieType"] =
-                            *generationInUse;
-                    }
-                    asyncResp->res.jsonValue["PCIeFunctions"] = {
-                        {"@odata.id",
-                         "/redfish/v1/Systems/system/PCIeDevices/" + device +
-                             "/PCIeFunctions"}};
-                };
+
+                        if (std::string* property = std::get_if<std::string>(
+                                &pcieDevProperties["DeviceType"]);
+                            property)
+                        {
+                            asyncResp->res.jsonValue["DeviceType"] = *property;
+                        }
+
+                        if (std::string* property = std::get_if<std::string>(
+                                &pcieDevProperties["Manufacturer"]);
+                            property)
+                        {
+                            asyncResp->res.jsonValue["Manufacturer"] =
+                                *property;
+                        }
+
+                        if (std::string* property = std::get_if<std::string>(
+                                &pcieDevProperties["DeviceType"]);
+                            property)
+                        {
+                            asyncResp->res.jsonValue["DeviceType"] = *property;
+                        }
+
+                        if (std::string* property = std::get_if<std::string>(
+                                &pcieDevProperties["GenerationInUse"]);
+                            property)
+                        {
+                            std::optional<std::string> generationInUse =
+                                redfishPcieGenerationFromDbus(*property);
+                            if (!generationInUse)
+                            {
+                                messages::internalError(asyncResp->res);
+                                return;
+                            }
+                            if (*generationInUse == "")
+                            {
+                                // unknown, no need to handle
+                                return;
+                            }
+                            asyncResp->res
+                                .jsonValue["PCIeInterface"]["PcieType"] =
+                                *generationInUse;
+                        }
+                        asyncResp->res.jsonValue["PCIeFunctions"] = {
+                            {"@odata.id",
+                             "/redfish/v1/Systems/system/PCIeDevices/" +
+                                 device + "/PCIeFunctions"}};
+                    };
                 std::string escapedPath = std::string(pciePath) + "/" + device;
                 dbus::utility::escapePathForDbus(escapedPath);
                 crow::connections::systemBus->async_method_call(
@@ -250,7 +268,8 @@
                                                      ec,
                                                  boost::container::flat_map<
                                                      std::string,
-                                                     std::variant<std::string>>&
+                                                     dbus::utility::
+                                                         DbusVariantType>&
                                                      pcieDevProperties) {
                     if (ec)
                     {
@@ -317,116 +336,121 @@
                                                   bmcweb::AsyncResp>& asyncResp,
                                               const std::string& device,
                                               const std::string& function) {
-            auto getPCIeDeviceCallback = [asyncResp, device, function](
-                                             const boost::system::error_code ec,
-                                             boost::container::flat_map<
-                                                 std::string,
-                                                 std::variant<std::string>>&
-                                                 pcieDevProperties) {
-                if (ec)
-                {
-                    BMCWEB_LOG_DEBUG
-                        << "failed to get PCIe Device properties ec: "
-                        << ec.value() << ": " << ec.message();
-                    if (ec.value() ==
-                        boost::system::linux_error::bad_request_descriptor)
+            auto getPCIeDeviceCallback =
+                [asyncResp, device, function](
+                    const boost::system::error_code ec,
+                    boost::container::flat_map<std::string,
+                                               dbus::utility::DbusVariantType>&
+                        pcieDevProperties) {
+                    if (ec)
                     {
-                        messages::resourceNotFound(asyncResp->res, "PCIeDevice",
-                                                   device);
+                        BMCWEB_LOG_DEBUG
+                            << "failed to get PCIe Device properties ec: "
+                            << ec.value() << ": " << ec.message();
+                        if (ec.value() ==
+                            boost::system::linux_error::bad_request_descriptor)
+                        {
+                            messages::resourceNotFound(asyncResp->res,
+                                                       "PCIeDevice", device);
+                        }
+                        else
+                        {
+                            messages::internalError(asyncResp->res);
+                        }
+                        return;
                     }
-                    else
+
+                    // Check if this function exists by looking for a device ID
+                    std::string devIDProperty =
+                        "Function" + function + "DeviceId";
+                    if (std::string* property = std::get_if<std::string>(
+                            &pcieDevProperties[devIDProperty]);
+                        property && property->empty())
                     {
-                        messages::internalError(asyncResp->res);
+                        messages::resourceNotFound(asyncResp->res,
+                                                   "PCIeFunction", function);
+                        return;
                     }
-                    return;
-                }
 
-                // Check if this function exists by looking for a device ID
-                std::string devIDProperty = "Function" + function + "DeviceId";
-                if (std::string* property = std::get_if<std::string>(
-                        &pcieDevProperties[devIDProperty]);
-                    property && property->empty())
-                {
-                    messages::resourceNotFound(asyncResp->res, "PCIeFunction",
-                                               function);
-                    return;
-                }
+                    asyncResp->res.jsonValue = {
+                        {"@odata.type", "#PCIeFunction.v1_2_0.PCIeFunction"},
+                        {"@odata.id",
+                         "/redfish/v1/Systems/system/PCIeDevices/" + device +
+                             "/PCIeFunctions/" + function},
+                        {"Name", "PCIe Function"},
+                        {"Id", function},
+                        {"FunctionId", std::stoi(function)},
+                        {"Links",
+                         {{"PCIeDevice",
+                           {{"@odata.id",
+                             "/redfish/v1/Systems/system/PCIeDevices/" +
+                                 device}}}}}};
 
-                asyncResp->res.jsonValue = {
-                    {"@odata.type", "#PCIeFunction.v1_2_0.PCIeFunction"},
-                    {"@odata.id", "/redfish/v1/Systems/system/PCIeDevices/" +
-                                      device + "/PCIeFunctions/" + function},
-                    {"Name", "PCIe Function"},
-                    {"Id", function},
-                    {"FunctionId", std::stoi(function)},
-                    {"Links",
-                     {{"PCIeDevice",
-                       {{"@odata.id",
-                         "/redfish/v1/Systems/system/PCIeDevices/" +
-                             device}}}}}};
+                    if (std::string* property = std::get_if<std::string>(
+                            &pcieDevProperties["Function" + function +
+                                               "DeviceId"]);
+                        property)
+                    {
+                        asyncResp->res.jsonValue["DeviceId"] = *property;
+                    }
 
-                if (std::string* property = std::get_if<std::string>(
-                        &pcieDevProperties["Function" + function + "DeviceId"]);
-                    property)
-                {
-                    asyncResp->res.jsonValue["DeviceId"] = *property;
-                }
+                    if (std::string* property = std::get_if<std::string>(
+                            &pcieDevProperties["Function" + function +
+                                               "VendorId"]);
+                        property)
+                    {
+                        asyncResp->res.jsonValue["VendorId"] = *property;
+                    }
 
-                if (std::string* property = std::get_if<std::string>(
-                        &pcieDevProperties["Function" + function + "VendorId"]);
-                    property)
-                {
-                    asyncResp->res.jsonValue["VendorId"] = *property;
-                }
+                    if (std::string* property = std::get_if<std::string>(
+                            &pcieDevProperties["Function" + function +
+                                               "FunctionType"]);
+                        property)
+                    {
+                        asyncResp->res.jsonValue["FunctionType"] = *property;
+                    }
 
-                if (std::string* property = std::get_if<std::string>(
-                        &pcieDevProperties["Function" + function +
-                                           "FunctionType"]);
-                    property)
-                {
-                    asyncResp->res.jsonValue["FunctionType"] = *property;
-                }
+                    if (std::string* property = std::get_if<std::string>(
+                            &pcieDevProperties["Function" + function +
+                                               "DeviceClass"]);
+                        property)
+                    {
+                        asyncResp->res.jsonValue["DeviceClass"] = *property;
+                    }
 
-                if (std::string* property = std::get_if<std::string>(
-                        &pcieDevProperties["Function" + function +
-                                           "DeviceClass"]);
-                    property)
-                {
-                    asyncResp->res.jsonValue["DeviceClass"] = *property;
-                }
+                    if (std::string* property = std::get_if<std::string>(
+                            &pcieDevProperties["Function" + function +
+                                               "ClassCode"]);
+                        property)
+                    {
+                        asyncResp->res.jsonValue["ClassCode"] = *property;
+                    }
 
-                if (std::string* property = std::get_if<std::string>(
-                        &pcieDevProperties["Function" + function +
-                                           "ClassCode"]);
-                    property)
-                {
-                    asyncResp->res.jsonValue["ClassCode"] = *property;
-                }
+                    if (std::string* property = std::get_if<std::string>(
+                            &pcieDevProperties["Function" + function +
+                                               "RevisionId"]);
+                        property)
+                    {
+                        asyncResp->res.jsonValue["RevisionId"] = *property;
+                    }
 
-                if (std::string* property = std::get_if<std::string>(
-                        &pcieDevProperties["Function" + function +
-                                           "RevisionId"]);
-                    property)
-                {
-                    asyncResp->res.jsonValue["RevisionId"] = *property;
-                }
+                    if (std::string* property = std::get_if<std::string>(
+                            &pcieDevProperties["Function" + function +
+                                               "SubsystemId"]);
+                        property)
+                    {
+                        asyncResp->res.jsonValue["SubsystemId"] = *property;
+                    }
 
-                if (std::string* property = std::get_if<std::string>(
-                        &pcieDevProperties["Function" + function +
-                                           "SubsystemId"]);
-                    property)
-                {
-                    asyncResp->res.jsonValue["SubsystemId"] = *property;
-                }
-
-                if (std::string* property = std::get_if<std::string>(
-                        &pcieDevProperties["Function" + function +
-                                           "SubsystemVendorId"]);
-                    property)
-                {
-                    asyncResp->res.jsonValue["SubsystemVendorId"] = *property;
-                }
-            };
+                    if (std::string* property = std::get_if<std::string>(
+                            &pcieDevProperties["Function" + function +
+                                               "SubsystemVendorId"]);
+                        property)
+                    {
+                        asyncResp->res.jsonValue["SubsystemVendorId"] =
+                            *property;
+                    }
+                };
             std::string escapedPath = std::string(pciePath) + "/" + device;
             dbus::utility::escapePathForDbus(escapedPath);
             crow::connections::systemBus->async_method_call(
diff --git a/redfish-core/lib/power.hpp b/redfish-core/lib/power.hpp
index d7fb7dd..dea6be3 100644
--- a/redfish-core/lib/power.hpp
+++ b/redfish-core/lib/power.hpp
@@ -19,6 +19,7 @@
 #include "sensors.hpp"
 
 #include <app.hpp>
+#include <dbus_utility.hpp>
 #include <registries/privilege_registry.hpp>
 
 namespace redfish
@@ -70,7 +71,8 @@
         }
         auto valueHandler = [value, sensorsAsyncResp](
                                 const boost::system::error_code ec,
-                                const SensorVariant& powerCapEnable) {
+                                const dbus::utility::DbusVariantType&
+                                    powerCapEnable) {
             if (ec)
             {
                 messages::internalError(sensorsAsyncResp->asyncResp->res);
@@ -112,7 +114,7 @@
                 "/xyz/openbmc_project/control/host0/power_cap",
                 "org.freedesktop.DBus.Properties", "Set",
                 "xyz.openbmc_project.Control.Power.Cap", "PowerCap",
-                std::variant<uint32_t>(*value));
+                dbus::utility::DbusVariantType(*value));
         };
         crow::connections::systemBus->async_method_call(
             std::move(valueHandler), "xyz.openbmc_project.Settings",
@@ -127,80 +129,81 @@
 
     BMCWEB_ROUTE(app, "/redfish/v1/Chassis/<str>/Power/")
         .privileges(redfish::privileges::getPower)
-        .methods(boost::beast::http::verb::get)(
-            [](const crow::Request&,
-               const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
-               const std::string& chassisName) {
-                asyncResp->res.jsonValue["PowerControl"] =
-                    nlohmann::json::array();
+        .methods(
+            boost::beast::http::verb::get)([](const crow::Request&,
+                                              const std::shared_ptr<
+                                                  bmcweb::AsyncResp>& asyncResp,
+                                              const std::string& chassisName) {
+            asyncResp->res.jsonValue["PowerControl"] = nlohmann::json::array();
 
-                auto sensorAsyncResp = std::make_shared<SensorsAsyncResp>(
-                    asyncResp, chassisName,
-                    sensors::dbus::paths.at(sensors::node::power),
-                    sensors::node::power);
+            auto sensorAsyncResp = std::make_shared<SensorsAsyncResp>(
+                asyncResp, chassisName,
+                sensors::dbus::paths.at(sensors::node::power),
+                sensors::node::power);
 
-                getChassisData(sensorAsyncResp);
+            getChassisData(sensorAsyncResp);
 
-                // This callback verifies that the power limit is only provided
-                // for the chassis that implements the Chassis inventory item.
-                // This prevents things like power supplies providing the
-                // chassis power limit
-                auto chassisHandler = [sensorAsyncResp](
-                                          const boost::system::error_code e,
-                                          const std::vector<std::string>&
-                                              chassisPaths) {
-                    if (e)
+            // This callback verifies that the power limit is only provided
+            // for the chassis that implements the Chassis inventory item.
+            // This prevents things like power supplies providing the
+            // chassis power limit
+            auto chassisHandler = [sensorAsyncResp](
+                                      const boost::system::error_code e,
+                                      const std::vector<std::string>&
+                                          chassisPaths) {
+                if (e)
+                {
+                    BMCWEB_LOG_ERROR
+                        << "Power Limit GetSubTreePaths handler Dbus error "
+                        << e;
+                    return;
+                }
+
+                bool found = false;
+                for (const std::string& chassis : chassisPaths)
+                {
+                    size_t len = std::string::npos;
+                    size_t lastPos = chassis.rfind('/');
+                    if (lastPos == std::string::npos)
                     {
-                        BMCWEB_LOG_ERROR
-                            << "Power Limit GetSubTreePaths handler Dbus error "
-                            << e;
-                        return;
+                        continue;
                     }
 
-                    bool found = false;
-                    for (const std::string& chassis : chassisPaths)
+                    if (lastPos == chassis.size() - 1)
                     {
-                        size_t len = std::string::npos;
-                        size_t lastPos = chassis.rfind('/');
+                        size_t end = lastPos;
+                        lastPos = chassis.rfind('/', lastPos - 1);
                         if (lastPos == std::string::npos)
                         {
                             continue;
                         }
 
-                        if (lastPos == chassis.size() - 1)
-                        {
-                            size_t end = lastPos;
-                            lastPos = chassis.rfind('/', lastPos - 1);
-                            if (lastPos == std::string::npos)
-                            {
-                                continue;
-                            }
-
-                            len = end - (lastPos + 1);
-                        }
-
-                        std::string interfaceChassisName =
-                            chassis.substr(lastPos + 1, len);
-                        if (!interfaceChassisName.compare(
-                                sensorAsyncResp->chassisId))
-                        {
-                            found = true;
-                            break;
-                        }
+                        len = end - (lastPos + 1);
                     }
 
-                    if (!found)
+                    std::string interfaceChassisName =
+                        chassis.substr(lastPos + 1, len);
+                    if (!interfaceChassisName.compare(
+                            sensorAsyncResp->chassisId))
                     {
-                        BMCWEB_LOG_DEBUG << "Power Limit not present for "
-                                         << sensorAsyncResp->chassisId;
-                        return;
+                        found = true;
+                        break;
                     }
+                }
 
-                    auto valueHandler = [sensorAsyncResp](
-                                            const boost::system::error_code ec,
-                                            const std::vector<std::pair<
-                                                std::string, SensorVariant>>&
-                                                properties) {
+                if (!found)
+                {
+                    BMCWEB_LOG_DEBUG << "Power Limit not present for "
+                                     << sensorAsyncResp->chassisId;
+                    return;
+                }
+
+                auto valueHandler =
+                    [sensorAsyncResp](
+                        const boost::system::error_code ec,
+                        const std::vector<std::pair<
+                            std::string, dbus::utility::DbusVariantType>>&
+                            properties) {
                         if (ec)
                         {
                             messages::internalError(
@@ -235,7 +238,8 @@
                         double powerCap = 0.0;
                         int64_t scale = 0;
 
-                        for (const std::pair<std::string, SensorVariant>&
+                        for (const std::pair<std::string,
+                                             dbus::utility::DbusVariantType>&
                                  property : properties)
                         {
                             if (!property.first.compare("Scale"))
@@ -298,23 +302,22 @@
                         }
                     };
 
-                    crow::connections::systemBus->async_method_call(
-                        std::move(valueHandler), "xyz.openbmc_project.Settings",
-                        "/xyz/openbmc_project/control/host0/power_cap",
-                        "org.freedesktop.DBus.Properties", "GetAll",
-                        "xyz.openbmc_project.Control.Power.Cap");
-                };
-
                 crow::connections::systemBus->async_method_call(
-                    std::move(chassisHandler),
-                    "xyz.openbmc_project.ObjectMapper",
-                    "/xyz/openbmc_project/object_mapper",
-                    "xyz.openbmc_project.ObjectMapper", "GetSubTreePaths",
-                    "/xyz/openbmc_project/inventory", 0,
-                    std::array<const char*, 2>{
-                        "xyz.openbmc_project.Inventory.Item.Board",
-                        "xyz.openbmc_project.Inventory.Item.Chassis"});
-            });
+                    std::move(valueHandler), "xyz.openbmc_project.Settings",
+                    "/xyz/openbmc_project/control/host0/power_cap",
+                    "org.freedesktop.DBus.Properties", "GetAll",
+                    "xyz.openbmc_project.Control.Power.Cap");
+            };
+
+            crow::connections::systemBus->async_method_call(
+                std::move(chassisHandler), "xyz.openbmc_project.ObjectMapper",
+                "/xyz/openbmc_project/object_mapper",
+                "xyz.openbmc_project.ObjectMapper", "GetSubTreePaths",
+                "/xyz/openbmc_project/inventory", 0,
+                std::array<const char*, 2>{
+                    "xyz.openbmc_project.Inventory.Item.Board",
+                    "xyz.openbmc_project.Inventory.Item.Chassis"});
+        });
 
     BMCWEB_ROUTE(app, "/redfish/v1/Chassis/<str>/Power/")
         .privileges(redfish::privileges::patchPower)
diff --git a/redfish-core/lib/processor.hpp b/redfish-core/lib/processor.hpp
index e510768..df0d0bb 100644
--- a/redfish-core/lib/processor.hpp
+++ b/redfish-core/lib/processor.hpp
@@ -19,6 +19,7 @@
 
 #include <app.hpp>
 #include <boost/container/flat_map.hpp>
+#include <dbus_utility.hpp>
 #include <registries/privilege_registry.hpp>
 #include <sdbusplus/message/native_types.hpp>
 #include <sdbusplus/utility/dedup_variant.hpp>
@@ -59,9 +60,9 @@
 {
     BMCWEB_LOG_DEBUG << "Get Processor UUID";
     crow::connections::systemBus->async_method_call(
-        [objPath,
-         aResp{std::move(aResp)}](const boost::system::error_code ec,
-                                  const std::variant<std::string>& property) {
+        [objPath, aResp{std::move(aResp)}](
+            const boost::system::error_code ec,
+            const dbus::utility::DbusVariantType& property) {
             if (ec)
             {
                 BMCWEB_LOG_DEBUG << "DBUS response error";
@@ -303,8 +304,7 @@
         [objPath, aResp{std::move(aResp)}](
             const boost::system::error_code ec,
             const boost::container::flat_map<
-                std::string, std::variant<std::string, uint32_t, uint16_t,
-                                          bool>>& properties) {
+                std::string, dbus::utility::DbusVariantType>& properties) {
             if (ec)
             {
                 BMCWEB_LOG_DEBUG << "DBUS response error";
@@ -395,8 +395,7 @@
         [objPath, aResp{std::move(aResp)}](
             const boost::system::error_code ec,
             const boost::container::flat_map<
-                std::string, std::variant<std::string, uint32_t, uint16_t,
-                                          bool>>& properties) {
+                std::string, dbus::utility::DbusVariantType>& properties) {
             if (ec)
             {
                 BMCWEB_LOG_DEBUG << "DBUS response error";
@@ -432,8 +431,7 @@
         [acclrtrId, aResp{std::move(aResp)}](
             const boost::system::error_code ec,
             const boost::container::flat_map<
-                std::string, std::variant<std::string, uint32_t, uint16_t,
-                                          bool>>& properties) {
+                std::string, dbus::utility::DbusVariantType>& properties) {
             if (ec)
             {
                 BMCWEB_LOG_DEBUG << "DBUS response error";
@@ -486,10 +484,8 @@
     std::vector<std::tuple<uint32_t, std::vector<uint32_t>>>;
 // uint32_t and size_t may or may not be the same type, requiring a dedup'd
 // variant
-using OperatingConfigProperties = std::vector<std::pair<
-    std::string,
-    sdbusplus::utility::dedup_variant_t<uint32_t, size_t, TurboProfileProperty,
-                                        BaseSpeedPrioritySettingsProperty>>>;
+using OperatingConfigProperties =
+    std::vector<std::pair<std::string, dbus::utility::DbusVariantType>>;
 
 /**
  * Fill out the HighSpeedCoreIDs in a Processor resource from the given
@@ -551,10 +547,8 @@
     crow::connections::systemBus->async_method_call(
         [aResp, cpuId, service](
             const boost::system::error_code ec,
-            const std::vector<
-                std::pair<std::string,
-                          std::variant<sdbusplus::message::object_path, bool>>>&
-                properties) {
+            const std::vector<std::pair<
+                std::string, dbus::utility::DbusVariantType>>& properties) {
             if (ec)
             {
                 BMCWEB_LOG_WARNING << "D-Bus error: " << ec << ", "
@@ -604,8 +598,7 @@
                     crow::connections::systemBus->async_method_call(
                         [aResp](
                             const boost::system::error_code ec,
-                            const std::variant<
-                                BaseSpeedPrioritySettingsProperty>& property) {
+                            const dbus::utility::DbusVariantType& property) {
                             if (ec)
                             {
                                 BMCWEB_LOG_WARNING
@@ -655,9 +648,9 @@
 {
     BMCWEB_LOG_DEBUG << "Get Cpu Location Data";
     crow::connections::systemBus->async_method_call(
-        [objPath,
-         aResp{std::move(aResp)}](const boost::system::error_code ec,
-                                  const std::variant<std::string>& property) {
+        [objPath, aResp{std::move(aResp)}](
+            const boost::system::error_code ec,
+            const dbus::utility::DbusVariantType& property) {
             if (ec)
             {
                 BMCWEB_LOG_DEBUG << "DBUS response error";
@@ -697,7 +690,7 @@
     BMCWEB_LOG_DEBUG << "Get CPU UniqueIdentifier";
     crow::connections::systemBus->async_method_call(
         [aResp](boost::system::error_code ec,
-                const std::variant<std::string>& property) {
+                const dbus::utility::DbusVariantType& property) {
             const std::string* id = std::get_if<std::string>(&property);
             if (ec || id == nullptr)
             {
@@ -1090,8 +1083,7 @@
         },
         *controlService, cpuObjectPath, "org.freedesktop.DBus.Properties",
         "Set", "xyz.openbmc_project.Control.Processor.CurrentOperatingConfig",
-        "AppliedConfig",
-        std::variant<sdbusplus::message::object_path>(std::move(configPath)));
+        "AppliedConfig", dbus::utility::DbusVariantType(std::move(configPath)));
 }
 
 inline void requestRoutesOperatingConfigCollection(App& app)
diff --git a/redfish-core/lib/redfish_util.hpp b/redfish-core/lib/redfish_util.hpp
index 7345f01..c0835b3 100644
--- a/redfish-core/lib/redfish_util.hpp
+++ b/redfish-core/lib/redfish_util.hpp
@@ -16,6 +16,7 @@
 #pragma once
 #ifndef BMCWEB_ENABLE_REDFISH_ONE_CHASSIS
 
+#include <dbus_utility.hpp>
 namespace redfish
 {
 
@@ -172,8 +173,7 @@
     crow::connections::systemBus->async_method_call(
         [callback{std::move(callback)}](
             const boost::system::error_code ec,
-            const std::variant<
-                std::vector<std::tuple<std::string, std::string>>>& resp) {
+            const dbus::utility::DbusVariantType& resp) {
             if (ec)
             {
                 BMCWEB_LOG_ERROR << ec;
diff --git a/redfish-core/lib/roles.hpp b/redfish-core/lib/roles.hpp
index 8f14b2e..5aa1a22 100644
--- a/redfish-core/lib/roles.hpp
+++ b/redfish-core/lib/roles.hpp
@@ -16,6 +16,7 @@
 #pragma once
 
 #include <app.hpp>
+#include <dbus_utility.hpp>
 #include <registries/privilege_registry.hpp>
 
 #include <variant>
@@ -114,9 +115,8 @@
                     {"Description", "BMC User Roles"}};
 
                 crow::connections::systemBus->async_method_call(
-                    [asyncResp](
-                        const boost::system::error_code ec,
-                        const std::variant<std::vector<std::string>>& resp) {
+                    [asyncResp](const boost::system::error_code ec,
+                                const dbus::utility::DbusVariantType& resp) {
                         if (ec)
                         {
                             messages::internalError(asyncResp->res);
diff --git a/redfish-core/lib/sensors.hpp b/redfish-core/lib/sensors.hpp
index eba0652..2f04c25 100644
--- a/redfish-core/lib/sensors.hpp
+++ b/redfish-core/lib/sensors.hpp
@@ -21,6 +21,7 @@
 #include <boost/container/flat_map.hpp>
 #include <boost/range/algorithm/replace_copy_if.hpp>
 #include <dbus_singleton.hpp>
+#include <dbus_utility.hpp>
 #include <registries/privilege_registry.hpp>
 #include <utils/json_utils.hpp>
 
@@ -35,13 +36,11 @@
     std::pair<std::string,
               std::vector<std::pair<std::string, std::vector<std::string>>>>>;
 
-using SensorVariant =
-    std::variant<int64_t, double, uint32_t, bool, std::string>;
-
 using ManagedObjectsVectorType = std::vector<std::pair<
     sdbusplus::message::object_path,
     boost::container::flat_map<
-        std::string, boost::container::flat_map<std::string, SensorVariant>>>>;
+        std::string, boost::container::flat_map<
+                         std::string, dbus::utility::DbusVariantType>>>>;
 
 namespace sensors
 {
@@ -596,8 +595,7 @@
         crow::connections::systemBus->async_method_call(
             [sensorsAsyncResp, callback{std::move(callback)}](
                 const boost::system::error_code& e,
-                const std::variant<std::vector<std::string>>&
-                    variantEndpoints) {
+                const dbus::utility::DbusVariantType& variantEndpoints) {
                 if (e)
                 {
                     if (e.value() != EBADR)
@@ -742,7 +740,8 @@
 inline std::string getHealth(
     nlohmann::json& sensorJson,
     const boost::container::flat_map<
-        std::string, boost::container::flat_map<std::string, SensorVariant>>&
+        std::string, boost::container::flat_map<
+                         std::string, dbus::utility::DbusVariantType>>&
         interfacesDict,
     const InventoryItem* inventoryItem)
 {
@@ -895,7 +894,8 @@
     const std::string& sensorName, const std::string& sensorType,
     const std::shared_ptr<SensorsAsyncResp>& sensorsAsyncResp,
     const boost::container::flat_map<
-        std::string, boost::container::flat_map<std::string, SensorVariant>>&
+        std::string, boost::container::flat_map<
+                         std::string, dbus::utility::DbusVariantType>>&
         interfacesDict,
     nlohmann::json& sensorJson, InventoryItem* inventoryItem)
 {
@@ -1101,7 +1101,8 @@
             auto thisValueIt = interfaceProperties->second.find(std::get<1>(p));
             if (thisValueIt != interfaceProperties->second.end())
             {
-                const SensorVariant& valueVariant = thisValueIt->second;
+                const dbus::utility::DbusVariantType& valueVariant =
+                    thisValueIt->second;
 
                 // The property we want to set may be nested json, so use
                 // a json_pointer for easy indexing into the json structure.
@@ -1179,7 +1180,7 @@
                 crow::connections::systemBus->async_method_call(
                     [path, owner,
                      sensorsAsyncResp](const boost::system::error_code e,
-                                       std::variant<std::vector<std::string>>
+                                       const dbus::utility::DbusVariantType&
                                            variantEndpoints) {
                         if (e)
                         {
@@ -1215,9 +1216,7 @@
                                 const boost::system::error_code& err,
                                 const boost::container::flat_map<
                                     std::string,
-                                    std::variant<uint8_t,
-                                                 std::vector<std::string>,
-                                                 std::string>>& ret) {
+                                    dbus::utility::DbusVariantType>& ret) {
                                 if (err)
                                 {
                                     return; // don't have to have this
@@ -1511,7 +1510,8 @@
 inline void storeInventoryItemData(
     InventoryItem& inventoryItem,
     const boost::container::flat_map<
-        std::string, boost::container::flat_map<std::string, SensorVariant>>&
+        std::string, boost::container::flat_map<
+                         std::string, dbus::utility::DbusVariantType>>&
         interfacesDict)
 {
     // Get properties from Inventory.Item interface
@@ -2013,61 +2013,61 @@
         const std::string& ledPath = (*it).first;
         const std::string& ledConnection = (*it).second;
         // Response handler for Get State property
-        auto respHandler =
-            [sensorsAsyncResp, inventoryItems, ledConnections, ledPath,
-             callback{std::move(callback)},
-             ledConnectionsIndex](const boost::system::error_code ec,
-                                  const std::variant<std::string>& ledState) {
-                BMCWEB_LOG_DEBUG << "getInventoryLedData respHandler enter";
-                if (ec)
-                {
-                    BMCWEB_LOG_ERROR
-                        << "getInventoryLedData respHandler DBus error " << ec;
-                    messages::internalError(sensorsAsyncResp->asyncResp->res);
-                    return;
-                }
+        auto respHandler = [sensorsAsyncResp, inventoryItems, ledConnections,
+                            ledPath, callback{std::move(callback)},
+                            ledConnectionsIndex](
+                               const boost::system::error_code ec,
+                               const dbus::utility::DbusVariantType& ledState) {
+            BMCWEB_LOG_DEBUG << "getInventoryLedData respHandler enter";
+            if (ec)
+            {
+                BMCWEB_LOG_ERROR
+                    << "getInventoryLedData respHandler DBus error " << ec;
+                messages::internalError(sensorsAsyncResp->asyncResp->res);
+                return;
+            }
 
-                const std::string* state = std::get_if<std::string>(&ledState);
-                if (state != nullptr)
+            const std::string* state = std::get_if<std::string>(&ledState);
+            if (state != nullptr)
+            {
+                BMCWEB_LOG_DEBUG << "Led state: " << *state;
+                // Find inventory item with this LED object path
+                InventoryItem* inventoryItem =
+                    findInventoryItemForLed(*inventoryItems, ledPath);
+                if (inventoryItem != nullptr)
                 {
-                    BMCWEB_LOG_DEBUG << "Led state: " << *state;
-                    // Find inventory item with this LED object path
-                    InventoryItem* inventoryItem =
-                        findInventoryItemForLed(*inventoryItems, ledPath);
-                    if (inventoryItem != nullptr)
+                    // Store LED state in InventoryItem
+                    if (boost::ends_with(*state, "On"))
                     {
-                        // Store LED state in InventoryItem
-                        if (boost::ends_with(*state, "On"))
-                        {
-                            inventoryItem->ledState = LedState::ON;
-                        }
-                        else if (boost::ends_with(*state, "Blink"))
-                        {
-                            inventoryItem->ledState = LedState::BLINK;
-                        }
-                        else if (boost::ends_with(*state, "Off"))
-                        {
-                            inventoryItem->ledState = LedState::OFF;
-                        }
-                        else
-                        {
-                            inventoryItem->ledState = LedState::UNKNOWN;
-                        }
+                        inventoryItem->ledState = LedState::ON;
+                    }
+                    else if (boost::ends_with(*state, "Blink"))
+                    {
+                        inventoryItem->ledState = LedState::BLINK;
+                    }
+                    else if (boost::ends_with(*state, "Off"))
+                    {
+                        inventoryItem->ledState = LedState::OFF;
+                    }
+                    else
+                    {
+                        inventoryItem->ledState = LedState::UNKNOWN;
                     }
                 }
-                else
-                {
-                    BMCWEB_LOG_DEBUG << "Failed to find State data for LED: "
-                                     << ledPath;
-                }
+            }
+            else
+            {
+                BMCWEB_LOG_DEBUG << "Failed to find State data for LED: "
+                                 << ledPath;
+            }
 
-                // Recurse to get LED data from next connection
-                getInventoryLedData(sensorsAsyncResp, inventoryItems,
-                                    ledConnections, std::move(callback),
-                                    ledConnectionsIndex + 1);
+            // Recurse to get LED data from next connection
+            getInventoryLedData(sensorsAsyncResp, inventoryItems,
+                                ledConnections, std::move(callback),
+                                ledConnectionsIndex + 1);
 
-                BMCWEB_LOG_DEBUG << "getInventoryLedData respHandler exit";
-            };
+            BMCWEB_LOG_DEBUG << "getInventoryLedData respHandler exit";
+        };
 
         // Get the State property for the current LED
         crow::connections::systemBus->async_method_call(
@@ -2213,7 +2213,8 @@
     auto respHandler = [sensorsAsyncResp, inventoryItems,
                         callback{std::move(callback)}](
                            const boost::system::error_code ec,
-                           const std::variant<uint32_t>& deratingFactor) {
+                           const dbus::utility::DbusVariantType&
+                               deratingFactor) {
         BMCWEB_LOG_DEBUG << "getPowerSupplyAttributesData respHandler enter";
         if (ec)
         {
@@ -2942,7 +2943,7 @@
                     },
                     item.second, item.first, "org.freedesktop.DBus.Properties",
                     "Set", "xyz.openbmc_project.Sensor.Value", "Value",
-                    std::variant<double>(iterator->second.first));
+                    dbus::utility::DbusVariantType(iterator->second.first));
             }
         };
         // Get object with connection for the given sensor name
diff --git a/redfish-core/lib/storage.hpp b/redfish-core/lib/storage.hpp
index b83e13f..4ad3040 100644
--- a/redfish-core/lib/storage.hpp
+++ b/redfish-core/lib/storage.hpp
@@ -19,6 +19,7 @@
 #include "openbmc_dbus_rest.hpp"
 
 #include <app.hpp>
+#include <dbus_utility.hpp>
 #include <registries/privilege_registry.hpp>
 
 namespace redfish
@@ -159,9 +160,9 @@
                         storageController["Status"]["State"] = "Enabled";
 
                         crow::connections::systemBus->async_method_call(
-                            [asyncResp,
-                             index](const boost::system::error_code ec2,
-                                    const std::variant<bool> present) {
+                            [asyncResp, index](
+                                const boost::system::error_code ec2,
+                                const dbus::utility::DbusVariantType present) {
                                 // this interface isn't necessary, only check it
                                 // if we get a good return
                                 if (ec2)
@@ -192,9 +193,9 @@
                         crow::connections::systemBus->async_method_call(
                             [asyncResp, index](
                                 const boost::system::error_code ec2,
-                                const std::vector<std::pair<
-                                    std::string,
-                                    std::variant<bool, std::string, uint64_t>>>&
+                                const std::vector<
+                                    std::pair<std::string,
+                                              dbus::utility::DbusVariantType>>&
                                     propertiesList) {
                                 if (ec2)
                                 {
@@ -203,9 +204,8 @@
                                 }
                                 for (const std::pair<
                                          std::string,
-                                         std::variant<bool, std::string,
-                                                      uint64_t>>& property :
-                                     propertiesList)
+                                         dbus::utility::DbusVariantType>&
+                                         property : propertiesList)
                                 {
                                     // Store DBus properties that are also
                                     // Redfish properties with same name and a
@@ -268,18 +268,16 @@
                           const std::string& path)
 {
     crow::connections::systemBus->async_method_call(
-        [asyncResp](
-            const boost::system::error_code ec,
-            const std::vector<std::pair<
-                std::string, std::variant<bool, std::string, uint64_t>>>&
-                propertiesList) {
+        [asyncResp](const boost::system::error_code ec,
+                    const std::vector<
+                        std::pair<std::string, dbus::utility::DbusVariantType>>&
+                        propertiesList) {
             if (ec)
             {
                 // this interface isn't necessary
                 return;
             }
-            for (const std::pair<std::string,
-                                 std::variant<bool, std::string, uint64_t>>&
+            for (const std::pair<std::string, dbus::utility::DbusVariantType>&
                      property : propertiesList)
             {
                 // Store DBus properties that are also
@@ -313,7 +311,7 @@
 {
     crow::connections::systemBus->async_method_call(
         [asyncResp, path](const boost::system::error_code ec,
-                          const std::variant<bool> present) {
+                          const dbus::utility::DbusVariantType present) {
             // this interface isn't necessary, only check it if
             // we get a good return
             if (ec)
@@ -343,7 +341,7 @@
 {
     crow::connections::systemBus->async_method_call(
         [asyncResp](const boost::system::error_code ec,
-                    const std::variant<bool> rebuilding) {
+                    const dbus::utility::DbusVariantType rebuilding) {
             // this interface isn't necessary, only check it
             // if we get a good return
             if (ec)
diff --git a/redfish-core/lib/systems.hpp b/redfish-core/lib/systems.hpp
index 8e1a6f4..b3094df 100644
--- a/redfish-core/lib/systems.hpp
+++ b/redfish-core/lib/systems.hpp
@@ -22,6 +22,7 @@
 
 #include <app.hpp>
 #include <boost/container/flat_map.hpp>
+#include <dbus_utility.hpp>
 #include <registries/privilege_registry.hpp>
 #include <utils/fw_utils.hpp>
 #include <utils/json_utils.hpp>
@@ -41,7 +42,7 @@
  */
 inline void
     updateDimmProperties(const std::shared_ptr<bmcweb::AsyncResp>& aResp,
-                         const std::variant<bool>& dimmState)
+                         const dbus::utility::DbusVariantType& dimmState)
 {
     const bool* isDimmFunctional = std::get_if<bool>(&dimmState);
     if (isDimmFunctional == nullptr)
@@ -74,9 +75,9 @@
  *
  * @return None.
  */
-inline void
-    modifyCpuPresenceState(const std::shared_ptr<bmcweb::AsyncResp>& aResp,
-                           const std::variant<bool>& cpuPresenceState)
+inline void modifyCpuPresenceState(
+    const std::shared_ptr<bmcweb::AsyncResp>& aResp,
+    const dbus::utility::DbusVariantType& cpuPresenceState)
 {
     const bool* isCpuPresent = std::get_if<bool>(&cpuPresenceState);
 
@@ -110,9 +111,9 @@
  *
  * @return None.
  */
-inline void
-    modifyCpuFunctionalState(const std::shared_ptr<bmcweb::AsyncResp>& aResp,
-                             const std::variant<bool>& cpuFunctionalState)
+inline void modifyCpuFunctionalState(
+    const std::shared_ptr<bmcweb::AsyncResp>& aResp,
+    const dbus::utility::DbusVariantType& cpuFunctionalState)
 {
     const bool* isCpuFunctional = std::get_if<bool>(&cpuFunctionalState);
 
@@ -142,8 +143,7 @@
 inline void getProcessorProperties(
     const std::shared_ptr<bmcweb::AsyncResp>& aResp, const std::string& service,
     const std::string& path,
-    const std::vector<std::pair<
-        std::string, std::variant<std::string, uint64_t, uint32_t, uint16_t>>>&
+    const std::vector<std::pair<std::string, dbus::utility::DbusVariantType>>&
         properties)
 {
 
@@ -151,7 +151,7 @@
 
     auto getCpuPresenceState =
         [aResp](const boost::system::error_code ec3,
-                const std::variant<bool>& cpuPresenceCheck) {
+                const dbus::utility::DbusVariantType& cpuPresenceCheck) {
             if (ec3)
             {
                 BMCWEB_LOG_ERROR << "DBUS response error " << ec3;
@@ -162,7 +162,7 @@
 
     auto getCpuFunctionalState =
         [aResp](const boost::system::error_code ec3,
-                const std::variant<bool>& cpuFunctionalCheck) {
+                const dbus::utility::DbusVariantType& cpuFunctionalCheck) {
             if (ec3)
             {
                 BMCWEB_LOG_ERROR << "DBUS response error " << ec3;
@@ -236,8 +236,7 @@
         [aResp, service,
          path](const boost::system::error_code ec2,
                const std::vector<std::pair<
-                   std::string, std::variant<std::string, uint64_t, uint32_t,
-                                             uint16_t>>>& properties) {
+                   std::string, dbus::utility::DbusVariantType>>& properties) {
             if (ec2)
             {
                 BMCWEB_LOG_ERROR << "DBUS response error " << ec2;
@@ -317,8 +316,9 @@
                             crow::connections::systemBus->async_method_call(
                                 [aResp, service{connection.first},
                                  path](const boost::system::error_code ec2,
-                                       const std::vector<
-                                           std::pair<std::string, VariantType>>&
+                                       const std::vector<std::pair<
+                                           std::string,
+                                           dbus::utility::DbusVariantType>>&
                                            properties) {
                                     if (ec2)
                                     {
@@ -333,8 +333,10 @@
 
                                     if (properties.size() > 0)
                                     {
-                                        for (const std::pair<std::string,
-                                                             VariantType>&
+                                        for (const std::pair<
+                                                 std::string,
+                                                 dbus::utility::
+                                                     DbusVariantType>&
                                                  property : properties)
                                         {
                                             if (property.first !=
@@ -379,8 +381,9 @@
                                             [aResp](
                                                 const boost::system::error_code
                                                     ec3,
-                                                const std::variant<bool>&
-                                                    dimmState) {
+                                                const dbus::utility::
+                                                    DbusVariantType&
+                                                        dimmState) {
                                                 if (ec3)
                                                 {
                                                     BMCWEB_LOG_ERROR
@@ -423,11 +426,11 @@
                             BMCWEB_LOG_DEBUG
                                 << "Found UUID, now get its properties.";
                             crow::connections::systemBus->async_method_call(
-                                [aResp](
-                                    const boost::system::error_code ec3,
-                                    const std::vector<
-                                        std::pair<std::string, VariantType>>&
-                                        properties) {
+                                [aResp](const boost::system::error_code ec3,
+                                        const std::vector<std::pair<
+                                            std::string,
+                                            dbus::utility::DbusVariantType>>&
+                                            properties) {
                                     if (ec3)
                                     {
                                         BMCWEB_LOG_DEBUG
@@ -438,8 +441,9 @@
                                     BMCWEB_LOG_DEBUG << "Got "
                                                      << properties.size()
                                                      << " UUID properties.";
-                                    for (const std::pair<std::string,
-                                                         VariantType>&
+                                    for (const std::pair<
+                                             std::string,
+                                             dbus::utility::DbusVariantType>&
                                              property : properties)
                                     {
                                         if (property.first == "UUID")
@@ -474,11 +478,11 @@
                                  "xyz.openbmc_project.Inventory.Item.System")
                         {
                             crow::connections::systemBus->async_method_call(
-                                [aResp](
-                                    const boost::system::error_code ec2,
-                                    const std::vector<
-                                        std::pair<std::string, VariantType>>&
-                                        propertiesList) {
+                                [aResp](const boost::system::error_code ec2,
+                                        const std::vector<std::pair<
+                                            std::string,
+                                            dbus::utility::DbusVariantType>>&
+                                            propertiesList) {
                                     if (ec2)
                                     {
                                         // doesn't have to include this
@@ -488,8 +492,9 @@
                                     BMCWEB_LOG_DEBUG
                                         << "Got " << propertiesList.size()
                                         << " properties for system";
-                                    for (const std::pair<std::string,
-                                                         VariantType>&
+                                    for (const std::pair<
+                                             std::string,
+                                             dbus::utility::DbusVariantType>&
                                              property : propertiesList)
                                     {
                                         const std::string& propertyName =
@@ -522,9 +527,9 @@
                                 "xyz.openbmc_project.Inventory.Decorator.Asset");
 
                             crow::connections::systemBus->async_method_call(
-                                [aResp](
-                                    const boost::system::error_code ec2,
-                                    const std::variant<std::string>& property) {
+                                [aResp](const boost::system::error_code ec2,
+                                        const dbus::utility::DbusVariantType&
+                                            property) {
                                     if (ec2)
                                     {
                                         // doesn't have to include this
@@ -574,7 +579,7 @@
     BMCWEB_LOG_DEBUG << "Get host information.";
     crow::connections::systemBus->async_method_call(
         [aResp](const boost::system::error_code ec,
-                const std::variant<std::string>& hostState) {
+                const dbus::utility::DbusVariantType& hostState) {
             if (ec)
             {
                 BMCWEB_LOG_DEBUG << "DBUS response error " << ec;
@@ -781,7 +786,7 @@
 {
     crow::connections::systemBus->async_method_call(
         [aResp](const boost::system::error_code ec,
-                const std::variant<std::string>& bootProgress) {
+                const dbus::utility::DbusVariantType& bootProgress) {
             if (ec)
             {
                 // BootProgress is an optional object so just do nothing if
@@ -884,7 +889,7 @@
 {
     crow::connections::systemBus->async_method_call(
         [aResp](const boost::system::error_code ec,
-                const std::variant<std::string>& bootType) {
+                const dbus::utility::DbusVariantType& bootType) {
             if (ec)
             {
                 // not an error, don't have to have the interface
@@ -934,7 +939,7 @@
 {
     crow::connections::systemBus->async_method_call(
         [aResp](const boost::system::error_code ec,
-                const std::variant<std::string>& bootMode) {
+                const dbus::utility::DbusVariantType& bootMode) {
             if (ec)
             {
                 BMCWEB_LOG_DEBUG << "DBUS response error " << ec;
@@ -988,7 +993,7 @@
 {
     crow::connections::systemBus->async_method_call(
         [aResp](const boost::system::error_code ec,
-                const std::variant<std::string>& bootSource) {
+                const dbus::utility::DbusVariantType& bootSource) {
             if (ec)
             {
                 BMCWEB_LOG_DEBUG << "DBUS response error " << ec;
@@ -1047,7 +1052,7 @@
     // property to set a correct value for the "BootSourceOverrideEnabled"
     crow::connections::systemBus->async_method_call(
         [aResp](const boost::system::error_code ec,
-                const std::variant<bool>& oneTime) {
+                const dbus::utility::DbusVariantType& oneTime) {
             if (ec)
             {
                 BMCWEB_LOG_DEBUG << "DBUS response error " << ec;
@@ -1095,7 +1100,7 @@
 {
     crow::connections::systemBus->async_method_call(
         [aResp](const boost::system::error_code ec,
-                const std::variant<bool>& bootOverrideEnable) {
+                const dbus::utility::DbusVariantType& bootOverrideEnable) {
             if (ec)
             {
                 BMCWEB_LOG_DEBUG << "DBUS response error " << ec;
@@ -1154,7 +1159,7 @@
 
     crow::connections::systemBus->async_method_call(
         [aResp](const boost::system::error_code ec,
-                std::variant<uint64_t>& lastResetTime) {
+                dbus::utility::DbusVariantType& lastResetTime) {
             if (ec)
             {
                 BMCWEB_LOG_DEBUG << "D-BUS response error " << ec;
@@ -1196,7 +1201,7 @@
 
     crow::connections::systemBus->async_method_call(
         [aResp](const boost::system::error_code ec,
-                std::variant<bool>& autoRebootEnabled) {
+                dbus::utility::DbusVariantType& autoRebootEnabled) {
             if (ec)
             {
                 BMCWEB_LOG_DEBUG << "D-BUS response error " << ec;
@@ -1221,7 +1226,8 @@
                 // attempts are left
                 crow::connections::systemBus->async_method_call(
                     [aResp](const boost::system::error_code ec2,
-                            std::variant<uint32_t>& autoRebootAttemptsLeft) {
+                            dbus::utility::DbusVariantType&
+                                autoRebootAttemptsLeft) {
                         if (ec2)
                         {
                             BMCWEB_LOG_DEBUG << "D-BUS response error " << ec2;
@@ -1289,7 +1295,7 @@
 
     crow::connections::systemBus->async_method_call(
         [aResp](const boost::system::error_code ec,
-                std::variant<std::string>& policy) {
+                dbus::utility::DbusVariantType& policy) {
             if (ec)
             {
                 BMCWEB_LOG_DEBUG << "DBUS response error " << ec;
@@ -1389,7 +1395,7 @@
             // Valid TPM Enable object found, now reading the current value
             crow::connections::systemBus->async_method_call(
                 [aResp](const boost::system::error_code ec,
-                        std::variant<bool>& tpmRequired) {
+                        dbus::utility::DbusVariantType& tpmRequired) {
                     if (ec)
                     {
                         BMCWEB_LOG_DEBUG
@@ -1509,7 +1515,7 @@
                 },
                 serv, path, "org.freedesktop.DBus.Properties", "Set",
                 "xyz.openbmc_project.Control.TPM.Policy", "TPMEnable",
-                std::variant<bool>(tpmRequired));
+                dbus::utility::DbusVariantType(tpmRequired));
         },
         "xyz.openbmc_project.ObjectMapper",
         "/xyz/openbmc_project/object_mapper",
@@ -1577,7 +1583,7 @@
         "/xyz/openbmc_project/control/host0/boot",
         "org.freedesktop.DBus.Properties", "Set",
         "xyz.openbmc_project.Control.Boot.Type", "BootType",
-        std::variant<std::string>(bootTypeStr));
+        dbus::utility::DbusVariantType(bootTypeStr));
 }
 
 /**
@@ -1641,7 +1647,7 @@
         "/xyz/openbmc_project/control/host0/boot",
         "org.freedesktop.DBus.Properties", "Set",
         "xyz.openbmc_project.Object.Enable", "Enabled",
-        std::variant<bool>(bootOverrideEnable));
+        dbus::utility::DbusVariantType(bootOverrideEnable));
 
     if (!bootOverrideEnable)
     {
@@ -1667,7 +1673,7 @@
         "/xyz/openbmc_project/control/host0/boot/one_time",
         "org.freedesktop.DBus.Properties", "Set",
         "xyz.openbmc_project.Object.Enable", "Enabled",
-        std::variant<bool>(!bootOverridePersistent));
+        dbus::utility::DbusVariantType(!bootOverridePersistent));
 }
 
 /**
@@ -1720,7 +1726,7 @@
         "/xyz/openbmc_project/control/host0/boot",
         "org.freedesktop.DBus.Properties", "Set",
         "xyz.openbmc_project.Control.Boot.Source", "BootSource",
-        std::variant<std::string>(bootSourceStr));
+        dbus::utility::DbusVariantType(bootSourceStr));
 
     crow::connections::systemBus->async_method_call(
         [aResp](const boost::system::error_code ec) {
@@ -1736,7 +1742,7 @@
         "/xyz/openbmc_project/control/host0/boot",
         "org.freedesktop.DBus.Properties", "Set",
         "xyz.openbmc_project.Control.Boot.Mode", "BootMode",
-        std::variant<std::string>(bootModeStr));
+        dbus::utility::DbusVariantType(bootModeStr));
 }
 
 /**
@@ -1829,7 +1835,7 @@
                 },
                 service, path, "org.freedesktop.DBus.Properties", "Set",
                 "xyz.openbmc_project.Inventory.Decorator.AssetTag", "AssetTag",
-                std::variant<std::string>(assetTag));
+                dbus::utility::DbusVariantType(assetTag));
         },
         "xyz.openbmc_project.ObjectMapper",
         "/xyz/openbmc_project/object_mapper",
@@ -1884,7 +1890,7 @@
         "/xyz/openbmc_project/control/host0/auto_reboot",
         "org.freedesktop.DBus.Properties", "Set",
         "xyz.openbmc_project.Control.Boot.RebootPolicy", "AutoReboot",
-        std::variant<bool>(autoRebootEnabled));
+        dbus::utility::DbusVariantType(autoRebootEnabled));
 }
 
 /**
@@ -1933,7 +1939,7 @@
         "/xyz/openbmc_project/control/host0/power_restore_policy",
         "org.freedesktop.DBus.Properties", "Set",
         "xyz.openbmc_project.Control.Power.RestorePolicy", "PowerRestorePolicy",
-        std::variant<std::string>(powerRestorPolicy));
+        dbus::utility::DbusVariantType(powerRestorPolicy));
 }
 
 #ifdef BMCWEB_ENABLE_REDFISH_PROVISIONING_FEATURE
@@ -2110,7 +2116,7 @@
             // Valid Power Mode object found, now read the current value
             crow::connections::systemBus->async_method_call(
                 [aResp](const boost::system::error_code ec,
-                        const std::variant<std::string>& pmode) {
+                        const dbus::utility::DbusVariantType& pmode) {
                     if (ec)
                     {
                         BMCWEB_LOG_DEBUG
@@ -2258,7 +2264,7 @@
                 },
                 service, path, "org.freedesktop.DBus.Properties", "Set",
                 "xyz.openbmc_project.Control.Power.Mode", "PowerMode",
-                std::variant<std::string>(powerMode));
+                dbus::utility::DbusVariantType(powerMode));
         },
         "xyz.openbmc_project.ObjectMapper",
         "/xyz/openbmc_project/object_mapper",
@@ -2438,7 +2444,7 @@
             "/xyz/openbmc_project/watchdog/host0",
             "org.freedesktop.DBus.Properties", "Set",
             "xyz.openbmc_project.State.Watchdog", "ExpireAction",
-            std::variant<std::string>(wdtTimeOutActStr));
+            dbus::utility::DbusVariantType(wdtTimeOutActStr));
     }
 
     if (wdtEnable)
@@ -2456,7 +2462,7 @@
             "/xyz/openbmc_project/watchdog/host0",
             "org.freedesktop.DBus.Properties", "Set",
             "xyz.openbmc_project.State.Watchdog", "Enabled",
-            std::variant<bool>(*wdtEnable));
+            dbus::utility::DbusVariantType(*wdtEnable));
     }
 }
 
@@ -2723,7 +2729,7 @@
                     },
                     service, path, "org.freedesktop.DBus.Properties", "Set",
                     "xyz.openbmc_project.Control.Power.IdlePowerSaver",
-                    "Enabled", std::variant<bool>(*ipsEnable));
+                    "Enabled", dbus::utility::DbusVariantType(*ipsEnable));
             }
             if (ipsEnterUtil)
             {
@@ -2739,7 +2745,7 @@
                     service, path, "org.freedesktop.DBus.Properties", "Set",
                     "xyz.openbmc_project.Control.Power.IdlePowerSaver",
                     "EnterUtilizationPercent",
-                    std::variant<uint8_t>(*ipsEnterUtil));
+                    dbus::utility::DbusVariantType(*ipsEnterUtil));
             }
             if (ipsEnterTime)
             {
@@ -2756,7 +2762,8 @@
                     },
                     service, path, "org.freedesktop.DBus.Properties", "Set",
                     "xyz.openbmc_project.Control.Power.IdlePowerSaver",
-                    "EnterDwellTime", std::variant<uint64_t>(timeMilliseconds));
+                    "EnterDwellTime",
+                    dbus::utility::DbusVariantType(timeMilliseconds));
             }
             if (ipsExitUtil)
             {
@@ -2772,7 +2779,7 @@
                     service, path, "org.freedesktop.DBus.Properties", "Set",
                     "xyz.openbmc_project.Control.Power.IdlePowerSaver",
                     "ExitUtilizationPercent",
-                    std::variant<uint8_t>(*ipsExitUtil));
+                    dbus::utility::DbusVariantType(*ipsExitUtil));
             }
             if (ipsExitTime)
             {
@@ -2789,7 +2796,8 @@
                     },
                     service, path, "org.freedesktop.DBus.Properties", "Set",
                     "xyz.openbmc_project.Control.Power.IdlePowerSaver",
-                    "ExitDwellTime", std::variant<uint64_t>(timeMilliseconds));
+                    "ExitDwellTime",
+                    dbus::utility::DbusVariantType(timeMilliseconds));
             }
         },
         "xyz.openbmc_project.ObjectMapper",
@@ -2818,8 +2826,9 @@
                 asyncResp->res.jsonValue["Name"] = "Computer System Collection";
 
                 crow::connections::systemBus->async_method_call(
-                    [asyncResp](const boost::system::error_code ec,
-                                const std::variant<std::string>& /*hostName*/) {
+                    [asyncResp](
+                        const boost::system::error_code ec,
+                        const dbus::utility::DbusVariantType& /*hostName*/) {
                         nlohmann::json& ifaceArray =
                             asyncResp->res.jsonValue["Members"];
                         ifaceArray = nlohmann::json::array();
@@ -2965,7 +2974,7 @@
                     "/xyz/openbmc_project/state/host0",
                     "org.freedesktop.DBus.Properties", "Set",
                     "xyz.openbmc_project.State.Host", "RequestedHostTransition",
-                    std::variant<std::string>{command});
+                    dbus::utility::DbusVariantType{command});
             }
             else
             {
@@ -2993,7 +3002,7 @@
                     "org.freedesktop.DBus.Properties", "Set",
                     "xyz.openbmc_project.State.Chassis",
                     "RequestedPowerTransition",
-                    std::variant<std::string>{command});
+                    dbus::utility::DbusVariantType{command});
             }
         });
 }
diff --git a/redfish-core/lib/telemetry_service.hpp b/redfish-core/lib/telemetry_service.hpp
index b79a5cd..c3082d7 100644
--- a/redfish-core/lib/telemetry_service.hpp
+++ b/redfish-core/lib/telemetry_service.hpp
@@ -3,10 +3,9 @@
 #include "utils/telemetry_utils.hpp"
 
 #include <app.hpp>
+#include <dbus_utility.hpp>
 #include <registries/privilege_registry.hpp>
 
-#include <variant>
-
 namespace redfish
 {
 
@@ -27,9 +26,10 @@
         "/redfish/v1/TelemetryService/Triggers";
 
     crow::connections::systemBus->async_method_call(
-        [asyncResp](const boost::system::error_code ec,
-                    const std::vector<std::pair<
-                        std::string, std::variant<uint32_t, uint64_t>>>& ret) {
+        [asyncResp](
+            const boost::system::error_code ec,
+            const std::vector<
+                std::pair<std::string, dbus::utility::DbusVariantType>>& ret) {
             if (ec == boost::system::errc::host_unreachable)
             {
                 asyncResp->res.jsonValue["Status"]["State"] = "Absent";
diff --git a/redfish-core/lib/update_service.hpp b/redfish-core/lib/update_service.hpp
index f3987d4..f5528e1 100644
--- a/redfish-core/lib/update_service.hpp
+++ b/redfish-core/lib/update_service.hpp
@@ -19,11 +19,10 @@
 
 #include <app.hpp>
 #include <boost/container/flat_map.hpp>
+#include <dbus_utility.hpp>
 #include <registries/privilege_registry.hpp>
 #include <utils/fw_utils.hpp>
 
-#include <variant>
-
 namespace redfish
 {
 
@@ -55,7 +54,7 @@
         },
         service, objPath, "org.freedesktop.DBus.Properties", "Set",
         "xyz.openbmc_project.Software.Activation", "RequestedActivation",
-        std::variant<std::string>(
+        dbus::utility::DbusVariantType(
             "xyz.openbmc_project.Software.Activation.RequestedActivations.Active"));
 }
 
@@ -68,7 +67,7 @@
 {
     std::vector<std::pair<
         std::string,
-        std::vector<std::pair<std::string, std::variant<std::string>>>>>
+        std::vector<std::pair<std::string, dbus::utility::DbusVariantType>>>>
         interfacesProperties;
 
     sdbusplus::message::object_path objPath;
@@ -135,7 +134,7 @@
                                     std::string iface;
                                     boost::container::flat_map<
                                         std::string,
-                                        std::variant<std::string, uint8_t>>
+                                        dbus::utility::DbusVariantType>
                                         values;
 
                                     std::string index =
@@ -321,7 +320,8 @@
         "arg0='xyz.openbmc_project.Logging.Entry'",
         [asyncResp, url](sdbusplus::message::message& m) {
             BMCWEB_LOG_DEBUG << "Error Match fired";
-            boost::container::flat_map<std::string, std::variant<std::string>>
+            boost::container::flat_map<std::string,
+                                       dbus::utility::DbusVariantType>
                 values;
             std::string objName;
             m.read(objName, values);
@@ -544,7 +544,7 @@
             // Get the current ApplyTime value
             crow::connections::systemBus->async_method_call(
                 [asyncResp](const boost::system::error_code ec,
-                            const std::variant<std::string>& applyTime) {
+                            const dbus::utility::DbusVariantType& applyTime) {
                     if (ec)
                     {
                         BMCWEB_LOG_DEBUG << "DBUS response error " << ec;
@@ -654,7 +654,7 @@
                             "org.freedesktop.DBus.Properties", "Set",
                             "xyz.openbmc_project.Software.ApplyTime",
                             "RequestedApplyTime",
-                            std::variant<std::string>{applyTimeNewVal});
+                            dbus::utility::DbusVariantType{applyTimeNewVal});
                     }
                 }
             }
@@ -825,18 +825,22 @@
                                              obj.second[0].first);
 
                         crow::connections::systemBus->async_method_call(
-                            [asyncResp, swId](
-                                const boost::system::error_code errorCode,
-                                const boost::container::flat_map<
-                                    std::string, VariantType>& propertiesList) {
+                            [asyncResp,
+                             swId](const boost::system::error_code errorCode,
+                                   const boost::container::flat_map<
+                                       std::string,
+                                       dbus::utility::DbusVariantType>&
+                                       propertiesList) {
                                 if (errorCode)
                                 {
                                     messages::internalError(asyncResp->res);
                                     return;
                                 }
                                 boost::container::flat_map<
-                                    std::string, VariantType>::const_iterator
-                                    it = propertiesList.find("Purpose");
+                                    std::string,
+                                    dbus::utility::DbusVariantType>::
+                                    const_iterator it =
+                                        propertiesList.find("Purpose");
                                 if (it == propertiesList.end())
                                 {
                                     BMCWEB_LOG_DEBUG
diff --git a/redfish-core/lib/virtual_media.hpp b/redfish-core/lib/virtual_media.hpp
index 34c1c4b..747ca43 100644
--- a/redfish-core/lib/virtual_media.hpp
+++ b/redfish-core/lib/virtual_media.hpp
@@ -671,7 +671,7 @@
     constexpr const size_t secretLimit = 1024;
 
     std::shared_ptr<SecurePipe> secretPipe;
-    std::variant<int, SecurePipe::unix_fd> unixFd = -1;
+    dbus::utility::DbusVariantType unixFd = -1;
 
     if (!userName.empty() || !password.empty())
     {