diff --git a/src/firmware-update.cpp b/src/firmware-update.cpp
index dd9ea83..1c6899e 100644
--- a/src/firmware-update.cpp
+++ b/src/firmware-update.cpp
@@ -165,8 +165,7 @@
             auto value = t.second;
             if (key == "state")
             {
-                auto state =
-                    sdbusplus::message::variant_ns::get<std::string>(value);
+                auto state = std::get<std::string>(value);
                 if (DEBUG)
                     std::cerr << ", state=" << state;
                 if (state == "INIT")
@@ -193,19 +192,19 @@
             }
             else if (key == "percent")
             {
-                _percent = sdbusplus::message::variant_ns::get<int32_t>(value);
+                _percent = std::get<int32_t>(value);
                 if (DEBUG)
                     std::cerr << ", pct=" << (int)_percent;
             }
             else if (key == "msg")
             {
-                _msg = sdbusplus::message::variant_ns::get<std::string>(value);
+                _msg = std::get<std::string>(value);
                 if (DEBUG)
                     std::cerr << ", msg='" << _msg << '\'';
             }
             else if (key == "Progress")
             {
-                _percent = sdbusplus::message::variant_ns::get<uint8_t>(value);
+                _percent = std::get<uint8_t>(value);
                 ;
                 if (_percent == 100)
                     _state = FW_STATE_READY;
@@ -405,7 +404,7 @@
 
             ipmi::DbusVariant retval;
             reply.read(retval);
-            if (sdbusplus::message::variant_ns::get<int>(retval) != 0)
+            if (std::get<int>(retval) != 0)
                 rc = IPMI_CC_INVALID_FIELD_REQUEST;
         }
         catch (sdbusplus::exception::SdBusError &e)
@@ -587,11 +586,10 @@
     auto method_call = _bus.new_method_call(
         "xyz.openbmc_project.Software.BMC.Updater", obj_path,
         "org.freedesktop.DBus.Properties", "Set");
-    method_call.append("xyz.openbmc_project.Software.Activation",
-                       "RequestedActivation",
-                       sdbusplus::message::variant<std::string>(
-                           "xyz.openbmc_project.Software.Activation."
-                           "RequestedActivations.Active"));
+    method_call.append(
+        "xyz.openbmc_project.Software.Activation", "RequestedActivation",
+        std::variant<std::string>("xyz.openbmc_project.Software.Activation."
+                                  "RequestedActivations.Active"));
 
     try
     {
@@ -629,8 +627,7 @@
 
         std::vector<std::pair<
             std::string,
-            std::vector<std::pair<std::string,
-                                  sdbusplus::message::variant<std::string>>>>>
+            std::vector<std::pair<std::string, std::variant<std::string>>>>>
             interfaces_properties;
 
         sdbusplus::message::object_path obj_path;
@@ -1116,8 +1113,7 @@
             auto value = t.second;
             if (key == "version")
             {
-                auto strver =
-                    sdbusplus::message::variant_ns::get<std::string>(value);
+                auto strver = std::get<std::string>(value);
                 std::stringstream ss;
                 ss << std::hex << strver;
                 uint32_t t;
@@ -1131,13 +1127,11 @@
             }
             else if (key == "build_time")
             {
-                build_time =
-                    sdbusplus::message::variant_ns::get<int32_t>(value);
+                build_time = std::get<int32_t>(value);
             }
             else if (key == "update_time")
             {
-                update_time =
-                    sdbusplus::message::variant_ns::get<int32_t>(value);
+                update_time = std::get<int32_t>(value);
             }
         }
 
@@ -1227,7 +1221,7 @@
         }
 
         info->id_tag = id_tag;
-        info->sec_rev = sdbusplus::message::variant_ns::get<int>(sec_rev);
+        info->sec_rev = std::get<int>(sec_rev);
         count++;
         info++;
     }
