diff --git a/chassishandler.cpp b/chassishandler.cpp
index 88bf84b..2e911f9 100644
--- a/chassishandler.cpp
+++ b/chassishandler.cpp
@@ -602,70 +602,75 @@
     return rc;
 }
 
-ipmi_ret_t ipmi_set_chassis_cap(ipmi_netfn_t netfn, ipmi_cmd_t cmd,
-                                ipmi_request_t request,
-                                ipmi_response_t response,
-                                ipmi_data_len_t data_len,
-                                ipmi_context_t context)
+/** @brief implements set chassis capalibities command
+ *  @param intrusion        - chassis intrusion
+ *  @param fpLockout        - frontpannel lockout
+ *  @param reserved1        - skip one bit
+ *  @param fruDeviceAddr    - chassis FRU info Device Address
+ *  @param sdrDeviceAddr    - chassis SDR device address
+ *  @param selDeviceAddr    - chassis SEL device address
+ *  @param smDeviceAddr     - chassis system management device address
+ *  @param bridgeDeviceAddr - chassis bridge device address
+ *
+ *  @returns IPMI completion code
+ */
+ipmi::RspType<> ipmiSetChassisCap(bool intrusion, bool fpLockout,
+                                  uint6_t reserved1,
+
+                                  uint8_t fruDeviceAddr,
+
+                                  uint8_t sdrDeviceAddr,
+
+                                  uint8_t selDeviceAddr,
+
+                                  uint8_t smDeviceAddr,
+
+                                  uint8_t bridgeDeviceAddr)
 {
-    ipmi_ret_t rc = IPMI_CC_OK;
-
-    if (*data_len != sizeof(ipmi_chassis_cap_t))
-    {
-        log<level::ERR>("Unsupported request length",
-                        entry("LEN=0x%x", *data_len));
-        *data_len = 0;
-        return IPMI_CC_REQ_DATA_LEN_INVALID;
-    }
-
-    ipmi_chassis_cap_t* chassisCap = static_cast<ipmi_chassis_cap_t*>(request);
-
-    *data_len = 0;
 
     // check input data
-    if (0 != (chassisCap->cap_flags & ~chassisCapFlagMask))
+    if (reserved1 != 0)
     {
-        log<level::ERR>("Unsupported request parameter(CAP Flags)",
-                        entry("REQ=0x%x", chassisCap->cap_flags));
-        return IPMI_CC_INVALID_FIELD_REQUEST;
+        log<level::ERR>("Unsupported request parameter");
+        return ipmi::responseInvalidFieldRequest();
     }
 
-    if (0 != (chassisCap->fru_info_dev_addr & ~chassisCapAddrMask))
+    if ((fruDeviceAddr & ~chassisCapAddrMask) != 0)
     {
         log<level::ERR>("Unsupported request parameter(FRU Addr)",
-                        entry("REQ=0x%x", chassisCap->fru_info_dev_addr));
-        return IPMI_CC_INVALID_FIELD_REQUEST;
+                        entry("REQ=0x%x", fruDeviceAddr));
+        return ipmi::responseInvalidFieldRequest();
     }
-
-    if (0 != (chassisCap->sdr_dev_addr & ~chassisCapAddrMask))
+    if ((sdrDeviceAddr & ~chassisCapAddrMask) != 0)
     {
         log<level::ERR>("Unsupported request parameter(SDR Addr)",
-                        entry("REQ=0x%x", chassisCap->sdr_dev_addr));
-        return IPMI_CC_INVALID_FIELD_REQUEST;
+                        entry("REQ=0x%x", sdrDeviceAddr));
+        return ipmi::responseInvalidFieldRequest();
     }
 
-    if (0 != (chassisCap->sel_dev_addr & ~chassisCapAddrMask))
+    if ((selDeviceAddr & ~chassisCapAddrMask) != 0)
     {
         log<level::ERR>("Unsupported request parameter(SEL Addr)",
-                        entry("REQ=0x%x", chassisCap->sel_dev_addr));
-        return IPMI_CC_INVALID_FIELD_REQUEST;
+                        entry("REQ=0x%x", selDeviceAddr));
+        return ipmi::responseInvalidFieldRequest();
     }
 
