diff --git a/control/json/actions/action.hpp b/control/json/actions/action.hpp
index dcba6ea..0377a8a 100644
--- a/control/json/actions/action.hpp
+++ b/control/json/actions/action.hpp
@@ -20,12 +20,11 @@
 #include "config_base.hpp"
 #include "group.hpp"
 
-#include <fmt/format.h>
-
 #include <nlohmann/json.hpp>
 #include <phosphor-logging/log.hpp>
 
 #include <algorithm>
+#include <format>
 #include <functional>
 #include <iterator>
 #include <map>
@@ -67,7 +66,7 @@
      */
     ActionParseError(const std::string& name, const std::string& details) :
         std::runtime_error(
-            fmt::format("Failed to parse action {} [{}]", name, details)
+            std::format("Failed to parse action {} [{}]", name, details)
                 .c_str())
     {}
 };
@@ -299,7 +298,7 @@
         else
         {
             log<level::ERR>(
-                fmt::format("Action '{}' is already registered", name).c_str());
+                std::format("Action '{}' is already registered", name).c_str());
             throw std::runtime_error("Actions with the same name found");
         }
 
@@ -338,7 +337,7 @@
                 return std::move(list) + ", " + act.first;
             });
             log<level::ERR>(
-                fmt::format("Action '{}' is not registered", name).c_str(),
+                std::format("Action '{}' is not registered", name).c_str(),
                 entry("AVAILABLE_ACTIONS=%s", acts.c_str()));
             throw std::runtime_error("Unsupported action name given");
         }
diff --git a/control/json/actions/count_state_target.cpp b/control/json/actions/count_state_target.cpp
index dcbd70d..b2a900b 100644
--- a/control/json/actions/count_state_target.cpp
+++ b/control/json/actions/count_state_target.cpp
@@ -20,10 +20,10 @@
 #include "action.hpp"
 #include "group.hpp"
 
-#include <fmt/format.h>
-
 #include <nlohmann/json.hpp>
 
