diff --git a/redfish-core/lib/managers.hpp b/redfish-core/lib/managers.hpp
index 44308bb..40848f4 100644
--- a/redfish-core/lib/managers.hpp
+++ b/redfish-core/lib/managers.hpp
@@ -14,6 +14,7 @@
 #include "generated/enums/manager.hpp"
 #include "generated/enums/resource.hpp"
 #include "http_request.hpp"
+#include "led.hpp"
 #include "logging.hpp"
 #include "persistent_data.hpp"
 #include "query.hpp"
@@ -56,6 +57,63 @@
 namespace redfish
 {
 
+inline void handleSetLocationIndicatorActive(
+    const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
+    bool locationIndicatorActive, const std::string& managerId,
+    const boost::system::error_code& ec,
+    const dbus::utility::MapperGetSubTreePathsResponse& subtreePaths)
+{
+    if (ec)
+    {
+        if (ec == boost::system::errc::io_error)
+        {
+            // Not found
+            BMCWEB_LOG_WARNING("Manager {} not found", managerId);
+            messages::resourceNotFound(asyncResp->res, "Manager", managerId);
+            return;
+        }
+        BMCWEB_LOG_ERROR("D-Bus response error {}", ec.value());
+        messages::internalError(asyncResp->res);
+        return;
+    }
+    if (subtreePaths.empty())
+    {
+        BMCWEB_LOG_WARNING("Manager {} not found", managerId);
+        messages::resourceNotFound(asyncResp->res, "Manager", managerId);
+        return;
+    }
+    // Assume only 1 bmc D-Bus object
+    // Throw an error if there is more than 1
+    if (subtreePaths.size() != 1)
+    {
+        BMCWEB_LOG_ERROR("Found {} Bmc D-Bus paths", subtreePaths.size());
+        messages::internalError(asyncResp->res);
+        return;
+    }
+
+    setLocationIndicatorActive(asyncResp, subtreePaths[0],
+                               locationIndicatorActive);
+}
+
+/**
+ * Set the locationIndicatorActive.
+ *
+ * @param[in,out]   asyncResp                   Async HTTP response.
+ * @param[in]       locationIndicatorActive     Value of the property
+ */
+inline void setLocationIndicatorActiveState(
+    const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
+    bool locationIndicatorActive, const std::string& managerId)
+{
+    // GetSubTree on all interfaces which provide info about a Manager
+    constexpr std::array<std::string_view, 1> interfaces = {
+        "xyz.openbmc_project.Inventory.Item.Bmc"};
+    dbus::utility::getSubTreePaths(
+        "/xyz/openbmc_project/inventory", 0, interfaces,
+        std::bind_front(handleSetLocationIndicatorActive, asyncResp,
+                        locationIndicatorActive, managerId));
+}
+
 inline std::string getBMCUpdateServiceName()
 {
     if constexpr (BMCWEB_REDFISH_UPDATESERVICE_USE_DBUS)
@@ -654,6 +712,11 @@
             {
                 getLocation(asyncResp, connectionName, managerPath);
             }
+            else if (interfaceName ==
+                     "xyz.openbmc_project.Association.Definitions")
+            {
+                getLocationIndicatorActive(asyncResp, managerPath);
+            }
         }
     }
 }
@@ -895,6 +958,7 @@
 
                 std::optional<std::string> activeSoftwareImageOdataId;
                 std::optional<std::string> datetime;
+                std::optional<bool> locationIndicatorActive;
                 std::optional<nlohmann::json::object_t> pidControllers;
                 std::optional<nlohmann::json::object_t> fanControllers;
                 std::optional<nlohmann::json::object_t> fanZones;
@@ -906,6 +970,8 @@
                         "DateTime", datetime,                             //
                         "Links/ActiveSoftwareImage/@odata.id",
                         activeSoftwareImageOdataId,                       //
+                        "LocationIndicatorActive",
+                        locationIndicatorActive,                          //
                         "Oem/OpenBmc/Fan/FanControllers", fanControllers, //
                         "Oem/OpenBmc/Fan/FanZones", fanZones,             //
                         "Oem/OpenBmc/Fan/PidControllers", pidControllers, //
@@ -928,6 +994,12 @@
                     setDateTime(asyncResp, *datetime);
                 }
 
+                if (locationIndicatorActive)
+                {
+                    setLocationIndicatorActiveState(
+                        asyncResp, *locationIndicatorActive, managerId);
+                }
+
                 RedfishService::getInstance(app).handleSubRoute(req, asyncResp);
             });
 }