@@ -1346,13 +1340,11 @@
                 auto value = t.second;
                 if (key == "active_partition")
                 {
-                    active_img =
-                        sdbusplus::message::variant_ns::get<int>(value);
+                    active_img = std::get<int>(value);
                 }
                 else if (key == "safe_mode")
                 {
-                    safe_mode =
-                        sdbusplus::message::variant_ns::get<bool>(value);
+                    safe_mode = std::get<bool>(value);
                 }
             }
         }
@@ -1579,16 +1571,15 @@
             auto value = t.second;
             if (key == "certificate_subject")
             {
-                subject =
-                    sdbusplus::message::variant_ns::get<std::string>(value);
+                subject = std::get<std::string>(value);
             }
             else if (key == "cetificate_serial")
             {
-                serial = sdbusplus::message::variant_ns::get<uint64_t>(value);
+                serial = std::get<uint64_t>(value);
             }
             else if (key == "certificate")
             {
-                cert = sdbusplus::message::variant_ns::get<std::string>(value);
+                cert = std::get<std::string>(value);
             }
         }
     }
@@ -1656,7 +1647,7 @@
         std::cerr << "SDBus Error: " << e.what();
         return IPMI_CC_UNSPECIFIED_ERROR;
     }
-    auto cert_data = sdbusplus::message::variant_ns::get<std::string>(cert);
+    auto cert_data = std::get<std::string>(cert);
 
     if (cert_data_req->offset >= cert_data.size())
     {
diff --git a/src/oemcommands.cpp b/src/oemcommands.cpp
index 028671a..36a0d14 100644
--- a/src/oemcommands.cpp
+++ b/src/oemcommands.cpp
@@ -88,8 +88,7 @@
         try
         {
             Value variant = property->second;
-            std::string& result =
-                sdbusplus::message::variant_ns::get<std::string>(variant);
+            std::string& result = std::get<std::string>(variant);
             if (result.size() > maxFRUStringLength)
             {
                 phosphor::logging::log<phosphor::logging::level::ERR>(
@@ -99,7 +98,7 @@
             serial = result;
             return 0;
         }
-        catch (sdbusplus::message::variant_ns::bad_variant_access& e)
+        catch (std::bad_variant_access& e)
         {
             phosphor::logging::log<phosphor::logging::level::ERR>(e.what());
             return -1;
@@ -236,8 +235,7 @@
             {
                 Value variant = getDbusProperty(dbus, service, biosObjPath,
                                                 biosIntf, biosProp);
-                std::string& idString =
-                    sdbusplus::message::variant_ns::get<std::string>(variant);
+                std::string& idString = std::get<std::string>(variant);
                 if (req->offset >= idString.size())
                 {
                     return IPMI_CC_PARM_OUT_OF_RANGE;
@@ -256,7 +254,7 @@
                 res->resDatalen = length;
                 *dataLen = res->resDatalen + 1;
             }
-            catch (sdbusplus::message::variant_ns::bad_variant_access& e)
+            catch (std::bad_variant_access& e)
             {
                 phosphor::logging::log<phosphor::logging::level::ERR>(e.what());
                 return IPMI_CC_UNSPECIFIED_ERROR;
@@ -314,7 +312,7 @@
         getDbusProperty(dbus, service, powerRestoreDelayObjPath,
                         powerRestoreDelayIntf, powerRestoreDelayProp);
 
-    uint16_t delay = sdbusplus::message::variant_ns::get<uint16_t>(variant);
+    uint16_t delay = std::get<uint16_t>(variant);
     resp->byteLSB = delay;
     resp->byteMSB = delay >> 8;
 
@@ -476,7 +474,7 @@
         getService(dbus, processorErrConfigIntf, processorErrConfigObjPath);
     Value variant = getDbusProperty(dbus, service, processorErrConfigObjPath,
                                     processorErrConfigIntf, "ResetCfg");
-    resp->resetCfg = sdbusplus::message::variant_ns::get<uint8_t>(variant);
+    resp->resetCfg = std::get<uint8_t>(variant);
 
     std::vector<uint8_t> caterrStatus;
     sdbusplus::message::variant<std::vector<uint8_t>> message;
@@ -491,8 +489,7 @@
     try
     {
         reply.read(message);
-        caterrStatus =
-            sdbusplus::message::variant_ns::get<std::vector<uint8_t>>(message);
+        caterrStatus = std::get<std::vector<uint8_t>>(message);
     }
     catch (sdbusplus::exception_t&)
     {
@@ -679,7 +676,7 @@
             getDbusObject(dbus, networkIPIntf, networkRoot, ethIP);
         auto value = getDbusProperty(dbus, networkService, ethernetObj.first,
                                      networkIPIntf, "Origin");
-        if (sdbusplus::message::variant_ns::get<std::string>(value) ==
+        if (std::get<std::string>(value) ==
             "xyz.openbmc_project.Network.IP.AddressOrigin.DHCP")
         {
             return true;
@@ -715,8 +712,7 @@
             getDbusObject(dbus, networkIPIntf, networkRoot, ethIP);
         auto properties = getAllDbusProperties(dbus, objectInfo.second,
                                                objectInfo.first, networkIPIntf);
-        if (sdbusplus::message::variant_ns::get<std::string>(
-                properties["Origin"]) ==
+        if (std::get<std::string>(properties["Origin"]) ==
             "xyz.openbmc_project.Network.IP.AddressOrigin.DHCP")
         {
             return true;
@@ -914,8 +910,7 @@
         std::string service = getService(bus, intf, objPath);
         Value stateValue =
             getDbusProperty(bus, service, objPath, intf, "State");
-        std::string strState =
-            sdbusplus::message::variant_ns::get<std::string>(stateValue);
+        std::string strState = std::get<std::string>(stateValue);
         state = ledAction::actionDbusToIpmi.at(
             sdbusplus::xyz::openbmc_project::Led::server::Physical::
                 convertActionFromString(strState));
diff --git a/src/sensorcommands.cpp b/src/sensorcommands.cpp
index ab654f7..886f446 100644
--- a/src/sensorcommands.cpp
+++ b/src/sensorcommands.cpp
@@ -38,7 +38,6 @@
              std::map<std::string, std::map<std::string, DbusVariant>>>;
 
 using SensorMap = std::map<std::string, std::map<std::string, DbusVariant>>;
-namespace variant_ns = sdbusplus::message::variant_ns;
 
 static constexpr int sensorListUpdatePeriod = 10;
 static constexpr int sensorMapUpdatePeriod = 2;
@@ -163,11 +162,11 @@
 
         if (maxMap != sensorObject->second.end())
         {
-            max = variant_ns::visit(VariantToDoubleVisitor(), maxMap->second);
+            max = std::visit(VariantToDoubleVisitor(), maxMap->second);
         }
         if (minMap != sensorObject->second.end())
         {
-            min = variant_ns::visit(VariantToDoubleVisitor(), minMap->second);
+            min = std::visit(VariantToDoubleVisitor(), minMap->second);
         }
     }
     if (critical != sensorMap.end())
@@ -176,14 +175,12 @@
         auto upper = critical->second.find("CriticalHigh");
         if (lower != critical->second.end())
         {
-            double value =
-                variant_ns::visit(VariantToDoubleVisitor(), lower->second);
+            double value = std::visit(VariantToDoubleVisitor(), lower->second);
             min = std::min(value, min);
         }
         if (upper != critical->second.end())
         {
-            double value =
-                variant_ns::visit(VariantToDoubleVisitor(), upper->second);
+            double value = std::visit(VariantToDoubleVisitor(), upper->second);
             max = std::max(value, max);
         }
     }
@@ -194,14 +191,12 @@
         auto upper = warning->second.find("WarningHigh");
         if (lower != warning->second.end())
         {
-            double value =
-                variant_ns::visit(VariantToDoubleVisitor(), lower->second);
+            double value = std::visit(VariantToDoubleVisitor(), lower->second);
             min = std::min(value, min);
         }
         if (upper != warning->second.end())
         {
-            double value =
-                variant_ns::visit(VariantToDoubleVisitor(), upper->second);
+            double value = std::visit(VariantToDoubleVisitor(), upper->second);
             max = std::max(value, max);
         }
     }
@@ -346,7 +341,7 @@
         return ipmi::responseResponseError();
     }
     auto &valueVariant = sensorObject->second["Value"];
-    double reading = variant_ns::visit(VariantToDoubleVisitor(), valueVariant);
+    double reading = std::visit(VariantToDoubleVisitor(), valueVariant);
 
     double max = 0;
     double min = 0;
@@ -628,15 +623,15 @@
             if (warningHigh != warningMap.end())
             {
 
-                double value = variant_ns::visit(VariantToDoubleVisitor(),
-                                                 warningHigh->second);
+                double value =
+                    std::visit(VariantToDoubleVisitor(), warningHigh->second);
                 resp.warningHigh = scaleIPMIValueFromDouble(
                     value, mValue, rExp, bValue, bExp, bSigned);
             }
             if (warningLow != warningMap.end())
             {
-                double value = variant_ns::visit(VariantToDoubleVisitor(),
-                                                 warningLow->second);
+                double value =
+                    std::visit(VariantToDoubleVisitor(), warningLow->second);
                 resp.warningLow = scaleIPMIValueFromDouble(
                     value, mValue, rExp, bValue, bExp, bSigned);
             }
@@ -650,15 +645,15 @@
 
             if (criticalHigh != criticalMap.end())
             {
-                double value = variant_ns::visit(VariantToDoubleVisitor(),
-                                                 criticalHigh->second);
+                double value =
+                    std::visit(VariantToDoubleVisitor(), criticalHigh->second);
                 resp.criticalHigh = scaleIPMIValueFromDouble(
                     value, mValue, rExp, bValue, bExp, bSigned);
             }
             if (criticalLow != criticalMap.end())
             {
-                double value = variant_ns::visit(VariantToDoubleVisitor(),
-                                                 criticalLow->second);
+                double value =
+                    std::visit(VariantToDoubleVisitor(), criticalLow->second);
                 resp.criticalLow = scaleIPMIValueFromDouble(
                     value, mValue, rExp, bValue, bExp, bSigned);
             }
@@ -935,13 +930,11 @@
 
             if (warningHigh != warningMap.end())
             {
-                warningHighAlarm = sdbusplus::message::variant_ns::get<bool>(
-                    warningHigh->second);
+                warningHighAlarm = std::get<bool>(warningHigh->second);
             }
             if (warningLow != warningMap.end())
             {
-                warningLowAlarm = sdbusplus::message::variant_ns::get<bool>(
-                    warningLow->second);
+                warningLowAlarm = std::get<bool>(warningLow->second);
             }
             if (warningHighAlarm)
             {
@@ -964,13 +957,11 @@
 
             if (criticalHigh != criticalMap.end())
             {
-                criticalHighAlarm = sdbusplus::message::variant_ns::get<bool>(
-                    criticalHigh->second);
+                criticalHighAlarm = std::get<bool>(criticalHigh->second);
             }
             if (criticalLow != criticalMap.end())
             {
-                criticalLowAlarm = sdbusplus::message::variant_ns::get<bool>(
-                    criticalLow->second);
+                criticalLowAlarm = std::get<bool>(criticalLow->second);
             }
             if (criticalHighAlarm)
             {
@@ -1239,12 +1230,12 @@
     double min = -127;
     if (maxObject != sensorObject->second.end())
     {
-        max = variant_ns::visit(VariantToDoubleVisitor(), maxObject->second);
+        max = std::visit(VariantToDoubleVisitor(), maxObject->second);
     }
 
     if (minObject != sensorObject->second.end())
     {
-        min = variant_ns::visit(VariantToDoubleVisitor(), minObject->second);
+        min = std::visit(VariantToDoubleVisitor(), minObject->second);
     }
 
     int16_t mValue = 0;
diff --git a/src/smbioshandler.cpp b/src/smbioshandler.cpp
index 7510493..1126b45 100644
--- a/src/smbioshandler.cpp
+++ b/src/smbioshandler.cpp
@@ -162,8 +162,7 @@
         phosphor::logging::log<level::ERR>("Error getting lockPolicy");
         return IPMI_CC_UNSPECIFIED_ERROR;
     }
-    if (regionLockUnlocked ==
-        sdbusplus::message::variant_ns::get<uint8_t>(value))
+    if (regionLockUnlocked == std::get<uint8_t>(value))
     {
         return IPMI_CC_PARAMETER_NOT_SUPPORT_IN_PRESENT_STATE;
     }
@@ -173,8 +172,7 @@
         phosphor::logging::log<level::ERR>("Error getting sessionId");
         return IPMI_CC_UNSPECIFIED_ERROR;
     }
-    if (requestData->sessionId !=
-        sdbusplus::message::variant_ns::get<uint8_t>(value))
+    if (requestData->sessionId != std::get<uint8_t>(value))
     {
         return IPMI_CC_OEM_SET_IN_PROCESS;
     }
@@ -243,7 +241,7 @@
         return IPMI_CC_UNSPECIFIED_ERROR;
     }
     if (requestData->offset + requestData->length >
-        sdbusplus::message::variant_ns::get<uint16_t>(regUsedVal))
+        std::get<uint16_t>(regUsedVal))
     {
         return IPMI_CC_REQ_DATA_LEN_INVALID;
     }
@@ -253,8 +251,7 @@
         phosphor::logging::log<level::ERR>("Error getting lockPolicy");
         return IPMI_CC_UNSPECIFIED_ERROR;
     }
-    if (regionLockUnlocked !=
-        sdbusplus::message::variant_ns::get<uint8_t>(lockPolicyVal))
+    if (regionLockUnlocked != std::get<uint8_t>(lockPolicyVal))
     {
         return IPMI_CC_PARAMETER_NOT_SUPPORT_IN_PRESENT_STATE;
     }
@@ -332,8 +329,7 @@
         phosphor::logging::log<level::ERR>("Error getting lockPolicy");
         return IPMI_CC_UNSPECIFIED_ERROR;
     }
-    if (regionLockUnlocked ==
-        sdbusplus::message::variant_ns::get<uint8_t>(value))
+    if (regionLockUnlocked == std::get<uint8_t>(value))
     {
         return IPMI_CC_PARAMETER_NOT_SUPPORT_IN_PRESENT_STATE;
     }
@@ -343,8 +339,7 @@
         phosphor::logging::log<level::ERR>("Error getting sessionId");
         return IPMI_CC_UNSPECIFIED_ERROR;
     }
-    if (requestData->sessionId !=
-        sdbusplus::message::variant_ns::get<uint8_t>(value))
+    if (requestData->sessionId != std::get<uint8_t>(value))
     {
         return IPMI_CC_OEM_SET_IN_PROCESS;
     }
@@ -426,22 +421,19 @@
     }
     if (requestData->lockPolicy == regionLockUnlocked)
     {
-        if (regionLockUnlocked ==
-            sdbusplus::message::variant_ns::get<uint8_t>(value))
+        if (regionLockUnlocked == std::get<uint8_t>(value))
         {
             return IPMI_CC_PARAMETER_NOT_SUPPORT_IN_PRESENT_STATE;
         }
     }
-    if (regionLockUnlocked !=
-        sdbusplus::message::variant_ns::get<uint8_t>(value))
+    if (regionLockUnlocked != std::get<uint8_t>(value))
     {
         if (0 > sdplus_mdrv1_get_property("SessionId", value, service))
         {
             phosphor::logging::log<level::ERR>("Error getting sessionId");
             return IPMI_CC_UNSPECIFIED_ERROR;
         }
-        if (requestData->sessionId !=
-            sdbusplus::message::variant_ns::get<uint8_t>(value))
+        if (requestData->sessionId != std::get<uint8_t>(value))
         {
             if (requestData->lockPolicy != regionLockStrict)
             {
diff --git a/src/smbiosmdrv2.cpp b/src/smbiosmdrv2.cpp
index 1b237fe..bce8929 100644
--- a/src/smbiosmdrv2.cpp
+++ b/src/smbiosmdrv2.cpp
@@ -217,8 +217,7 @@
             "Error getting DirEnries");
         return IPMI_CC_UNSPECIFIED_ERROR;
     }
-    if (requestData->dirIndex >
-        sdbusplus::message::variant_ns::get<uint8_t>(value))
+    if (requestData->dirIndex > std::get<uint8_t>(value))
     {
         return IPMI_CC_PARM_OUT_OF_RANGE;
     }
diff --git a/src/smbiosmdrv2handler.cpp b/src/smbiosmdrv2handler.cpp
index a6807ab..f3c4275 100644
--- a/src/smbiosmdrv2handler.cpp
+++ b/src/smbiosmdrv2handler.cpp
@@ -36,8 +36,6 @@
 
 std::unique_ptr<MDRV2> mdrv2 = nullptr;
 
-namespace variant_ns = sdbusplus::message::variant_ns;
-
 static void register_netfn_smbiosmdrv2_functions() __attribute__((constructor));
 static sdbusplus::bus::bus bus(ipmid_get_sd_bus_connection());
 
@@ -307,7 +305,7 @@
             "Error getting DirEnries");
         return IPMI_CC_UNSPECIFIED_ERROR;
     }