-    if (0 != (chassisCap->system_management_dev_addr & ~chassisCapAddrMask))
+    if ((smDeviceAddr & ~chassisCapAddrMask) != 0)
     {
-        log<level::ERR>(
-            "Unsupported request parameter(SM Addr)",
-            entry("REQ=0x%x", chassisCap->system_management_dev_addr));
-        return IPMI_CC_INVALID_FIELD_REQUEST;
+        log<level::ERR>("Unsupported request parameter(SM Addr)",
+                        entry("REQ=0x%x", smDeviceAddr));
+        return ipmi::responseInvalidFieldRequest();
     }
 
-    if (0 != (chassisCap->bridge_dev_addr & ~chassisCapAddrMask))
+    if ((bridgeDeviceAddr & ~chassisCapAddrMask) != 0)
     {
         log<level::ERR>("Unsupported request parameter(Bridge Addr)",
-                        entry("REQ=0x%x", chassisCap->bridge_dev_addr));
-        return IPMI_CC_INVALID_FIELD_REQUEST;
+                        entry("REQ=0x%x", bridgeDeviceAddr));
+        return ipmi::responseInvalidFieldRequest();
     }
 
+    uint8_t capFlags = (static_cast<uint8_t>(intrusion)) |
+                       ((static_cast<uint8_t>(fpLockout)) << 1);
     try
     {
         sdbusplus::bus::bus bus(ipmid_get_sd_bus_connection());
@@ -674,39 +679,34 @@
 
         ipmi::setDbusProperty(bus, chassisCapObject.second,
                               chassisCapObject.first, chassisCapIntf,
-                              chassisCapFlagsProp, chassisCap->cap_flags);
+                              chassisCapFlagsProp, capFlags);
 
         ipmi::setDbusProperty(bus, chassisCapObject.second,
                               chassisCapObject.first, chassisCapIntf,
-                              chassisFRUDevAddrProp,
-                              chassisCap->fru_info_dev_addr);
+                              chassisFRUDevAddrProp, fruDeviceAddr);
 
         ipmi::setDbusProperty(bus, chassisCapObject.second,
                               chassisCapObject.first, chassisCapIntf,
-                              chassisSDRDevAddrProp, chassisCap->sdr_dev_addr);
+                              chassisSDRDevAddrProp, sdrDeviceAddr);
 
         ipmi::setDbusProperty(bus, chassisCapObject.second,
                               chassisCapObject.first, chassisCapIntf,
-                              chassisSELDevAddrProp, chassisCap->sel_dev_addr);
+                              chassisSELDevAddrProp, selDeviceAddr);
 
         ipmi::setDbusProperty(bus, chassisCapObject.second,
                               chassisCapObject.first, chassisCapIntf,
-                              chassisSMDevAddrProp,
-                              chassisCap->system_management_dev_addr);
+                              chassisSMDevAddrProp, smDeviceAddr);
 
         ipmi::setDbusProperty(bus, chassisCapObject.second,
                               chassisCapObject.first, chassisCapIntf,
-                              chassisBridgeDevAddrProp,
-                              chassisCap->bridge_dev_addr);
+                              chassisBridgeDevAddrProp, bridgeDeviceAddr);
     }
     catch (std::exception& e)
     {
         log<level::ERR>(e.what());
-        rc = IPMI_CC_UNSPECIFIED_ERROR;
-        return rc;
+        return ipmi::responseUnspecifiedError();
     }
-
-    return rc;
+    return ipmi::responseSuccess();
 }
 
 //------------------------------------------
@@ -1780,8 +1780,9 @@
                            ipmi_get_chassis_cap, PRIVILEGE_USER);
 
     // Set Chassis Capabilities
-    ipmi_register_callback(NETFUN_CHASSIS, IPMI_CMD_SET_CHASSIS_CAP, NULL,
-                           ipmi_set_chassis_cap, PRIVILEGE_USER);
+    ipmi::registerHandler(ipmi::prioOpenBmcBase, ipmi::netFnChassis,
+                          ipmi::chassis::cmdSetChassisCapabilities,
+                          ipmi::Privilege::User, ipmiSetChassisCap);
 
     // <Get System Boot Options>
     ipmi_register_callback(NETFUN_CHASSIS, IPMI_CMD_GET_SYS_BOOT_OPTIONS, NULL,
