diff --git a/pldm.cpp b/pldm.cpp
index dc7a280..5ee626a 100644
--- a/pldm.cpp
+++ b/pldm.cpp
@@ -1,5 +1,7 @@
 #include "pldm.hpp"
 
+#include "libpldm/instance-id.h"
+
 #include "file.hpp"
 
 #include <libpldm/entity.h>
@@ -521,39 +523,63 @@
 
 bool Interface::getPldmInstanceId()
 {
+    pldm_instance_id_t id;
     if (!pldmInstanceID)
     {
         // Request new instance ID
-        auto& bus = open_power::occ::utils::getBus();
-        try
+        int rc = pldm_instance_id_alloc(pldmInstanceIdDb, tid, &id);
+        if (rc == -EAGAIN)
         {
-            auto method = bus.new_method_call(
-                "xyz.openbmc_project.PLDM", "/xyz/openbmc_project/pldm",
-                "xyz.openbmc_project.PLDM.Requester", "GetInstanceId");
-            method.append(mctpEid);
-            auto reply = bus.call(method);
-            uint8_t newInstanceId;
-            reply.read(newInstanceId);
-            pldmInstanceID = newInstanceId;
-            if (!throttleTraces)
-            {
-                log<level::INFO>(std::format("pldm: got new InstanceId: {}",
-                                             pldmInstanceID.value())
-                                     .c_str());
-            }
+            std::this_thread::sleep_for(std::chrono::milliseconds(100));
+            rc = pldm_instance_id_alloc(pldmInstanceIdDb, tid, &id);
         }
-        catch (const sdbusplus::exception_t& e)
+
+        if (rc)
         {
             log<level::ERR>(
-                std::format("pldm: GetInstanceId failed: {}", e.what())
+                std::format(
+                    "getPldmInstanceId: Failed to alloc ID for TID {}. RC{}",
+                    tid, rc)
                     .c_str());
             return false;
         }
+        pldmInstanceID.emplace(id);
+        if (!throttleTraces)
+        {
+            log<level::INFO>(
+                std::format("got id {} and set PldmInstanceId to {}", id,
+                            pldmInstanceID.value())
+                    .c_str());
+        }
     }
-
     return true;
 }
 
+void Interface::freePldmInstanceId()
+{
+    if (pldmInstanceID)
+    {
+        int rc = pldm_instance_id_free(pldmInstanceIdDb, tid,
+                                       pldmInstanceID.value());
+        if (rc)
+        {
+            log<level::ERR>(
+                std::format(
+                    "freePldmInstanceId: Failed to free ID {} for TID {}. RC{}",
+                    pldmInstanceID.value(), tid, rc)
+                    .c_str());
+            return;
+        }
+        if (!throttleTraces)
+        {
+            log<level::INFO>(
+                std::format("Freed PLDM instance ID {}", pldmInstanceID.value())
+                    .c_str());
+        }
+        pldmInstanceID = std::nullopt;
+    }
+}
+
 void Interface::sendPldm(const std::vector<uint8_t>& request,
                          const uint8_t instance, const bool rspExpected)
 {
@@ -573,6 +599,7 @@
                 "sendPldm: Failed to connect to MCTP socket, errno={}/{}",
                 openErrno, strerror(openErrno))
                 .c_str());
+        freePldmInstanceId();
         return;
     }
 
@@ -640,11 +667,6 @@
                     sendErrno, strerror(sendErrno))
                     .c_str());
         }
-        else
-        {
-            // Not waiting for response, instance ID should be freed
-            pldmInstanceID = std::nullopt;
-        }
         pldmClose();
     }
 }
@@ -694,6 +716,7 @@
 
 void Interface::pldmClose()
 {
+    freePldmInstanceId();
     if (pldmRspTimer.isEnabled())
     {
         // stop PLDM response timer
diff --git a/pldm.hpp b/pldm.hpp
index 5d093a1..641153f 100644
--- a/pldm.hpp
+++ b/pldm.hpp
@@ -1,8 +1,10 @@
 #pragma once
+
 #include "occ_events.hpp"
 #include "occ_status.hpp"
 #include "utils.hpp"
 
+#include <libpldm/instance-id.h>
 #include <libpldm/pldm.h>
 
 #include <sdbusplus/bus/match.hpp>
@@ -44,7 +46,7 @@
 {
   public:
     Interface() = delete;
-    ~Interface() = default;
+    //~Interface() = default;
     Interface(const Interface&) = delete;
     Interface& operator=(const Interface&) = delete;
     Interface(Interface&&) = delete;
@@ -80,7 +82,22 @@
         pldmRspTimer(
             sdeventplus::utility::Timer<sdeventplus::ClockId::Monotonic>(
                 sdpEvent, std::bind(&Interface::pldmRspExpired, this)))
-    {}
+    {
+        int rc = pldm_instance_db_init_default(&pldmInstanceIdDb);
+        if (rc)
+        {
+            throw std::system_category().default_error_condition(rc);
+        }
+    }
+
+    ~Interface()
+    {
+        int rc = pldm_instance_db_destroy(pldmInstanceIdDb);
+        if (rc)
+        {
+            std::cout << "pldm_instance_db_destroy failed, rc =" << rc << "\n";
+        }
+    }
 
     /** @brief Fetch the state sensor PDRs and populate the cache with
      *         sensorId to OCC/SBE instance mapping information and the sensor
@@ -149,6 +166,10 @@
     void setTraceThrottle(const bool throttle);
 
   private:
+    /** @brief PLDM instance ID database object used to get instance IDs
+     */
+    pldm_instance_db* pldmInstanceIdDb = nullptr;
+
     /** @brief PLDM instance number used in PLDM requests
      */
     std::optional<uint8_t> pldmInstanceID;
@@ -303,12 +324,15 @@
         return (occInstanceToEffecter.empty() ? false : true);
     }
 
-    /** @brief Query PLDM for the MCTP requester instance id
+    /** @brief Get a PLDM requester instance id
      *
      * @return true if the id was found and false if not
      */
     bool getPldmInstanceId();
 
+    /** @brief Free PLDM requester instance id */
+    void freePldmInstanceId();
+
     /** @brief Encode a GetStateSensor command into a PLDM request
      *  @param[in] instance - OCC instance number
      *  @param[in] sensorId - OCC Active sensor ID number