+#include <format>
+
 namespace phosphor::fan::control::json
 {
 
diff --git a/control/json/actions/mapped_floor.cpp b/control/json/actions/mapped_floor.cpp
index c947098..97f659f 100644
--- a/control/json/actions/mapped_floor.cpp
+++ b/control/json/actions/mapped_floor.cpp
@@ -20,11 +20,10 @@
 #include "group.hpp"
 #include "sdeventplus.hpp"
 
-#include <fmt/format.h>
-
 #include <nlohmann/json.hpp>
 
 #include <algorithm>
+#include <format>
 
 namespace phosphor::fan::control::json
 {
@@ -43,7 +42,7 @@
     if (newFloor < 0)
     {
         log<level::ERR>(
-            fmt::format("{}: Floor offset of {} resulted in negative floor",
+            std::format("{}: Floor offset of {} resulted in negative floor",
                         actionName, offset)
                 .c_str());
         return floor;
@@ -72,7 +71,7 @@
     {
         throw ActionParseError{
             ActionBase::getName(),
-            fmt::format("Group name {} is not a valid group", name)};
+            std::format("Group name {} is not a valid group", name)};
     }
 
     return &(*groupIt);
@@ -195,7 +194,7 @@
     {
         throw ActionParseError{
             ActionBase::getName(),
-            fmt::format("condition_group {} must only have 1 member",
+            std::format("condition_group {} must only have 1 member",
                         _conditionGroup->getName())};
     }
 
@@ -267,7 +266,7 @@
                                   !std::is_same_v<int32_t, V> &&
                                   !std::is_same_v<int64_t, V>)
                     {
-                        throw std::runtime_error{fmt::format(
+                        throw std::runtime_error{std::format(
                             "{}: Group {} has more than one member but "
                             "isn't numeric",
                             ActionBase::getName(), group.getName())};
@@ -404,7 +403,7 @@
                     // If the parameter isn't there, then don't use
                     // this floor table
                     log<level::DEBUG>(
-                        fmt::format("{}: Parameter {} specified in the JSON "
+                        std::format("{}: Parameter {} specified in the JSON "
                                     "could not be found",
                                     ActionBase::getName(),
                                     std::get<std::string>(groupOrParameter))
diff --git a/control/json/actions/missing_owner_target.cpp b/control/json/actions/missing_owner_target.cpp
index 30f91b4..2138a06 100644
--- a/control/json/actions/missing_owner_target.cpp
+++ b/control/json/actions/missing_owner_target.cpp
@@ -19,12 +19,11 @@
 #include "../zone.hpp"
 #include "group.hpp"
 
-#include <fmt/format.h>
-
 #include <nlohmann/json.hpp>
 #include <phosphor-logging/log.hpp>
 
 #include <algorithm>
+#include <format>
 
 namespace phosphor::fan::control::json
 {
diff --git a/control/json/actions/net_target_decrease.cpp b/control/json/actions/net_target_decrease.cpp
index 044622d..a9fe8d1 100644
--- a/control/json/actions/net_target_decrease.cpp
+++ b/control/json/actions/net_target_decrease.cpp
@@ -20,12 +20,11 @@
 #include "action.hpp"
 #include "group.hpp"
 
-#include <fmt/format.h>
-
 #include <nlohmann/json.hpp>
 #include <phosphor-logging/log.hpp>
 
 #include <algorithm>
+#include <format>
 #include <variant>
 
 namespace phosphor::fan::control::json
@@ -124,7 +123,7 @@
                 {
                     // Unsupported group member type for this action
                     log<level::ERR>(
-                        fmt::format("Action {}: Unsupported group member type "
+                        std::format("Action {}: Unsupported group member type "
                                     "given. [object = {} : {} : {}]",
                                     ActionBase::getName(), member,
                                     group.getInterface(), group.getProperty())
diff --git a/control/json/actions/net_target_increase.cpp b/control/json/actions/net_target_increase.cpp
index 878dd3f..7341a35 100644
--- a/control/json/actions/net_target_increase.cpp
+++ b/control/json/actions/net_target_increase.cpp
@@ -20,12 +20,11 @@
 #include "action.hpp"
 #include "group.hpp"
 
-#include <fmt/format.h>
-
 #include <nlohmann/json.hpp>
 #include <phosphor-logging/log.hpp>
 
 #include <algorithm>
+#include <format>
 #include <variant>
 
 namespace phosphor::fan::control::json
@@ -117,7 +116,7 @@
                 {
                     // Unsupported group member type for this action
                     log<level::ERR>(
-                        fmt::format("Action {}: Unsupported group member type "
+                        std::format("Action {}: Unsupported group member type "
                                     "given. [object = {} : {} : {}]",
                                     ActionBase::getName(), member,
                                     group.getInterface(), group.getProperty())
diff --git a/control/json/actions/pcie_card_floors.cpp b/control/json/actions/pcie_card_floors.cpp
index 3d242d3..106d42f 100644
--- a/control/json/actions/pcie_card_floors.cpp
+++ b/control/json/actions/pcie_card_floors.cpp
@@ -67,7 +67,7 @@
         if (group.getInterface() != powerStateIface)
         {
             log<level::DEBUG>(
-                fmt::format("Wrong interface {} in PCIe card floor group",
+                std::format("Wrong interface {} in PCIe card floor group",
                             group.getInterface())
                     .c_str());
             continue;
@@ -85,7 +85,7 @@
             catch (const std::out_of_range& oore)
             {
                 log<level::ERR>(
-                    fmt::format("Could not get power state for {}", slotPath)
+                    std::format("Could not get power state for {}", slotPath)
                         .c_str());
                 continue;
             }
@@ -117,7 +117,7 @@
         }
     }
 
-    auto status = fmt::format(
+    auto status = std::format(
         "Found {} hot cards, {} with temp sensors, {} uninteresting", hotCards,
         numTempSensorCards, uninterestingCards);
     if (status != _lastStatus)
@@ -137,14 +137,14 @@
     {
         if (origIndex != floorIndex)
         {
-            record(fmt::format("Setting {} parameter to {}", floorIndexParam,
+            record(std::format("Setting {} parameter to {}", floorIndexParam,
                                floorIndex));
             Manager::setParameter(floorIndexParam, floorIndex);
         }
     }
     else if (origIndexVariant)
     {
-        record(fmt::format("Removing parameter {}", floorIndexParam));
+        record(std::format("Removing parameter {}", floorIndexParam));
         Manager::setParameter(floorIndexParam, std::nullopt);
     }
 }
@@ -188,7 +188,7 @@
     catch (const std::out_of_range& oore)
     {
         log<level::ERR>(
-            fmt::format(
+            std::format(
                 "{}: Could not get PCIeDevice property {} {} from cache ",
                 ActionBase::getName(), objectPath, propertyName)
                 .c_str());
@@ -203,7 +203,7 @@
     catch (const std::invalid_argument& e)
     {
         log<level::INFO>(
-            fmt::format("{}: {} has invalid PCIeDevice property {} value: {}",
+            std::format("{}: {} has invalid PCIeDevice property {} value: {}",
                         ActionBase::getName(), objectPath, propertyName,
                         std::get<std::string>(variantValue))
                 .c_str());
@@ -258,7 +258,7 @@
 
     if (it == _pcieDevices.end())
     {
-        throw std::runtime_error(fmt::format(
+        throw std::runtime_error(std::format(
             "Could not find PCIe card object path for slot {}", slotPath));
     }
 
diff --git a/control/json/actions/request_target_base.cpp b/control/json/actions/request_target_base.cpp
index 4bcaabb..f52a19b 100644
--- a/control/json/actions/request_target_base.cpp
+++ b/control/json/actions/request_target_base.cpp
@@ -19,12 +19,11 @@
 #include "../zone.hpp"
 #include "group.hpp"
 
-#include <fmt/format.h>
-
 #include <nlohmann/json.hpp>
 #include <phosphor-logging/log.hpp>
 
 #include <algorithm>
+#include <format>
 
 namespace phosphor::fan::control::json
 {
@@ -75,7 +74,7 @@
                 {
                     // Unsupported group member type for this action
                     log<level::ERR>(
-                        fmt::format("Action {}: Unsupported group member type "
+                        std::format("Action {}: Unsupported group member type "
                                     "given. [object = {} : {} : {}]",
                                     getName(), member, group.getInterface(),
                                     group.getProperty())
diff --git a/control/json/actions/set_parameter_from_group_max.cpp b/control/json/actions/set_parameter_from_group_max.cpp
index b42f582..10c2b70 100644
--- a/control/json/actions/set_parameter_from_group_max.cpp
+++ b/control/json/actions/set_parameter_from_group_max.cpp
@@ -17,7 +17,7 @@
 
 #include "../manager.hpp"
 
-#include <fmt/format.h>
+#include <format>
 
 namespace phosphor::fan::control::json
 {
@@ -69,7 +69,7 @@
                                   !std::is_same_v<int32_t, V> &&
                                   !std::is_same_v<int64_t, V>)
                     {
-                        log<level::ERR>(fmt::format("{}: Group {} has more "
+                        log<level::ERR>(std::format("{}: Group {} has more "
                                                     "than one member but "
                                                     "isn't numeric",
                                                     ActionBase::getName(),
@@ -105,7 +105,7 @@
         catch (const std::exception& e)
         {
             log<level::ERR>(
-                fmt::format("{}: Could not perform modifier operation: {}",
+                std::format("{}: Could not perform modifier operation: {}",
                             ActionBase::getName(), e.what())
                     .c_str());
             return;
diff --git a/control/json/actions/target_from_group_max.cpp b/control/json/actions/target_from_group_max.cpp
index 79cacf8..045b2d5 100644
--- a/control/json/actions/target_from_group_max.cpp
+++ b/control/json/actions/target_from_group_max.cpp
@@ -17,8 +17,7 @@
 
 #include "../manager.hpp"
 
-#include <fmt/format.h>
-
+#include <format>
 #include <iostream>
 
 namespace phosphor::fan::control::json
@@ -191,7 +190,7 @@
                               !std::is_same_v<int32_t, V> &&
                               !std::is_same_v<int64_t, V>)
                 {
-                    log<level::ERR>(fmt::format("{}: Group {}'s member "
+                    log<level::ERR>(std::format("{}: Group {}'s member "
                                                 "isn't numeric",
                                                 ActionBase::getName(),
                                                 group.getName())
diff --git a/control/json/actions/timer_based_actions.cpp b/control/json/actions/timer_based_actions.cpp
index e3f3fec..81d8fc1 100644
--- a/control/json/actions/timer_based_actions.cpp
+++ b/control/json/actions/timer_based_actions.cpp
@@ -23,12 +23,11 @@
 #include "sdeventplus.hpp"
 #include "zone.hpp"
 
-#include <fmt/format.h>
-
 #include <nlohmann/json.hpp>
 
 #include <algorithm>
 #include <chrono>
+#include <format>
 
 namespace phosphor::fan::control::json
 {
@@ -180,7 +179,7 @@
     else
     {
         throw ActionParseError{
-            getName(), fmt::format("Timer type '{}' is not supported", type)};
+            getName(), std::format("Timer type '{}' is not supported", type)};
     }
 }
 
diff --git a/control/json/dbus_zone.cpp b/control/json/dbus_zone.cpp
index 6397151..6e269c3 100644
--- a/control/json/dbus_zone.cpp
+++ b/control/json/dbus_zone.cpp
@@ -21,14 +21,13 @@
 #include "sdbusplus.hpp"
 #include "zone.hpp"
 
-#include <fmt/format.h>
-
 #include <cereal/archives/json.hpp>
 #include <cereal/cereal.hpp>
 #include <phosphor-logging/log.hpp>
 
 #include <algorithm>
 #include <filesystem>
+#include <format>
 #include <fstream>
 
 namespace phosphor::fan::control::json
@@ -92,7 +91,7 @@
         std::error_code ec;
         fs::remove(path, ec);
         log<level::ERR>(
-            fmt::format("Unable to restore persisted `Current` thermal mode "
+            std::format("Unable to restore persisted `Current` thermal mode "
                         "property ({}, ec: {})",
                         e.what(), ec.value())
                 .c_str());
diff --git a/control/json/event.cpp b/control/json/event.cpp
index 74f2ddf..3a74f30 100644
--- a/control/json/event.cpp
+++ b/control/json/event.cpp
@@ -22,13 +22,12 @@
 #include "sdbusplus.hpp"
 #include "trigger.hpp"
 
-#include <fmt/format.h>
-
 #include <nlohmann/json.hpp>
 #include <phosphor-logging/log.hpp>
 #include <sdbusplus/bus.hpp>
 
 #include <algorithm>
+#include <format>
 #include <optional>
 
 namespace phosphor::fan::control::json
@@ -148,7 +147,7 @@
         {
             if (!jsonGrp.contains("name"))
             {
-                auto msg = fmt::format("Missing required group name attribute");
+                auto msg = std::format("Missing required group name attribute");
                 log<level::ERR>(msg.c_str(),
                                 entry("JSON=%s", jsonGrp.dump().c_str()));
                 throw std::runtime_error(msg.c_str());
@@ -222,7 +221,7 @@
         if (actionZones.empty())
         {
             log<level::DEBUG>(
-                fmt::format("No zones configured for event {}'s action {} "
+                std::format("No zones configured for event {}'s action {} "
                             "based on the active profile(s)",
                             getName(), jsonAct["name"].get<std::string>())
                     .c_str());
@@ -260,7 +259,7 @@
         if (actionGroups.empty() && _groups.empty())
         {
             log<level::DEBUG>(
-                fmt::format("No groups configured for event {}'s action {} "
+                std::format("No groups configured for event {}'s action {} "
                             "based on the active profile(s)",
                             getName(), jsonAct["name"].get<std::string>())
                     .c_str());
@@ -303,7 +302,7 @@
                     return std::move(list) + ", " + trig.first;
                 });
             log<level::ERR>(
-                fmt::format("Trigger '{}' is not recognized", tClass).c_str(),
+                std::format("Trigger '{}' is not recognized", tClass).c_str(),
                 entry("AVAILABLE_TRIGGERS=%s", availTrigs.c_str()));
             throw std::runtime_error("Unsupported trigger class name given");
         }
diff --git a/control/json/fan.cpp b/control/json/fan.cpp
index 26b2174..0010d2b 100644
--- a/control/json/fan.cpp
+++ b/control/json/fan.cpp
@@ -17,12 +17,12 @@
 
 #include "sdbusplus.hpp"
 
-#include <fmt/format.h>
-
 #include <nlohmann/json.hpp>
 #include <phosphor-logging/log.hpp>
 #include <sdbusplus/bus.hpp>
 
+#include <format>
+
 namespace phosphor::fan::control::json
 {
 
@@ -117,7 +117,7 @@
         catch (const sdbusplus::exception_t&)
         {
             throw util::DBusPropertyError{
-                fmt::format("Failed to set target for fan {}", _name).c_str(),
+                std::format("Failed to set target for fan {}", _name).c_str(),
                 sensor.second, sensor.first, _interface, FAN_TARGET_PROPERTY};
         }
     }
diff --git a/control/json/manager.cpp b/control/json/manager.cpp
index fe5fc0d..5121e97 100644
--- a/control/json/manager.cpp
+++ b/control/json/manager.cpp
@@ -97,7 +97,7 @@
         log<level::ERR>("Error reloading configs, no changes made",
                         entry("LOAD_ERROR=%s", re.what()));
         FlightRecorder::instance().log(
-            "main", fmt::format("Error reloading configs, no changes made: {}",
+            "main", std::format("Error reloading configs, no changes made: {}",
                                 re.what()));
     }
 }
@@ -539,7 +539,7 @@
         {
             // Log service not found for object
             log<level::DEBUG>(
-                fmt::format(
+                std::format(
                     "Unable to get service name for path {}, interface {}",
                     path, intf)
                     .c_str());
diff --git a/control/json/manager.hpp b/control/json/manager.hpp
index ad92720..369b6bf 100644
--- a/control/json/manager.hpp
+++ b/control/json/manager.hpp
@@ -25,8 +25,6 @@
 #include "utils/flight_recorder.hpp"
 #include "zone.hpp"
 
-#include <fmt/format.h>
-
 #include <nlohmann/json.hpp>
 #include <phosphor-logging/log.hpp>
 #include <sdbusplus/bus.hpp>
@@ -36,6 +34,7 @@
 #include <sdeventplus/utility/timer.hpp>
 
 #include <chrono>
+#include <format>
 #include <map>
 #include <memory>
 #include <optional>
@@ -210,7 +209,7 @@
         if (!confFile.empty())
         {
             FlightRecorder::instance().log(
-                "main", fmt::format("Loading configuration from {}",
+                "main", std::format("Loading configuration from {}",
                                     confFile.string()));
             for (const auto& entry : fan::JsonConfig::load(confFile))
             {
@@ -242,11 +241,11 @@
                     std::move(obj));
             }
             log<level::INFO>(
-                fmt::format("Configuration({}) loaded successfully",
+                std::format("Configuration({}) loaded successfully",
                             T::confFileName)
                     .c_str());
             FlightRecorder::instance().log(
-                "main", fmt::format("Configuration({}) loaded successfully",
+                "main", std::format("Configuration({}) loaded successfully",
                                     T::confFileName));
         }
         return config;
diff --git a/control/json/triggers/init.cpp b/control/json/triggers/init.cpp
index f51a09e..32277d7 100644
--- a/control/json/triggers/init.cpp
+++ b/control/json/triggers/init.cpp
@@ -21,12 +21,11 @@
 #include "sdbusplus.hpp"
 #include "trigger_aliases.hpp"
 
-#include <fmt/format.h>
-
 #include <nlohmann/json.hpp>
 #include <phosphor-logging/log.hpp>
 
 #include <algorithm>
+#include <format>
 #include <iterator>
 #include <memory>
 #include <numeric>
@@ -109,7 +108,7 @@
                 // TODO How to handle this? Create timer to keep checking for
                 // object/service to appear? When to stop checking?
                 log<level::ERR>(
-                    fmt::format(
+                    std::format(
                         "Unable to get service name for path {}, interface {}",
                         member, intf)
                         .c_str());
@@ -128,7 +127,7 @@
                 // Path and/or interface configured does not exist on dbus?
                 // TODO How to handle this? Create timer to keep checking for
                 // object/service to appear? When to stop checking?
-                log<level::ERR>(fmt::format("Unable to get service({}) owner "
+                log<level::ERR>(std::format("Unable to get service({}) owner "
                                             "state for path {}, interface {}",
                                             servName, member, intf)
                                     .c_str());
@@ -167,7 +166,7 @@
                 return std::move(list) + ", " + method.first;
             });
             auto msg =
-                fmt::format("Event '{}' requires a supported method given to "
+                std::format("Event '{}' requires a supported method given to "
                             "be init driven, available methods: {}",
                             eventName, availMethods);
             log<level::ERR>(msg.c_str());
diff --git a/control/json/triggers/parameter.cpp b/control/json/triggers/parameter.cpp
index 6f4eac3..6986608 100644
--- a/control/json/triggers/parameter.cpp
+++ b/control/json/triggers/parameter.cpp
@@ -17,7 +17,7 @@
 
 #include "../manager.hpp"
 
-#include <fmt/format.h>
+#include <format>
 
 namespace phosphor::fan::control::json::trigger::parameter
 {
@@ -30,7 +30,7 @@
 {
     if (!jsonObj.contains("parameter"))
     {
-        auto msg = fmt::format(
+        auto msg = std::format(
             "Event '{}' parameter trigger is missing 'parameter'", eventName);
         log<level::ERR>(msg.c_str());
         throw std::runtime_error(msg);
diff --git a/control/json/triggers/signal.cpp b/control/json/triggers/signal.cpp
index 7169d69..5e78d6e 100644
--- a/control/json/triggers/signal.cpp
+++ b/control/json/triggers/signal.cpp
@@ -21,13 +21,12 @@
 #include "handlers.hpp"
 #include "trigger_aliases.hpp"
 
-#include <fmt/format.h>
-
 #include <nlohmann/json.hpp>
 #include <phosphor-logging/log.hpp>
 #include <sdbusplus/bus/match.hpp>
 
 #include <algorithm>
+#include <format>
 #include <functional>
 #include <iterator>
 #include <memory>
@@ -206,7 +205,7 @@
             // TODO How to handle this? Create timer to keep checking for
             // service to appear? When to stop checking?
             log<level::ERR>(
-                fmt::format("Events will not be triggered by name owner changed"
+                std::format("Events will not be triggered by name owner changed"
                             "signals from service of path {}, interface {}",
                             member, group.getInterface())
                     .c_str());
@@ -256,7 +255,7 @@
             return std::move(list) + ", " + signal.first;
             });
         auto msg =
-            fmt::format("Event '{}' requires a supported signal given to be "
+            std::format("Event '{}' requires a supported signal given to be "
                         "triggered by signal, available signals: {}",
                         eventName, availSignals);
         log<level::ERR>(msg.c_str());
diff --git a/control/json/triggers/timer.cpp b/control/json/triggers/timer.cpp
index ce8bba7..2036042 100644
--- a/control/json/triggers/timer.cpp
+++ b/control/json/triggers/timer.cpp
@@ -19,12 +19,11 @@
 #include "group.hpp"
 #include "trigger_aliases.hpp"
 
-#include <fmt/format.h>
-
 #include <nlohmann/json.hpp>
 #include <phosphor-logging/log.hpp>
 
 #include <chrono>
+#include <format>
 
 namespace phosphor::fan::control::json::trigger::timer
 {
@@ -52,7 +51,7 @@
     else
     {
         log<level::ERR>(
-            fmt::format("Timer trigger type '{}' is not supported", type)
+            std::format("Timer trigger type '{}' is not supported", type)
                 .c_str(),
             entry("AVAILABLE_TYPES={oneshot, repeating}"));
         throw std::runtime_error("Unsupported timer trigger type given");
diff --git a/control/json/utils/flight_recorder.cpp b/control/json/utils/flight_recorder.cpp
index 8c8ce06..00325f5 100644
--- a/control/json/utils/flight_recorder.cpp
+++ b/control/json/utils/flight_recorder.cpp
@@ -15,12 +15,11 @@
  */
 #include "flight_recorder.hpp"
 
-#include <fmt/format.h>
-
 #include <phosphor-logging/log.hpp>
 
 #include <algorithm>
 #include <ctime>
+#include <format>
 #include <iomanip>
 #include <sstream>
 #include <vector>
diff --git a/control/json/utils/modifier.cpp b/control/json/utils/modifier.cpp
index 91978e7..c8fb536 100644
--- a/control/json/utils/modifier.cpp
+++ b/control/json/utils/modifier.cpp
@@ -19,10 +19,10 @@
 #include "json/config_base.hpp"
 #include "json/manager.hpp"
 
-#include <fmt/format.h>
-
 #include <phosphor-logging/log.hpp>
 
+#include <format>
+
 using namespace phosphor::logging;
 
 namespace phosphor::fan::control::json
@@ -168,7 +168,7 @@
         if (!valueArray.is_array())
         {
             log<level::ERR>(
-                fmt::format("Invalid JSON data for less_than config: {}",
+                std::format("Invalid JSON data for less_than config: {}",
                             valueArray.dump())
                     .c_str());
             throw std::invalid_argument("Invalid modifier JSON");
@@ -180,7 +180,7 @@
                 !valueEntry.contains("parameter_value"))
             {
                 log<level::ERR>(
-                    fmt::format("Missing arg_value or parameter_value keys "
+                    std::format("Missing arg_value or parameter_value keys "
                                 "in less_than config: {}",
                                 valueArray.dump())
                         .c_str());
@@ -192,7 +192,7 @@
             if (std::holds_alternative<bool>(argVal))
             {
                 log<level::ERR>(
-                    fmt::format(
+                    std::format(
                         "Invalid data type in arg_value key in modifier JSON "
                         "config: {}",
                         valueArray.dump())
@@ -208,7 +208,7 @@
 
         if (rangeValues.empty())
         {
-            log<level::ERR>(fmt::format("No valid range values found in "
+            log<level::ERR>(std::format("No valid range values found in "
                                         "modifier json: {}",
                                         valueArray.dump())
                                 .c_str());
@@ -292,7 +292,7 @@
     if (!jsonObj.contains("operator") || !jsonObj.contains("value"))
     {
         log<level::ERR>(
-            fmt::format(
+            std::format(
                 "Modifier entry in JSON missing 'operator' or 'value': {}",
                 jsonObj.dump())
                 .c_str());
@@ -311,7 +311,7 @@
     }
     else
     {
-        log<level::ERR>(fmt::format("Invalid operator in the modifier JSON: {}",
+        log<level::ERR>(std::format("Invalid operator in the modifier JSON: {}",
                                     jsonObj.dump())
                             .c_str());
         throw std::invalid_argument("Invalid operator in the modifier JSON");
diff --git a/control/json/utils/pcie_card_metadata.cpp b/control/json/utils/pcie_card_metadata.cpp
index 6fd8fd1..8032081 100644
--- a/control/json/utils/pcie_card_metadata.cpp
+++ b/control/json/utils/pcie_card_metadata.cpp
@@ -19,8 +19,7 @@
 #include "json_config.hpp"
 #include "utils/flight_recorder.hpp"
 
-#include <fmt/format.h>
-
+#include <format>
 #include <iostream>
 
 static constexpr auto cardFileName = "pcie_cards.json";
@@ -52,12 +51,12 @@
     {
         FlightRecorder::instance().log(
             "main",
-            fmt::format("Loading configuration from {}", confFile.string()));
+            std::format("Loading configuration from {}", confFile.string()));
         load(JsonConfig::load(confFile));
         FlightRecorder::instance().log(
-            "main", fmt::format("Configuration({}) loaded successfully",
+            "main", std::format("Configuration({}) loaded successfully",
                                 confFile.string()));
-        log<level::INFO>(fmt::format("Configuration({}) loaded successfully",
+        log<level::INFO>(std::format("Configuration({}) loaded successfully",
                                      confFile.string())
                              .c_str());
     }
@@ -80,14 +79,14 @@
         if (fs::exists(confFile))
         {
             FlightRecorder::instance().log(
-                "main", fmt::format("Loading configuration from {}",
+                "main", std::format("Loading configuration from {}",
                                     confFile.string()));
             load(JsonConfig::load(confFile));
             FlightRecorder::instance().log(
-                "main", fmt::format("Configuration({}) loaded successfully",
+                "main", std::format("Configuration({}) loaded successfully",
                                     confFile.string()));
             log<level::INFO>(
-                fmt::format("Configuration({}) loaded successfully",
+                std::format("Configuration({}) loaded successfully",
                             confFile.string())
                     .c_str());
         }
@@ -105,7 +104,7 @@
     if (!json.contains("cards") || !json.at("cards").is_array())
     {
         throw std::runtime_error{
-            fmt::format("Missing 'cards' array in PCIe card JSON")};
+            std::format("Missing 'cards' array in PCIe card JSON")};
     }
 
     for (const auto& card : json.at("cards"))
@@ -169,7 +168,7 @@
                              uint16_t subsystemID,
                              uint16_t subsystemVendorID) const
 {
-    log<level::DEBUG>(fmt::format("Lookup {:#x} ${:#x} {:#x} {:#x}", deviceID,
+    log<level::DEBUG>(std::format("Lookup {:#x} ${:#x} {:#x} {:#x}", deviceID,
                                   vendorID, subsystemID, subsystemVendorID)
                           .c_str());
     auto card = std::find_if(_cards.begin(), _cards.end(),
diff --git a/control/json/zone.cpp b/control/json/zone.cpp
index 2e31465..487a7d4 100644
--- a/control/json/zone.cpp
+++ b/control/json/zone.cpp
@@ -81,7 +81,7 @@
         if (_defaultFloor > _ceiling)
         {
             log<level::ERR>(
-                fmt::format("Configured default_floor({}) above ceiling({}), "
+                std::format("Configured default_floor({}) above ceiling({}), "
                             "setting default floor to ceiling",
                             _defaultFloor, _ceiling)
                     .c_str());
@@ -149,7 +149,7 @@
         {
             FlightRecorder::instance().log(
                 "zone-set-target" + getName(),
-                fmt::format("Set target {} (from {})", target, _target));
+                std::format("Set target {} (from {})", target, _target));
         }
         _target = target;
         for (auto& fan : _fans)
@@ -173,7 +173,7 @@
     else
     {
         log<level::DEBUG>(
-            fmt::format("Configured fan {} not found in zone {} to lock target",
+            std::format("Configured fan {} not found in zone {} to lock target",
                         fname, getName())
                 .c_str());
     }
@@ -196,7 +196,7 @@
     else
     {
         log<level::DEBUG>(
-            fmt::format(
+            std::format(
                 "Configured fan {} not found in zone {} to unlock target",
                 fname, getName())
                 .c_str());
@@ -214,7 +214,7 @@
         {
             FlightRecorder::instance().log(
                 "zone-target"s + getName(),
-                fmt::format("{} is removing target hold", ident));
+                std::format("{} is removing target hold", ident));
         }
     }
     else
@@ -224,7 +224,7 @@
         {
             FlightRecorder::instance().log(
                 "zone-target"s + getName(),
-                fmt::format("{} is setting target hold to {}", ident, target));
+                std::format("{} is setting target hold to {}", ident, target));
         }
         _targetHolds[ident] = target;
         _isActive = false;
@@ -244,7 +244,7 @@
         {
             FlightRecorder::instance().log(
                 "zone-target"s + getName(),
-                fmt::format("Settings fans to target hold of {}",
+                std::format("Settings fans to target hold of {}",
                             itHoldMax->second));
         }
 
@@ -272,7 +272,7 @@
         {
             FlightRecorder::instance().log(
                 "zone-floor"s + getName(),
-                fmt::format("{} is removing floor hold", ident));
+                std::format("{} is removing floor hold", ident));
         }
     }
     else
@@ -282,7 +282,7 @@
         {
             FlightRecorder::instance().log(
                 "zone-floor"s + getName(),
-                fmt::format("{} is setting floor hold to {}", ident, target));
+                std::format("{} is setting floor hold to {}", ident, target));
         }
         _floorHolds[ident] = target;
     }
@@ -303,7 +303,7 @@
         {
             FlightRecorder::instance().log(
                 "zone-floor"s + getName(),
-                fmt::format("No set floor exists, using default floor",
+                std::format("No set floor exists, using default floor",
                             _defaultFloor));
         }
         _floor = _defaultFloor;
@@ -314,7 +314,7 @@
         {
             FlightRecorder::instance().log(
                 "zone-floor"s + getName(),
-                fmt::format("Setting new floor to {}", itHoldMax->second));
+                std::format("Setting new floor to {}", itHoldMax->second));
         }
         _floor = itHoldMax->second;
     }
diff --git a/cooling-type/cooling_type.cpp b/cooling-type/cooling_type.cpp
index c82dbe0..2df84bd 100644
--- a/cooling-type/cooling_type.cpp
+++ b/cooling-type/cooling_type.cpp
@@ -4,7 +4,6 @@
 #include "utility.hpp"
 
 #include <fcntl.h>
-#include <fmt/format.h>
 #include <libevdev/libevdev.h>
 #include <unistd.h>
 
@@ -14,6 +13,8 @@
 #include <sdbusplus/bus.hpp>
 #include <xyz/openbmc_project/Common/error.hpp>
 
+#include <format>
+
 namespace phosphor
 {
 namespace cooling
@@ -37,7 +38,7 @@
     }
 
     log<level::ERR>(
-        fmt::format(
+        std::format(
             "Failed to get libevdev from file descriptor {}, return code {}",
             fd, rc)
             .c_str());
@@ -69,7 +70,7 @@
     if (0 == fetch_rc)
     {
         log<level::ERR>(
-            fmt::format("Device does not support event type keycode {}",
+            std::format("Device does not support event type keycode {}",
                         keycode)
                 .c_str());
         elog<InternalFailure>();
diff --git a/cooling-type/main.cpp b/cooling-type/main.cpp
index c4dc57f..2c31757 100644
--- a/cooling-type/main.cpp
+++ b/cooling-type/main.cpp
@@ -1,12 +1,11 @@
 #include "cooling_type.hpp"
 #include "sdbusplus.hpp"
 
-#include <fmt/format.h>
-
 #include <CLI/CLI.hpp>
 #include <phosphor-logging/log.hpp>
 #include <sdbusplus/bus.hpp>
 
+#include <format>
 #include <iostream>
 #include <memory>
 
@@ -83,7 +82,7 @@
     }
     catch (const DBusMethodError& dme)
     {
-        log<level::ERR>(fmt::format("Uncaught DBus method failure exception "
+        log<level::ERR>(std::format("Uncaught DBus method failure exception "
                                     "Busname: {} "
                                     "Path: {} "
                                     "Interface: {} "
diff --git a/hwmon_ffdc.cpp b/hwmon_ffdc.cpp
index d8069e4..cd8417a 100644
--- a/hwmon_ffdc.cpp
+++ b/hwmon_ffdc.cpp
@@ -2,10 +2,9 @@
 
 #include "logging.hpp"
 
-#include <fmt/format.h>
-
 #include <array>
 #include <filesystem>
+#include <format>
 #include <fstream>
 #include <string>
 #include <vector>
@@ -28,7 +27,7 @@
     if (!pipe)
     {
         getLogger().log(
-            fmt::format("popen() failed when running command: {}", command));
+            std::format("popen() failed when running command: {}", command));
         return output;
     }
     while (fgets(buffer.data(), buffer.size(), pipe.get()) != nullptr)
@@ -46,7 +45,7 @@
 
     if (!fs::exists(hwmonBaseDir))
     {
-        getLogger().log(fmt::format("Hwmon base directory {} doesn't exist",
+        getLogger().log(std::format("Hwmon base directory {} doesn't exist",
                                     hwmonBaseDir.native()));
         return hwmonNames;
     }
@@ -76,7 +75,7 @@
     catch (const std::exception& e)
     {
         getLogger().log(
-            fmt::format("Error traversing hwmon directories: {}", e.what()));
+            std::format("Error traversing hwmon directories: {}", e.what()));
     }
 
     return hwmonNames;
diff --git a/json_config.hpp b/json_config.hpp
index b12cdb9..c3f041f 100644
--- a/json_config.hpp
+++ b/json_config.hpp
@@ -17,14 +17,13 @@
 
 #include "sdbusplus.hpp"
 
-#include <fmt/format.h>
-
 #include <nlohmann/json.hpp>
 #include <phosphor-logging/log.hpp>
 #include <sdbusplus/bus.hpp>
 #include <sdeventplus/source/signal.hpp>
 
 #include <filesystem>
+#include <format>
 #include <fstream>
 
 namespace phosphor::fan
@@ -69,7 +68,7 @@
      * @param[in] details - Additional details
      */
     NoConfigFound(const std::string& appName, const std::string& fileName) :
-        std::runtime_error(fmt::format("JSON configuration not found [Could "
+        std::runtime_error(std::format("JSON configuration not found [Could "
                                        "not find fan {} conf file {}]",
                                        appName, fileName)
                                .c_str())
@@ -271,7 +270,7 @@
         if (!confFile.empty() && fs::exists(confFile))
         {
             log<level::INFO>(
-                fmt::format("Loading configuration from {}", confFile.string())
+                std::format("Loading configuration from {}", confFile.string())
                     .c_str());
             file.open(confFile);
             try
@@ -282,12 +281,12 @@
             catch (const std::exception& e)
             {
                 log<level::ERR>(
-                    fmt::format(
+                    std::format(
                         "Failed to parse JSON config file: {}, error: {}",
                         confFile.string(), e.what())
                         .c_str());
                 throw std::runtime_error(
-                    fmt::format(
+                    std::format(
                         "Failed to parse JSON config file: {}, error: {}",
                         confFile.string(), e.what())
                         .c_str());
@@ -295,11 +294,11 @@
         }
         else
         {
-            log<level::ERR>(fmt::format("Unable to open JSON config file: {}",
+            log<level::ERR>(std::format("Unable to open JSON config file: {}",
                                         confFile.string())
                                 .c_str());
             throw std::runtime_error(
-                fmt::format("Unable to open JSON config file: {}",
+                std::format("Unable to open JSON config file: {}",
                             confFile.string())
                     .c_str());
         }
diff --git a/logger.hpp b/logger.hpp
index 87590e8..77ad13a 100644
--- a/logger.hpp
+++ b/logger.hpp
@@ -2,7 +2,6 @@
 
 #include "utility.hpp"
 
-#include <fmt/format.h>
 #include <unistd.h>
 
 #include <nlohmann/json.hpp>
@@ -11,6 +10,7 @@
 #include <cassert>
 #include <ctime>
 #include <filesystem>
+#include <format>
 #include <fstream>
 #include <iomanip>
 #include <sstream>
@@ -137,12 +137,12 @@
 
         for (const auto& [time, message] : _entries)
         {
-            auto line = fmt::format("{}: {}\n", time, message);
+            auto line = std::format("{}: {}\n", time, message);
             auto rc = write(fd(), line.data(), line.size());
             if (rc == -1)
             {
                 auto e = errno;
-                auto msg = fmt::format(
+                auto msg = std::format(
                     "Could not write to temp file {} errno {}", tmpFile, e);
                 log(msg, Logger::error);
                 throw std::runtime_error{msg};
diff --git a/monitor/fan.cpp b/monitor/fan.cpp
index 2c29cb3..fc408de 100644
--- a/monitor/fan.cpp
+++ b/monitor/fan.cpp
@@ -21,10 +21,10 @@
 #include "types.hpp"
 #include "utility.hpp"
 
-#include <fmt/format.h>
-
 #include <phosphor-logging/log.hpp>
 
+#include <format>
+
 namespace phosphor
 {
 namespace fan
@@ -122,7 +122,7 @@
         if (!_present)
         {
             getLogger().log(
-                fmt::format("On startup, fan {} is missing", _name));
+                std::format("On startup, fan {} is missing", _name));
             if (_system.isPowerOn() && _fanMissingErrorTimer)
             {
                 _fanMissingErrorTimer->restartOnce(
@@ -161,7 +161,7 @@
 
     if (!_present)
     {
-        getLogger().log(fmt::format(
+        getLogger().log(std::format(
             "New fan {} interface added and fan is not present", _name));
         if (_system.isPowerOn() && _fanMissingErrorTimer)
         {
@@ -195,7 +195,7 @@
                 // The tach property still isn't on D-Bus. Ensure
                 // sensor is nonfunctional, but skip creating an
                 // error for it since it isn't a fan problem.
-                getLogger().log(fmt::format(
+                getLogger().log(std::format(
                     "Monitoring starting but {} sensor value not on D-Bus",
                     sensor->name()));
 
@@ -384,7 +384,7 @@
     // isn't on D-Bus as this isn't a fan hardware problem.
     sensor.setFunctional(!sensor.functional(), !sensor.hasOwner());
 
-    getLogger().log(fmt::format(
+    getLogger().log(std::format(
         "Setting tach sensor {} functional state to {}. "
         "[target = {}, actual = {}, allowed range = ({} - {}) "
         "owned = {}]",
@@ -402,7 +402,7 @@
         if (!_setFuncOnPresent && !_functional &&
             !(numNonFuncSensors >= _numSensorFailsForNonFunc))
         {
-            getLogger().log(fmt::format("Setting fan {} to functional, number "
+            getLogger().log(std::format("Setting fan {} to functional, number "
                                         "of nonfunctional sensors = {}",
                                         _name, numNonFuncSensors));
             updateInventory(true);
@@ -413,7 +413,7 @@
         // the fan to nonfunctional.
         if (_functional && (numNonFuncSensors >= _numSensorFailsForNonFunc))
         {
-            getLogger().log(fmt::format("Setting fan {} to nonfunctional, "
+            getLogger().log(std::format("Setting fan {} to nonfunctional, "
                                         "number of nonfunctional sensors = {}",
                                         _name, numNonFuncSensors));
             updateInventory(false);
@@ -451,7 +451,7 @@
         dbusError = true;
 
         getLogger().log(
-            fmt::format("D-Bus Exception reading/updating inventory : {}",
+            std::format("D-Bus Exception reading/updating inventory : {}",
                         e.what()),
             Logger::error);
     }
@@ -475,7 +475,7 @@
         _present = std::get<bool>(presentProp->second);
 
         getLogger().log(
-            fmt::format("Fan {} presence state change to {}", _name, _present));
+            std::format("Fan {} presence state change to {}", _name, _present));
 
         if (_present && _setFuncOnPresent)
         {
@@ -550,7 +550,7 @@
                 // Properties still aren't on D-Bus.  Let startMonitor()
                 // deal with it, or maybe System::powerStateChanged() if
                 // there aren't any sensors at all on D-Bus.
-                getLogger().log(fmt::format(
+                getLogger().log(std::format(
                     "At power on, tach sensor {} value not on D-Bus",
                     sensor->name()));
             }
@@ -572,7 +572,7 @@
         else
         {
             getLogger().log(
-                fmt::format("At power on, fan {} is missing", _name));
+                std::format("At power on, fan {} is missing", _name));
 
             if (_fanMissingErrorTimer)
             {
diff --git a/monitor/fan_error.cpp b/monitor/fan_error.cpp
index f0a6f32..396b731 100644
--- a/monitor/fan_error.cpp
+++ b/monitor/fan_error.cpp
@@ -73,7 +73,7 @@
     if (_fd() == -1)
     {
         auto e = errno;
-        getLogger().log(fmt::format("Could not open FFDC file {}. errno {}",
+        getLogger().log(std::format("Could not open FFDC file {}. errno {}",
                                     _name.string(), e));
     }
 }
@@ -120,7 +120,7 @@
     catch (const DBusError& e)
     {
         getLogger().log(
-            fmt::format("Call to create a {} error for fan {} failed: {}",
+            std::format("Call to create a {} error for fan {} failed: {}",
                         _errorName, _fanName, e.what()),
             Logger::error);
     }
@@ -164,7 +164,7 @@
     catch (const std::exception& e)
     {
         log<level::ERR>(
-            fmt::format("Could not save log contents in FFDC. Error msg: {}",
+            std::format("Could not save log contents in FFDC. Error msg: {}",
                         e.what())
                 .c_str());
     }
@@ -194,7 +194,7 @@
     else
     {
         auto e = errno;
-        getLogger().log(fmt::format("Failed called to mkstemp, errno = {}", e),
+        getLogger().log(std::format("Failed called to mkstemp, errno = {}", e),
                         Logger::error);
     }
     return nullptr;
diff --git a/monitor/json_parser.cpp b/monitor/json_parser.cpp
index 4d06540..b5b7291 100644
--- a/monitor/json_parser.cpp
+++ b/monitor/json_parser.cpp
@@ -23,12 +23,11 @@
 #include "tach_sensor.hpp"
 #include "types.hpp"
 
-#include <fmt/format.h>
-
 #include <nlohmann/json.hpp>
 #include <phosphor-logging/log.hpp>
 
 #include <algorithm>
+#include <format>
 #include <map>
 #include <memory>
 #include <optional>
@@ -213,7 +212,7 @@
         auto deviation = fan["deviation"].get<size_t>();
         if (100 < deviation)
         {
-            auto msg = fmt::format(
+            auto msg = std::format(
                 "Invalid deviation of {} found, must be between 0 and 100",
                 deviation);
 
@@ -230,7 +229,7 @@
             if (100 < upperDeviation)
             {
                 auto msg =
-                    fmt::format("Invalid upper_deviation of {} found, must "
+                    std::format("Invalid upper_deviation of {} found, must "
                                 "be between 0 and 100",
                                 upperDeviation);
 
@@ -409,7 +408,7 @@
         }
         else if (state != "runtime")
         {
-            auto msg = fmt::format("Invalid power off state entry {}", state);
+            auto msg = std::format("Invalid power off state entry {}", state);
             log<level::ERR>(msg.c_str());
             throw std::runtime_error(msg.c_str());
         }
@@ -449,7 +448,7 @@
     else
     {
         auto msg =
-            fmt::format("Invalid power off cause {} in power off config JSON",
+            std::format("Invalid power off cause {} in power off config JSON",
                         powerOffCause);
         log<level::ERR>(msg.c_str());
         throw std::runtime_error(msg.c_str());
@@ -509,7 +508,7 @@
     }
     else
     {
-        auto msg = fmt::format("Invalid 'type' entry {} in power off config",
+        auto msg = std::format("Invalid 'type' entry {} in power off config",
                                type);
         log<level::ERR>(msg.c_str());
         throw std::runtime_error(msg.c_str());
diff --git a/monitor/power_interface.cpp b/monitor/power_interface.cpp
index f6589b8..dbfcfda 100644
--- a/monitor/power_interface.cpp
+++ b/monitor/power_interface.cpp
@@ -49,7 +49,7 @@
     catch (const std::exception& e)
     {
         getLogger().log(
-            fmt::format("Caught exception while creating BMC dump: {}",
+            std::format("Caught exception while creating BMC dump: {}",
                         e.what()),
             Logger::error);
     }
diff --git a/monitor/power_off_action.hpp b/monitor/power_off_action.hpp
index c833038..6d7580b 100644
--- a/monitor/power_off_action.hpp
+++ b/monitor/power_off_action.hpp
@@ -4,13 +4,12 @@
 #include "power_interface.hpp"
 #include "sdbusplus.hpp"
 
-#include <fmt/format.h>
-
 #include <sdeventplus/clock.hpp>
 #include <sdeventplus/event.hpp>
 #include <sdeventplus/utility/timer.hpp>
 
 #include <chrono>
+#include <format>
 
 namespace phosphor::fan::monitor
 {
@@ -113,7 +112,7 @@
         catch (const std::exception& e)
         {
             getLogger().log(
-                fmt::format("Caught exception while creating BMC dump: {}",
+                std::format("Caught exception while creating BMC dump: {}",
                             e.what()),
                 Logger::error);
         }
@@ -215,7 +214,7 @@
         }
 
         getLogger().log(
-            fmt::format("Action '{}' executing hard power off", name()));
+            std::format("Action '{}' executing hard power off", name()));
         _powerIface->hardPowerOff();
 
         createBmcDump();
@@ -307,7 +306,7 @@
         }
 
         getLogger().log(
-            fmt::format("Action '{}' executing soft power off", name()));
+            std::format("Action '{}' executing soft power off", name()));
         _powerIface->softPowerOff();
 
         createBmcDump();
@@ -380,7 +379,7 @@
     void start() override
     {
         getLogger().log(
-            fmt::format("Action {}: Starting service mode timer", name()));
+            std::format("Action {}: Starting service mode timer", name()));
 
         _serviceModeTimer.restartOnce(_serviceModeDelay);
     }
@@ -393,7 +392,7 @@
      */
     void serviceModeTimerExpired()
     {
-        getLogger().log(fmt::format(
+        getLogger().log(std::format(
             "Action {}: Service mode timer expired, starting meltdown timer",
             name()));
 
@@ -408,7 +407,7 @@
      */
     void meltdownTimerExpired()
     {
-        getLogger().log(fmt::format(
+        getLogger().log(std::format(
             "Action {}: Meltdown timer expired, executing hard power off",
             name()));
 
diff --git a/monitor/power_off_rule.hpp b/monitor/power_off_rule.hpp
index 3172bd5..ad17870 100644
--- a/monitor/power_off_rule.hpp
+++ b/monitor/power_off_rule.hpp
@@ -84,7 +84,7 @@
         {
             // Start the action
             getLogger().log(
-                fmt::format("Starting shutdown action '{}' due to cause '{}'",
+                std::format("Starting shutdown action '{}' due to cause '{}'",
                             _action->name(), _cause->name()));
 
             _active = true;
@@ -95,13 +95,13 @@
             // Attempt to cancel the action, but don't force it
             if (_action->cancel(false))
             {
-                getLogger().log(fmt::format("Stopped shutdown action '{}'",
+                getLogger().log(std::format("Stopped shutdown action '{}'",
                                             _action->name()));
                 _active = false;
             }
             else
             {
-                getLogger().log(fmt::format(
+                getLogger().log(std::format(
                     "Could not stop shutdown action '{}'", _action->name()));
             }
         }
diff --git a/monitor/system.cpp b/monitor/system.cpp
index 4a33bb5..bb2e95e 100644
--- a/monitor/system.cpp
+++ b/monitor/system.cpp
@@ -167,7 +167,7 @@
                 if (serviceObjects.end() == itServ || itServ->second.empty())
                 {
                     getLogger().log(
-                        fmt::format("Fan sensor entry {} not found in D-Bus",
+                        std::format("Fan sensor entry {} not found in D-Bus",
                                     sensor->name()),
                         Logger::error);
                     continue;
@@ -304,7 +304,7 @@
     bool hasOwner = !newOwner.empty() && oldOwner.empty();
 
     std::string stateStr(hasOwner ? "online" : "offline");
-    getLogger().log(fmt::format("Changing sensors for service {} to {}",
+    getLogger().log(std::format("Changing sensors for service {} to {}",
                                 serviceName, stateStr),
                     Logger::info);
 
@@ -429,7 +429,7 @@
     std::string fanPath{util::INVENTORY_PATH + fan.getName()};
 
     getLogger().log(
-        fmt::format("Creating event log for faulted fan {} sensor {}", fanPath,
+        std::format("Creating event log for faulted fan {} sensor {}", fanPath,
                     sensor.name()),
         Logger::error);
 
@@ -473,7 +473,7 @@
     std::string fanPath{util::INVENTORY_PATH + fan.getName()};
 
     getLogger().log(
-        fmt::format("Creating event log for missing fan {}", fanPath),
+        std::format("Creating event log for missing fan {}", fanPath),
         Logger::error);
 
     auto error = std::make_unique<FanError>(
@@ -568,7 +568,7 @@
     catch (const std::exception& e)
     {
         getLogger().log(
-            fmt::format("Caught exception while creating BMC dump: {}",
+            std::format("Caught exception while creating BMC dump: {}",
                         e.what()),
             Logger::error);
     }
diff --git a/monitor/tach_sensor.cpp b/monitor/tach_sensor.cpp
index 3030d5c..1d92231 100644
--- a/monitor/tach_sensor.cpp
+++ b/monitor/tach_sensor.cpp
@@ -19,12 +19,11 @@
 #include "sdbusplus.hpp"
 #include "utility.hpp"
 
-#include <fmt/format.h>
-
 #include <phosphor-logging/elog.hpp>
 #include <phosphor-logging/log.hpp>
 
 #include <filesystem>
+#include <format>
 #include <functional>
 #include <optional>
 #include <utility>
@@ -321,7 +320,7 @@
     if (!timerRunning() || mode != _timerMode)
     {
         log<level::DEBUG>(
-            fmt::format("Start timer({}) on tach sensor {}. [delay = {}s]",
+            std::format("Start timer({}) on tach sensor {}. [delay = {}s]",
                         static_cast<int>(mode), _name,
                         duration_cast<seconds>(getDelay(mode)).count())
                 .c_str());
@@ -357,7 +356,7 @@
         {
             ++_counter;
             log<level::DEBUG>(
-                fmt::format(
+                std::format(
                     "Incremented error counter on {} to {} (threshold {})",
                     _name, _counter, _threshold)
                     .c_str());
@@ -369,7 +368,7 @@
         {
             --_counter;
             log<level::DEBUG>(
-                fmt::format(
+                std::format(
                     "Decremented error counter on {} to {} (threshold {})",
                     _name, _counter, _threshold)
                     .c_str());
@@ -382,7 +381,7 @@
     if (_countTimer)
     {
         log<level::DEBUG>(
-            fmt::format("Starting count timer on sensor {}", _name).c_str());
+            std::format("Starting count timer on sensor {}", _name).c_str());
         _countTimer->restart(std::chrono::seconds(_countInterval));
     }
 }
@@ -392,7 +391,7 @@
     if (_countTimer && _countTimer->isEnabled())
     {
         log<level::DEBUG>(
-            fmt::format("Stopping count timer on tach sensor {}.", _name)
+            std::format("Stopping count timer on tach sensor {}.", _name)
                 .c_str());
         _countTimer->setEnabled(false);
     }
diff --git a/monitor/tach_sensor.hpp b/monitor/tach_sensor.hpp
index b4dc5b5..1468ab1 100644
--- a/monitor/tach_sensor.hpp
+++ b/monitor/tach_sensor.hpp
@@ -1,7 +1,5 @@
 #pragma once
 
-#include <fmt/format.h>
-
 #include <phosphor-logging/log.hpp>
 #include <sdbusplus/bus.hpp>
 #include <sdbusplus/bus/match.hpp>
@@ -11,6 +9,7 @@
 
 #include <chrono>
 #include <deque>
+#include <format>
 #include <optional>
 #include <utility>
 
@@ -287,7 +286,7 @@
     inline void stopTimer()
     {
         phosphor::logging::log<phosphor::logging::level::DEBUG>(
-            fmt::format("Stop running timer on tach sensor {}.", _name)
+            std::format("Stop running timer on tach sensor {}.", _name)
                 .c_str());
         _timer.setEnabled(false);
     }
diff --git a/power_state.hpp b/power_state.hpp
index 24b6c9d..478b596 100644
--- a/power_state.hpp
+++ b/power_state.hpp
@@ -2,8 +2,6 @@
 
 #include "sdbusplus.hpp"
 
-#include <fmt/format.h>
-
 #include <phosphor-logging/log.hpp>
 #include <xyz/openbmc_project/State/Host/server.hpp>
 
diff --git a/presence/error_reporter.cpp b/presence/error_reporter.cpp
index 1b46bdf..790a260 100644
--- a/presence/error_reporter.cpp
+++ b/presence/error_reporter.cpp
@@ -20,13 +20,14 @@
 #include "psensor.hpp"
 #include "utility.hpp"
 
-#include <fmt/format.h>
 #include <unistd.h>
 
 #include <phosphor-logging/log.hpp>
 #include <xyz/openbmc_project/Logging/Create/server.hpp>
 #include <xyz/openbmc_project/Logging/Entry/server.hpp>
 
+#include <format>
+
 namespace phosphor::fan::presence
 {
 
@@ -108,7 +109,7 @@
         present = std::get<bool>(presentProp->second);
         if (_fanStates[fanPath] != present)
         {
-            getLogger().log(fmt::format("Fan {} presence state change to {}",
+            getLogger().log(std::format("Fan {} presence state change to {}",
                                         fanPath, present));
 
             _fanStates[fanPath] = present;
@@ -147,7 +148,7 @@
 void ErrorReporter::fanMissingTimerExpired(const std::string& fanPath)
 {
     getLogger().log(
-        fmt::format("Creating event log for missing fan {}", fanPath),
+        std::format("Creating event log for missing fan {}", fanPath),
         Logger::error);
 
     std::map<std::string, std::string> additionalData;
@@ -184,7 +185,7 @@
     catch (const util::DBusError& e)
     {
         getLogger().log(
-            fmt::format(
+            std::format(
                 "Call to create an error log for missing fan {} failed: {}",
                 fanPath, e.what()),
             Logger::error);
@@ -208,7 +209,7 @@
         if (missing)
         {
             getLogger().log(
-                fmt::format("At power on, there are {} missing fans", missing));
+                std::format("At power on, there are {} missing fans", missing));
         }
     }
 
diff --git a/presence/fallback.cpp b/presence/fallback.cpp
index a3c5e72..f301ac1 100644
--- a/presence/fallback.cpp
+++ b/presence/fallback.cpp
@@ -18,11 +18,10 @@
 #include "fan.hpp"
 #include "psensor.hpp"
 
-#include <fmt/format.h>
-
 #include <phosphor-logging/log.hpp>
 
 #include <algorithm>
+#include <format>
 
 namespace phosphor
 {
@@ -54,7 +53,7 @@
                 ++activeSensor;
             }
             phosphor::logging::log<phosphor::logging::level::INFO>(
-                fmt::format("Using backup presence sensor for fan {}",
+                std::format("Using backup presence sensor for fan {}",
                             std::get<1>(fan))
                     .c_str());
             activeSensor = it;
@@ -92,7 +91,7 @@
     if (activeSensor != sensors.begin())
     {
         phosphor::logging::log<phosphor::logging::level::INFO>(
-            fmt::format("Using backup presence sensor for fan {}",
+            std::format("Using backup presence sensor for fan {}",
                         std::get<1>(fan))
                 .c_str());
     }
diff --git a/presence/gpio.cpp b/presence/gpio.cpp
index 8e4a6d2..ceba1c6 100644
--- a/presence/gpio.cpp
+++ b/presence/gpio.cpp
@@ -109,7 +109,7 @@
     ad.emplace("GPIO_DEVICE_PATH", (phys.c_str()));
 
     getLogger().log(
-        fmt::format("GPIO presence detect for fan {} said not present but "
+        std::format("GPIO presence detect for fan {} said not present but "
                     "other methods indicated present",
                     fanInventoryPath));
     try
@@ -121,7 +121,7 @@
     catch (const util::DBusError& e)
     {
         getLogger().log(
-            fmt::format("Call to create a {} error for fan {} failed: {}",
+            std::format("Call to create a {} error for fan {} failed: {}",
                         errorName, fanInventoryPath, e.what()),
             Logger::error);
     }
diff --git a/presence/json_parser.cpp b/presence/json_parser.cpp
index 5de827d..70cac08 100644
--- a/presence/json_parser.cpp
+++ b/presence/json_parser.cpp
@@ -309,7 +309,7 @@
         namespace sdlogging = sdbusplus::xyz::openbmc_project::Logging::server;
 
         log<level::ERR>(
-            fmt::format(
+            std::format(
                 "Error creating Gpio device bridge, hardware not detected: {}",
                 e.what())
                 .c_str());
@@ -331,7 +331,7 @@
         }
         catch (const util::DBusError& e)
         {
-            log<level::ERR>(fmt::format("Call to create an error log for "
+            log<level::ERR>(std::format("Call to create an error log for "
                                         "presence-sensor failure failed: {}",
                                         e.what())
                                 .c_str());
diff --git a/presence/tach.cpp b/presence/tach.cpp
index 9fa8256..9f6e105 100644
--- a/presence/tach.cpp
+++ b/presence/tach.cpp
@@ -18,10 +18,9 @@
 #include "logging.hpp"
 #include "rpolicy.hpp"
 
-#include <fmt/format.h>
-
 #include <phosphor-logging/log.hpp>
 
+#include <format>
 #include <string>
 #include <tuple>
 #include <vector>
@@ -75,7 +74,7 @@
 
             std::get<double>(s) = 0;
             log<level::INFO>(
-                fmt::format("Unable to read fan tach sensor {}", tachPath)
+                std::format("Unable to read fan tach sensor {}", tachPath)
                     .c_str());
         }
     }
@@ -144,7 +143,7 @@
 
 void Tach::logConflict(const std::string& fanInventoryPath) const
 {
-    getLogger().log(fmt::format(
+    getLogger().log(std::format(
         "Tach sensor presence detect for fan {} said not present but "
         "other methods indicated present",
         fanInventoryPath));
diff --git a/sdbusplus.hpp b/sdbusplus.hpp
index a5fae30..9627e40 100644
--- a/sdbusplus.hpp
+++ b/sdbusplus.hpp
@@ -1,7 +1,5 @@
 #pragma once
 
-#include <fmt/format.h>
-
 #include <phosphor-logging/elog-errors.hpp>
 #include <phosphor-logging/elog.hpp>
 #include <phosphor-logging/log.hpp>
@@ -10,6 +8,8 @@
 #include <sdbusplus/message.hpp>
 #include <xyz/openbmc_project/Common/error.hpp>
 
+#include <format>
+
 namespace phosphor
 {
 namespace fan
@@ -47,7 +47,7 @@
   public:
     DBusMethodError(const std::string& busName, const std::string& path,
                     const std::string& interface, const std::string& method) :
-        DBusError(fmt::format("DBus method failed: {} {} {} {}", busName, path,
+        DBusError(std::format("DBus method failed: {} {} {} {}", busName, path,
                               interface, method)),
         busName(busName), path(path), interface(interface), method(method)
     {}
@@ -69,7 +69,7 @@
   public:
     DBusServiceError(const std::string& path, const std::string& interface) :
         DBusError(
-            fmt::format("DBus service lookup failed: {} {}", path, interface)),
+            std::format("DBus service lookup failed: {} {}", path, interface)),
         path(path), interface(interface)
     {}
 
@@ -88,7 +88,7 @@
     DBusPropertyError(const std::string& msg, const std::string& busName,
                       const std::string& path, const std::string& interface,
                       const std::string& property) :
-        DBusError(msg + fmt::format(": {} {} {} {}", busName, path, interface,
+        DBusError(msg + std::format(": {} {} {} {}", busName, path, interface,
                                     property)),
         busName(busName), path(path), interface(interface), property(property)
     {}
diff --git a/sensor-monitor/alarm_timestamps.hpp b/sensor-monitor/alarm_timestamps.hpp
index e25d9fc..b5889a9 100644
--- a/sensor-monitor/alarm_timestamps.hpp
+++ b/sensor-monitor/alarm_timestamps.hpp
@@ -18,8 +18,6 @@
 
 #include "types.hpp"
 
-#include <fmt/format.h>
-
 #include <cereal/archives/json.hpp>
 #include <cereal/types/string.hpp>
 #include <cereal/types/tuple.hpp>
@@ -29,6 +27,7 @@
 #include <sdeventplus/utility/timer.hpp>
 
 #include <filesystem>
+#include <format>
 #include <fstream>
 #include <map>
 #include <tuple>
@@ -247,7 +246,7 @@
             std::error_code ec;
             std::filesystem::remove(path, ec);
             log<level::ERR>(
-                fmt::format("Unable to restore persisted times ({}, ec: {})",
+                std::format("Unable to restore persisted times ({}, ec: {})",
                             e.what(), ec.value())
                     .c_str());
         }
diff --git a/sensor-monitor/shutdown_alarm_monitor.cpp b/sensor-monitor/shutdown_alarm_monitor.cpp
index 0828b16..05692c0 100644
--- a/sensor-monitor/shutdown_alarm_monitor.cpp
+++ b/sensor-monitor/shutdown_alarm_monitor.cpp
@@ -17,12 +17,13 @@
 
 #include "shutdown_alarm_monitor.hpp"
 
-#include <fmt/format.h>
 #include <unistd.h>
 
 #include <phosphor-logging/log.hpp>
 #include <xyz/openbmc_project/Logging/Entry/server.hpp>
 
+#include <format>
+
 namespace sensor::monitor
 {
 using namespace phosphor::logging;
@@ -159,7 +160,7 @@
         catch (const DBusServiceError& e)
         {
             // The sensor isn't on D-Bus anymore
-            log<level::INFO>(fmt::format("No {} interface on {} anymore.",
+            log<level::INFO>(std::format("No {} interface on {} anymore.",
                                          interface, sensorPath)
                                  .c_str());
             continue;
@@ -280,7 +281,7 @@
     {
         const uint64_t& original = previousStartTime->second;
 
-        log<level::INFO>(fmt::format("Found previously running {} timer "
+        log<level::INFO>(std::format("Found previously running {} timer "
                                      "for {} with start time {}",
                                      propertyName, sensorPath, original)
                              .c_str());
@@ -302,7 +303,7 @@
         else
         {
             log<level::WARNING>(
-                fmt::format(
+                std::format(
                     "Restarting {} shutdown timer for {} for full "
                     "time because saved time {} is after current time {}",
                     propertyName, sensorPath, original, now)
@@ -311,7 +312,7 @@
     }
 
     log<level::INFO>(
-        fmt::format("Starting {}ms {} shutdown timer due to sensor {} value {}",
+        std::format("Starting {}ms {} shutdown timer due to sensor {} value {}",
                     shutdownDelay.count(), propertyName, sensorPath, *value)
             .c_str());
 
@@ -345,7 +346,7 @@
     createEventLog(alarmKey, false, value);
 
     log<level::INFO>(
-        fmt::format("Stopping {} shutdown timer due to sensor {} value {}",
+        std::format("Stopping {} shutdown timer due to sensor {} value {}",
                     propertyName, sensorPath, value)
             .c_str());
 
@@ -368,7 +369,7 @@
     }
     catch (const std::exception& e)
     {
-        auto message = fmt::format(
+        auto message = std::format(
             "Caught exception while creating BMC dump: {}", e.what());
 
         log<level::ERR>(message.c_str());
@@ -384,7 +385,7 @@
                                                 valueProperty);
 
     log<level::ERR>(
-        fmt::format(
+        std::format(
             "The {} shutdown timer expired for sensor {}, shutting down",
             propertyName, sensorPath)
             .c_str());
diff --git a/sensor-monitor/threshold_alarm_logger.cpp b/sensor-monitor/threshold_alarm_logger.cpp
index 99ed0d6..13058e7 100644
--- a/sensor-monitor/threshold_alarm_logger.cpp
+++ b/sensor-monitor/threshold_alarm_logger.cpp
@@ -17,12 +17,13 @@
 
 #include "sdbusplus.hpp"
 
-#include <fmt/format.h>
 #include <unistd.h>
 
 #include <phosphor-logging/log.hpp>
 #include <xyz/openbmc_project/Logging/Entry/server.hpp>
 
+#include <format>
+
 namespace sensor::monitor
 {
 
@@ -284,7 +285,7 @@
     if (properties == it->second.end())
     {
         log<level::INFO>(
-            fmt::format("Could not find {} in threshold alarms map",
+            std::format("Could not find {} in threshold alarms map",
                         alarmProperty)
                 .c_str());
         return;
@@ -301,7 +302,7 @@
         ad.emplace("SENSOR_VALUE", std::to_string(sensorValue));
 
         log<level::INFO>(
-            fmt::format("Threshold Event {} {} = {} (sensor value {})",
+            std::format("Threshold Event {} {} = {} (sensor value {})",
                         sensorPath, alarmProperty, alarmValue, sensorValue)
                 .c_str());
     }
@@ -311,7 +312,7 @@
         // not be in the mapper yet.  This could only happen if the sensor
         // application was started up after this one and the value exceeded the
         // threshold immediately.
-        log<level::INFO>(fmt::format("Threshold Event {} {} = {}", sensorPath,
+        log<level::INFO>(std::format("Threshold Event {} {} = {}", sensorPath,
                                      alarmProperty, alarmValue)
                              .c_str());
     }
@@ -341,7 +342,7 @@
     if ((sensorPath.back() == '/') || (pos == std::string::npos))
     {
         log<level::ERR>(
-            fmt::format("Cannot get sensor type from sensor path {}",
+            std::format("Cannot get sensor type from sensor path {}",
                         sensorPath)
                 .c_str());
         throw std::runtime_error("Invalid sensor path");
diff --git a/utility.hpp b/utility.hpp
index cbf6205..727b557 100644
--- a/utility.hpp
+++ b/utility.hpp
@@ -1,7 +1,6 @@
 #pragma once
 
 #include <fcntl.h>
-#include <fmt/format.h>
 #include <unistd.h>
 
 #include <phosphor-logging/elog-errors.hpp>
@@ -10,6 +9,8 @@
 #include <sdbusplus/bus.hpp>
 #include <xyz/openbmc_project/Common/error.hpp>
 
+#include <format>
+
 using namespace phosphor::logging;
 using InternalFailure =
     sdbusplus::xyz::openbmc_project::Common::Error::InternalFailure;
@@ -66,7 +67,7 @@
         if (-1 == fd)
         {
             log<level::ERR>(
-                fmt::format("Failed to open file device path {}", pathname)
+                std::format("Failed to open file device path {}", pathname)
                     .c_str());
             elog<InternalFailure>();
         }
