diff --git a/entity_name.cpp b/entity_name.cpp
index c070c84..ac04275 100644
--- a/entity_name.cpp
+++ b/entity_name.cpp
@@ -16,25 +16,19 @@
 
 #include "entity_name.hpp"
 
+#include "errors.hpp"
+#include "handler.hpp"
 #include "main.hpp"
 
 #include <cstdint>
 #include <cstring>
-#include <filesystem>
-#include <fstream>
-#include <map>
-#include <nlohmann/json.hpp>
-#include <phosphor-logging/elog-errors.hpp>
-#include <phosphor-logging/log.hpp>
 #include <string>
 #include <vector>
-#include <xyz/openbmc_project/Common/error.hpp>
 
 namespace google
 {
 namespace ipmi
 {
-namespace fs = std::filesystem;
 
 namespace
 {
@@ -44,65 +38,6 @@
 #define MAX_IPMI_BUFFER 64
 #endif
 
-using Json = nlohmann::json;
-
-using namespace phosphor::logging;
-using InternalFailure =
-    sdbusplus::xyz::openbmc_project::Common::Error::InternalFailure;
-
-static constexpr auto configFile =
-    "/usr/share/ipmi-entity-association/entity_association_map.json";
-
-static const std::map<uint8_t, std::string> entityIdToName{
-    {0x03, "cpu"},
-    {0x04, "storage_device"},
-    {0x06, "system_management_module"},
-    {0x08, "memory_module"},
-    {0x0B, "add_in_card"},
-    {0x17, "system_chassis"},
-    {0x20, "memory_device"}};
-
-Json parse_config()
-{
-    std::ifstream jsonFile(configFile);
-    if (!jsonFile.is_open())
-    {
-        log<level::ERR>("Entity association JSON file not found");
-        elog<InternalFailure>();
-    }
-
-    auto data = Json::parse(jsonFile, nullptr, false);
-    if (data.is_discarded())
-    {
-        log<level::ERR>("Entity association JSON parser failure");
-        elog<InternalFailure>();
-    }
-
-    return data;
-}
-
-std::string read(const std::string& type, uint8_t instance, const Json& config)
-{
-    static const std::vector<Json> empty{};
-    std::vector<Json> readings = config.value(type, empty);
-    std::string name = "";
-    for (const auto& j : readings)
-    {
-        uint8_t instanceNum = j.value("instance", 0);
-        // Not the instance we're interested in
-        if (instanceNum != instance)
-        {
-            continue;
-        }
-
-        // Found the instance we're interested in
-        name = j.value("name", "");
-
-        break;
-    }
-    return name;
-}
-
 } // namespace
 
 struct GetEntityNameRequest
@@ -120,7 +55,7 @@
 } __attribute__((packed));
 
 ipmi_ret_t GetEntityName(const uint8_t* reqBuf, uint8_t* replyBuf,
-                         size_t* dataLen)
+                         size_t* dataLen, HandlerInterface* handler)
 {
     struct GetEntityNameRequest request;
 
@@ -132,37 +67,15 @@
     }
 
     std::memcpy(&request, &reqBuf[0], sizeof(request));
-
-    // Check if we support this Entity ID.
-    auto it = entityIdToName.find(request.entity_id);
-    if (it == entityIdToName.end())
-    {
-        log<level::ERR>("Unknown Entity ID",
-                        entry("ENTITY_ID=%d", request.entity_id));
-        return IPMI_CC_INVALID_FIELD_REQUEST;
-    }
-
-    static Json config{};
-    static bool parsed = false;
-
     std::string entityName;
     try
     {
-        // Parse the JSON config file.
-        if (!parsed)
-        {
-            config = parse_config();
-            parsed = true;
-        }
-
-        // Find the "entity id:entity instance" mapping to entity name.
-        entityName = read(it->second, request.entity_instance, config);
-        if (entityName.empty())
-            return IPMI_CC_INVALID_FIELD_REQUEST;
+        entityName =
+            handler->getEntityName(request.entity_id, request.entity_instance);
     }
-    catch (InternalFailure& e)
+    catch (const IpmiException& e)
     {
-        return IPMI_CC_UNSPECIFIED_ERROR;
+        return e.getIpmiError();
     }
 
     int length = sizeof(struct GetEntityNameReply) + entityName.length();
