diff --git a/Redfish.md b/Redfish.md
index 0a49af2..252507b 100644
--- a/Redfish.md
+++ b/Redfish.md
@@ -554,6 +554,7 @@
 - Links/ManagerInChassis
 - Links/SoftwareImages
 - Links/SoftwareImages@odata.count
+- LocationIndicatorActive
 - LogServices
 - ManagerType
 - Manufacturer
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);
             });
 }
