diff --git a/redfish-core/include/redfish.hpp b/redfish-core/include/redfish.hpp
index 5d5eb7b..e94c0f3 100644
--- a/redfish-core/include/redfish.hpp
+++ b/redfish-core/include/redfish.hpp
@@ -25,6 +25,8 @@
 #include "../lib/managers.hpp"
 #include "../lib/memory.hpp"
 #include "../lib/message_registries.hpp"
+#include "../lib/metric_report.hpp"
+#include "../lib/metric_report_definition.hpp"
 #include "../lib/network_protocol.hpp"
 #include "../lib/pcie.hpp"
 #include "../lib/power.hpp"
@@ -36,6 +38,7 @@
 #include "../lib/storage.hpp"
 #include "../lib/systems.hpp"
 #include "../lib/task.hpp"
+#include "../lib/telemetry_service.hpp"
 #include "../lib/thermal.hpp"
 #include "../lib/update_service.hpp"
 #ifdef BMCWEB_ENABLE_VM_NBDPROXY
@@ -209,6 +212,13 @@
         nodes.emplace_back(std::make_unique<HypervisorInterface>(app));
         nodes.emplace_back(std::make_unique<HypervisorSystem>(app));
 
+        nodes.emplace_back(std::make_unique<TelemetryService>(app));
+        nodes.emplace_back(
+            std::make_unique<MetricReportDefinitionCollection>(app));
+        nodes.emplace_back(std::make_unique<MetricReportDefinition>(app));
+        nodes.emplace_back(std::make_unique<MetricReportCollection>(app));
+        nodes.emplace_back(std::make_unique<MetricReport>(app));
+
         for (const auto& node : nodes)
         {
             node->initPrivileges();
diff --git a/redfish-core/include/utils/telemetry_utils.hpp b/redfish-core/include/utils/telemetry_utils.hpp
new file mode 100644
index 0000000..a3a8156
--- /dev/null
+++ b/redfish-core/include/utils/telemetry_utils.hpp
@@ -0,0 +1,71 @@
+#pragma once
+
+namespace redfish
+{
+
+namespace telemetry
+{
+
+constexpr const char* service = "xyz.openbmc_project.Telemetry";
+constexpr const char* reportInterface = "xyz.openbmc_project.Telemetry.Report";
+constexpr const char* metricReportDefinitionUri =
+    "/redfish/v1/TelemetryService/MetricReportDefinitions/";
+constexpr const char* metricReportUri =
+    "/redfish/v1/TelemetryService/MetricReports/";
+
+inline void getReportCollection(const std::shared_ptr<AsyncResp>& asyncResp,
+                                const std::string& uri)
+{
+    const std::array<const char*, 1> interfaces = {reportInterface};
+
+    crow::connections::systemBus->async_method_call(
+        [asyncResp, uri](const boost::system::error_code ec,
+                         const std::vector<std::string>& reports) {
+            if (ec == boost::system::errc::io_error)
+            {
+                asyncResp->res.jsonValue["Members"] = nlohmann::json::array();
+                asyncResp->res.jsonValue["Members@odata.count"] = 0;
+                return;
+            }
+            if (ec)
+            {
+                BMCWEB_LOG_ERROR << "Dbus method call failed: " << ec;
+                messages::internalError(asyncResp->res);
+                return;
+            }
+
+            nlohmann::json& members = asyncResp->res.jsonValue["Members"];
+            members = nlohmann::json::array();
+
+            for (const std::string& report : reports)
+            {
+                sdbusplus::message::object_path path(report);
+                std::string name = path.filename();
+                if (name.empty())
+                {
+                    BMCWEB_LOG_ERROR << "Received invalid path: " << report;
+                    messages::internalError(asyncResp->res);
+                    return;
+                }
+                members.push_back({{"@odata.id", uri + name}});
+            }
+
+            asyncResp->res.jsonValue["Members@odata.count"] = members.size();
+        },
+        "xyz.openbmc_project.ObjectMapper",
+        "/xyz/openbmc_project/object_mapper",
+        "xyz.openbmc_project.ObjectMapper", "GetSubTreePaths",
+        "/xyz/openbmc_project/Telemetry/Reports/TelemetryService", 1,
+        interfaces);
+}
+
+inline std::string getDbusReportPath(const std::string& id)
+{
+    std::string path =
+        "/xyz/openbmc_project/Telemetry/Reports/TelemetryService/" + id;
+    dbus::utility::escapePathForDbus(path);
+    return path;
+}
+
+} // namespace telemetry
+} // namespace redfish
diff --git a/redfish-core/include/utils/time_utils.hpp b/redfish-core/include/utils/time_utils.hpp
new file mode 100644
index 0000000..dd4ea75
--- /dev/null
+++ b/redfish-core/include/utils/time_utils.hpp
@@ -0,0 +1,78 @@
+#pragma once
+
+#include <chrono>
+#include <string>
+
+namespace redfish
+{
+
+namespace time_utils
+{
+
+namespace details
+{
+
+inline void leftZeroPadding(std::string& str, const std::size_t padding)
+{
+    if (str.size() < padding)
+    {
+        str.insert(0, padding - str.size(), '0');
+    }
+}
+} // namespace details
+
+/**
+ * @brief Convert time value into duration format that is based on ISO 8601.
+ *        Example output: "P12DT1M5.5S"
+ *        Ref: Redfish Specification, Section 9.4.4. Duration values
+ */
+std::string toDurationString(std::chrono::milliseconds ms)
+{
+    if (ms < std::chrono::milliseconds::zero())
+    {
+        return "";
+    }
+
+    std::string fmt;
+    fmt.reserve(sizeof("PxxxxxxxxxxxxDTxxHxxMxx.xxxxxxS"));
+
+    using Days = std::chrono::duration<long, std::ratio<24 * 60 * 60>>;
+    Days days = std::chrono::floor<Days>(ms);
+    ms -= days;
+
+    std::chrono::hours hours = std::chrono::floor<std::chrono::hours>(ms);
+    ms -= hours;
+
+    std::chrono::minutes minutes = std::chrono::floor<std::chrono::minutes>(ms);
+    ms -= minutes;
+
+    std::chrono::seconds seconds = std::chrono::floor<std::chrono::seconds>(ms);
+    ms -= seconds;
+
+    fmt = "P";
+    if (days.count() > 0)
+    {
+        fmt += std::to_string(days.count()) + "D";
+    }
+    fmt += "T";
+    if (hours.count() > 0)
+    {
+        fmt += std::to_string(hours.count()) + "H";
+    }
+    if (minutes.count() > 0)
+    {
+        fmt += std::to_string(minutes.count()) + "M";
+    }
+    if (seconds.count() != 0 || ms.count() != 0)
+    {
+        fmt += std::to_string(seconds.count()) + ".";
+        std::string msStr = std::to_string(ms.count());
+        details::leftZeroPadding(msStr, 3);
+        fmt += msStr + "S";
+    }
+
+    return fmt;
+}
+
+} // namespace time_utils
+} // namespace redfish