-    if (requestData->dirIndex > variant_ns::get<uint8_t>(value))
+    if (requestData->dirIndex > std::get<uint8_t>(value))
     {
         return IPMI_CC_PARM_OUT_OF_RANGE;
     }
diff --git a/src/storagecommands.cpp b/src/storagecommands.cpp
index 22a9dcd..5d478f2 100644
--- a/src/storagecommands.cpp
+++ b/src/storagecommands.cpp
@@ -198,10 +198,8 @@
             continue;
         }
 
-        uint8_t fruBus =
-            sdbusplus::message::variant_ns::get<uint32_t>(busFind->second);
-        uint8_t fruAddr =
-            sdbusplus::message::variant_ns::get<uint32_t>(addrFind->second);
+        uint8_t fruBus = std::get<uint32_t>(busFind->second);
+        uint8_t fruAddr = std::get<uint32_t>(addrFind->second);
 
         uint8_t fruHash = 0;
         if (fruBus != 0 || fruAddr != 0)
@@ -494,13 +492,11 @@
                          {
                              return false;
                          }
-                         if (sdbusplus::message::variant_ns::get<uint32_t>(
-                                 findBus->second) != bus)
+                         if (std::get<uint32_t>(findBus->second) != bus)
                          {
                              return false;
                          }
-                         if (sdbusplus::message::variant_ns::get<uint32_t>(
-                                 findAddress->second) != address)
+                         if (std::get<uint32_t>(findAddress->second) != address)
                          {
                              return false;
                          }
@@ -515,13 +511,11 @@
     auto findBoardName = fruData->find("PRODUCT_PRODUCT_NAME");
     if (findProductName != fruData->end())
     {
-        name = sdbusplus::message::variant_ns::get<std::string>(
-            findProductName->second);
+        name = std::get<std::string>(findProductName->second);
     }
     else if (findBoardName != fruData->end())
     {
-        name = sdbusplus::message::variant_ns::get<std::string>(
-            findBoardName->second);
+        name = std::get<std::string>(findBoardName->second);
     }
     else
     {
