diff --git a/selutility.hpp b/selutility.hpp
index c6ba6b0..ace17d8 100644
--- a/selutility.hpp
+++ b/selutility.hpp
@@ -57,18 +57,6 @@
 static constexpr bool getSelAllocationInfo = false;
 } // namespace operationSupport
 
-/** @struct GetSELEntryRequest
- *
- *  IPMI payload for Get SEL Entry command request.
- */
-struct GetSELEntryRequest
-{
-    uint16_t reservationID; //!< Reservation ID.
-    uint16_t selRecordID;   //!< SEL Record ID.
-    uint8_t offset;         //!< Offset into record.
-    uint8_t readLength;     //!< Bytes to read.
-} __attribute__((packed));
-
 constexpr size_t SELRecordLength = 16;
 
 /** @struct SELEventRecord
diff --git a/storagehandler.cpp b/storagehandler.cpp
index 43cc142..c9cf08d 100644
--- a/storagehandler.cpp
+++ b/storagehandler.cpp
@@ -282,25 +282,17 @@
         ipmi::sel::operationSupport::overflow);
 }
 
-ipmi::Cc getSELEntry(ipmi_netfn_t, ipmi_cmd_t, ipmi_request_t request,
-                     ipmi_response_t response, ipmi_data_len_t data_len,
-                     ipmi_context_t)
+ipmi::RspType<uint16_t,            // Next Record ID
+              std::vector<uint8_t> // SEL data
+              >
+    getSELEntry(uint16_t reservationID, uint16_t selRecordID, uint8_t offset,
+                uint8_t readLength)
 {
-    if (*data_len != sizeof(ipmi::sel::GetSELEntryRequest))
+    if (reservationID != 0)
     {
-        *data_len = 0;
-        return ipmi::ccReqDataLenInvalid;
-    }
-
-    auto requestData =
-        reinterpret_cast<const ipmi::sel::GetSELEntryRequest*>(request);
-
-    if (requestData->reservationID != 0)
-    {
-        if (!checkSELReservation(requestData->reservationID))
+        if (!checkSELReservation(reservationID))
         {
-            *data_len = 0;
-            return ipmi::ccInvalidReservationId;
+            return ipmi::responseInvalidReservationId();
         }
     }
 
@@ -312,18 +304,17 @@
 
     if (selCacheMap.empty())
     {
-        *data_len = 0;
-        return ipmi::ccSensorInvalid;
+        return ipmi::responseSensorInvalid();
     }
 
     SELCacheMap::const_iterator iter;
 
     // Check for the requested SEL Entry.
-    if (requestData->selRecordID == ipmi::sel::firstEntry)
+    if (selRecordID == ipmi::sel::firstEntry)
     {
         iter = selCacheMap.begin();
     }
-    else if (requestData->selRecordID == ipmi::sel::lastEntry)
+    else if (selRecordID == ipmi::sel::lastEntry)
     {
         if (selCacheMap.size() > 1)
         {
@@ -338,11 +329,10 @@
     }
     else
     {
-        iter = selCacheMap.find(requestData->selRecordID);
+        iter = selCacheMap.find(selRecordID);
         if (iter == selCacheMap.end())
         {
-            *data_len = 0;
-            return ipmi::ccSensorInvalid;
+            return ipmi::responseSensorInvalid();
         }
     }
 
@@ -358,35 +348,32 @@
         record.nextRecordID = iter->first;
     }
 
-    if (requestData->readLength == ipmi::sel::entireRecord)
+    uint16_t nextRecordID = record.nextRecordID;
+    std::vector<uint8_t> buffer;
+    if (readLength == ipmi::sel::entireRecord)
     {
-        std::memcpy(response, &record, sizeof(record));
-        *data_len = sizeof(record);
+        buffer.resize(sizeof(record));
+        std::memcpy(buffer.data(), &record.event, sizeof(record.event));
     }
     else
     {
-        if (requestData->offset >= ipmi::sel::selRecordSize ||
-            requestData->readLength > ipmi::sel::selRecordSize)
+        if (offset >= ipmi::sel::selRecordSize ||
+            readLength > ipmi::sel::selRecordSize)
         {
-            *data_len = 0;
-            return ipmi::ccInvalidFieldRequest;
+            return ipmi::responseInvalidFieldRequest();
         }
 
-        auto diff = ipmi::sel::selRecordSize - requestData->offset;
-        auto readLength =
-            std::min(diff, static_cast<int>(requestData->readLength));
+        auto diff = ipmi::sel::selRecordSize - offset;
+        auto minReadLength = std::min(diff, static_cast<int>(readLength));
 
-        uint16_t nextRecordID = record.nextRecordID;
-        std::memcpy(response, &nextRecordID, sizeof(nextRecordID));
-
+        buffer.resize(minReadLength);
         const ipmi::sel::SELEventRecordFormat* evt = &record.event;
-        std::memcpy(static_cast<uint8_t*>(response) + sizeof(nextRecordID),
-                    reinterpret_cast<const uint8_t*>(evt) + requestData->offset,
-                    readLength);
-        *data_len = sizeof(nextRecordID) + readLength;
+        std::memcpy(buffer.data(),
+                    reinterpret_cast<const uint8_t*>(evt) + offset,
+                    minReadLength);
     }
 
-    return ipmi::ccSuccess;
+    return ipmi::responseSuccess(nextRecordID, buffer);
 }
 
 /** @brief implements the delete SEL entry command
@@ -893,8 +880,9 @@
                           ipmiStorageGetSelTimeUtcOffset);
 
     // <Get SEL Entry>
-    ipmi_register_callback(ipmi::netFnStorage, ipmi::storage::cmdGetSelEntry,
-                           nullptr, getSELEntry, PRIVILEGE_USER);
+    ipmi::registerHandler(ipmi::prioOpenBmcBase, ipmi::netFnStorage,
+                          ipmi::storage::cmdGetSelEntry, ipmi::Privilege::User,
+                          getSELEntry);
 
     // <Delete SEL Entry>
     ipmi::registerHandler(ipmi::prioOpenBmcBase, ipmi::netFnStorage,
