diff --git a/ipmi/manualcmds.cpp b/ipmi/manualcmds.cpp
index 69817b2..60ecebf 100644
--- a/ipmi/manualcmds.cpp
+++ b/ipmi/manualcmds.cpp
@@ -19,35 +19,33 @@
 #include "control.hpp"
 #include "manual_messages.hpp"
 
-#include <ipmid/api.h>
+#include <ipmid/api-types.hpp>
 
 #include <cstddef>
 #include <cstdint>
 #include <memory>
 #include <string>
 
-namespace pid_control
-{
-namespace ipmi
+namespace pid_control::ipmi
 {
 
 static constexpr auto manualProperty = "Manual";
 static constexpr auto failsafeProperty = "FailSafe";
 
-ipmi_ret_t ZoneControlIpmiHandler::getFailsafeModeState(
+::ipmi::Cc ZoneControlIpmiHandler::getFailsafeModeState(
     const uint8_t* reqBuf, uint8_t* replyBuf, size_t* dataLen)
 {
     bool current;
 
     if (*dataLen < sizeof(struct FanCtrlRequest))
     {
-        return IPMI_CC_INVALID;
+        return ::ipmi::ccInvalidCommand;
     }
 
     const auto request =
         reinterpret_cast<const struct FanCtrlRequest*>(&reqBuf[0]);
 
-    ipmi_ret_t rc =
+    ::ipmi::Cc rc =
         _control->getFanCtrlProperty(request->zone, &current, failsafeProperty);
     if (rc)
     {
@@ -56,7 +54,7 @@
 
     *replyBuf = (uint8_t)current;
     *dataLen = sizeof(uint8_t);
-    return IPMI_CC_OK;
+    return ::ipmi::ccSuccess;
 }
 
 /*
@@ -65,20 +63,20 @@
  *   <arg name="properties" direction="out" type="a{sv}"/>
  * </method>
  */
-ipmi_ret_t ZoneControlIpmiHandler::getManualModeState(
+::ipmi::Cc ZoneControlIpmiHandler::getManualModeState(
     const uint8_t* reqBuf, uint8_t* replyBuf, size_t* dataLen)
 {
     bool current;
 
     if (*dataLen < sizeof(struct FanCtrlRequest))
     {
-        return IPMI_CC_INVALID;
+        return ::ipmi::ccInvalidCommand;
     }
 
     const auto request =
         reinterpret_cast<const struct FanCtrlRequest*>(&reqBuf[0]);
 
-    ipmi_ret_t rc =
+    ::ipmi::Cc rc =
         _control->getFanCtrlProperty(request->zone, &current, manualProperty);
     if (rc)
     {
@@ -87,7 +85,7 @@
 
     *replyBuf = (uint8_t)current;
     *dataLen = sizeof(uint8_t);
-    return IPMI_CC_OK;
+    return ::ipmi::ccSuccess;
 }
 
 /*
@@ -97,39 +95,39 @@
  *   <arg name="value" direction="in" type="v"/>
  * </method>
  */
-ipmi_ret_t ZoneControlIpmiHandler::setManualModeState(
+::ipmi::Cc ZoneControlIpmiHandler::setManualModeState(
     const uint8_t* reqBuf, [[maybe_unused]] uint8_t* replyBuf,
     const size_t* dataLen)
 {
     if (*dataLen < sizeof(struct FanCtrlRequestSet))
     {
-        return IPMI_CC_INVALID;
+        return ::ipmi::ccInvalidCommand;
     }
 
     const auto request =
         reinterpret_cast<const struct FanCtrlRequestSet*>(&reqBuf[0]);
 
     /* 0 is false, 1 is true */
-    ipmi_ret_t rc = _control->setFanCtrlProperty(
+    ::ipmi::Cc rc = _control->setFanCtrlProperty(
         request->zone, static_cast<bool>(request->value), manualProperty);
     return rc;
 }
 
 /* Three command packages: get, set true, set false */
-ipmi_ret_t manualModeControl(
-    ZoneControlIpmiHandler* handler, [[maybe_unused]] ipmi_cmd_t cmd,
+::ipmi::Cc manualModeControl(
+    ZoneControlIpmiHandler* handler, [[maybe_unused]] uint8_t cmd,
     const uint8_t* reqBuf, uint8_t* replyCmdBuf, size_t* dataLen)
 {
     // FanCtrlRequest is the smaller of the requests, so it's at a minimum.
     if (*dataLen < sizeof(struct FanCtrlRequest))
     {
-        return IPMI_CC_INVALID;
+        return ::ipmi::ccInvalidCommand;
     }
 
     const auto request =
         reinterpret_cast<const struct FanCtrlRequest*>(&reqBuf[0]);
 
-    ipmi_ret_t rc = IPMI_CC_OK;
+    ::ipmi::Cc rc = ::ipmi::ccSuccess;
 
     switch (request->command)
     {
@@ -140,11 +138,10 @@
         case getFailsafeState:
             return handler->getFailsafeModeState(reqBuf, replyCmdBuf, dataLen);
         default:
-            rc = IPMI_CC_INVALID;
+            rc = ::ipmi::ccInvalidCommand;
     }
 
     return rc;
 }
 
-} // namespace ipmi
-} // namespace pid_control
+} // namespace pid_control::ipmi
