diff --git a/redfish-core/lib/fan.hpp b/redfish-core/lib/fan.hpp
index 3a9572f..47d65ee 100644
--- a/redfish-core/lib/fan.hpp
+++ b/redfish-core/lib/fan.hpp
@@ -156,4 +156,151 @@
             std::bind_front(handleFanCollectionGet, std::ref(app)));
 }
 
+inline bool checkFanId(const std::string& fanPath, const std::string& fanId)
+{
+    std::string fanName = sdbusplus::message::object_path(fanPath).filename();
+
+    return !(fanName.empty() || fanName != fanId);
+}
+
+static inline void handleFanPath(
+    const std::string& fanId,
+    const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
+    const dbus::utility::MapperGetSubTreePathsResponse& fanPaths,
+    const std::function<void(const std::string& fanPath,
+                             const std::string& service)>& callback)
+{
+    for (const auto& fanPath : fanPaths)
+    {
+        if (!checkFanId(fanPath, fanId))
+        {
+            continue;
+        }
+        dbus::utility::getDbusObject(
+            fanPath, fanInterface,
+            [fanPath, asyncResp,
+             callback](const boost::system::error_code& ec,
+                       const dbus::utility::MapperGetObject& object) {
+            if (ec || object.empty())
+            {
+                BMCWEB_LOG_ERROR << "DBUS response error on getDbusObject "
+                                 << ec.value();
+                messages::internalError(asyncResp->res);
+                return;
+            }
+            callback(fanPath, object.begin()->first);
+            });
+
+        return;
+    }
+    BMCWEB_LOG_WARNING << "Fan not found " << fanId;
+    messages::resourceNotFound(asyncResp->res, "Fan", fanId);
+}
+
+inline void getValidFanPath(
+    const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
+    const std::string& validChassisPath, const std::string& fanId,
+    const std::function<void(const std::string& fanPath,
+                             const std::string& service)>& callback)
+{
+    getFanPaths(
+        asyncResp, validChassisPath,
+        [fanId, asyncResp, callback](
+            const dbus::utility::MapperGetSubTreePathsResponse& fanPaths) {
+        handleFanPath(fanId, asyncResp, fanPaths, callback);
+        });
+}
+
+inline void addFanCommonProperties(crow::Response& resp,
+                                   const std::string& chassisId,
+                                   const std::string& fanId)
+{
+    resp.addHeader(boost::beast::http::field::link,
+                   "</redfish/v1/JsonSchemas/Fan/Fan.json>; rel=describedby");
+    resp.jsonValue["@odata.type"] = "#Fan.v1_3_0.Fan";
+    resp.jsonValue["Name"] = "Fan";
+    resp.jsonValue["Id"] = fanId;
+    resp.jsonValue["@odata.id"] = boost::urls::format(
+        "/redfish/v1/Chassis/{}/ThermalSubsystem/Fans/{}", chassisId, fanId);
+}
+
+inline void
+    afterGetValidFanPath(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
+                         const std::string& chassisId, const std::string& fanId,
+                         const std::string& fanPath, const std::string& service)
+{
+    BMCWEB_LOG_DEBUG << "fanPath = " << fanPath << " service = " << service;
+    addFanCommonProperties(asyncResp->res, chassisId, fanId);
+}
+
+inline void doFanGet(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
+                     const std::string& chassisId, const std::string& fanId,
+                     const std::optional<std::string>& validChassisPath)
+{
+    if (!validChassisPath)
+    {
+        messages::resourceNotFound(asyncResp->res, "Chassis", chassisId);
+        return;
+    }
+
+    getValidFanPath(
+        asyncResp, *validChassisPath, fanId,
+        std::bind_front(afterGetValidFanPath, asyncResp, chassisId, fanId));
+}
+
+inline void handleFanHead(App& app, const crow::Request& req,
+                          const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
+                          const std::string& chassisId,
+                          const std::string& fanId)
+{
+    if (!redfish::setUpRedfishRoute(app, req, asyncResp))
+    {
+        return;
+    }
+
+    redfish::chassis_utils::getValidChassisPath(
+        asyncResp, chassisId,
+        [asyncResp, chassisId,
+         fanId](const std::optional<std::string>& validChassisPath) {
+        if (!validChassisPath)
+        {
+            messages::resourceNotFound(asyncResp->res, "Chassis", chassisId);
+            return;
+        }
+        getValidFanPath(asyncResp, *validChassisPath, fanId,
+                        [asyncResp](const std::string&, const std::string&) {
+            asyncResp->res.addHeader(
+                boost::beast::http::field::link,
+                "</redfish/v1/JsonSchemas/Fan/Fan.json>; rel=describedby");
+        });
+        });
+}
+
+inline void handleFanGet(App& app, const crow::Request& req,
+                         const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
+                         const std::string& chassisId, const std::string& fanId)
+{
+    if (!redfish::setUpRedfishRoute(app, req, asyncResp))
+    {
+        return;
+    }
+
+    redfish::chassis_utils::getValidChassisPath(
+        asyncResp, chassisId,
+        std::bind_front(doFanGet, asyncResp, chassisId, fanId));
+}
+
+inline void requestRoutesFan(App& app)
+{
+    BMCWEB_ROUTE(app, "/redfish/v1/Chassis/<str>/ThermalSubsystem/Fans/<str>/")
+        .privileges(redfish::privileges::headFan)
+        .methods(boost::beast::http::verb::head)(
+            std::bind_front(handleFanHead, std::ref(app)));
+
+    BMCWEB_ROUTE(app, "/redfish/v1/Chassis/<str>/ThermalSubsystem/Fans/<str>/")
+        .privileges(redfish::privileges::getFan)
+        .methods(boost::beast::http::verb::get)(
+            std::bind_front(handleFanGet, std::ref(app)));
+}
+
 } // namespace redfish
