diff --git a/app/channel.hpp b/app/channel.hpp
index 1b761f8..7004ddd 100644
--- a/app/channel.hpp
+++ b/app/channel.hpp
@@ -1,6 +1,7 @@
-#include "ipmid.hpp"
 #include "nlohmann/json.hpp"
 
+#include <ipmid/api.h>
+
 /** @brief The set channel access IPMI command.
  *
  *  @param[in] netfn
diff --git a/app/watchdog.cpp b/app/watchdog.cpp
index 1a5d19c..68af65c 100644
--- a/app/watchdog.cpp
+++ b/app/watchdog.cpp
@@ -1,6 +1,5 @@
 #include "watchdog.hpp"
 
-#include "ipmid.hpp"
 #include "watchdog_service.hpp"
 
 #include <endian.h>
diff --git a/apphandler.cpp b/apphandler.cpp
index e5daa2a..8875cd8 100644
--- a/apphandler.cpp
+++ b/apphandler.cpp
@@ -2,7 +2,6 @@
 
 #include "app/channel.hpp"
 #include "app/watchdog.hpp"
-#include "ipmid.hpp"
 #include "sys_info_param.hpp"
 #include "transporthandler.hpp"
 
diff --git a/chassishandler.cpp b/chassishandler.cpp
index 07e8c5b..7ac7b7d 100644
--- a/chassishandler.cpp
+++ b/chassishandler.cpp
@@ -2,7 +2,6 @@
 
 #include "chassishandler.hpp"
 
-#include "ipmid.hpp"
 #include "settings.hpp"
 
 #include <arpa/inet.h>
diff --git a/groupext.cpp b/groupext.cpp
index 7b4ca5e..dbfade4 100644
--- a/groupext.cpp
+++ b/groupext.cpp
@@ -1,5 +1,3 @@
-#include "ipmid.hpp"
-
 #include <ipmid/api.h>
 
 #include <cstdio>
diff --git a/include/ipmid/api.h b/include/ipmid/api.h
index b1c078b..f08ee11 100644
--- a/include/ipmid/api.h
+++ b/include/ipmid/api.h
@@ -152,4 +152,8 @@
 sd_event* ipmid_get_sd_event_connection(void);
 sd_bus_slot* ipmid_get_sd_bus_slot(void);
 
+// move this from ipmid.hpp, which is now gone
+// this should not be used. Use the channel API to get the channel size
+#define MAX_IPMI_BUFFER 64
+
 #endif
diff --git a/ipmid.cpp b/ipmid.cpp
deleted file mode 100644
index e5860d0..0000000
--- a/ipmid.cpp
+++ /dev/null
@@ -1,703 +0,0 @@
-#include "config.h"
-
-#include "ipmid.hpp"
-
-#include "host-cmd-manager.hpp"
-#include "ipmiwhitelist.hpp"
-#include "sensorhandler.hpp"
-#include "settings.hpp"
-
-#include <assert.h>
-#include <dirent.h>
-#include <dlfcn.h>
-#include <errno.h>
-#include <sys/time.h>
-#include <systemd/sd-bus.h>
-#include <unistd.h>
-
-#include <algorithm>
-#include <cstring>
-#include <iostream>
-#include <ipmid-host/cmd.hpp>
-#include <ipmid/oemrouter.hpp>
-#include <iterator>
-#include <map>
-#include <memory>
-#include <phosphor-logging/log.hpp>
-#include <sdbusplus/bus.hpp>
-#include <sdbusplus/bus/match.hpp>
-#include <sdbusplus/message/types.hpp>
-#include <sdbusplus/timer.hpp>
-#include <vector>
-#include <xyz/openbmc_project/Control/Security/RestrictionMode/server.hpp>
-
-using namespace phosphor::logging;
-namespace sdbusRule = sdbusplus::bus::match::rules;
-namespace variant_ns = sdbusplus::message::variant_ns;
-
-sd_bus* bus = NULL;
-sd_bus_slot* ipmid_slot = NULL;
-sd_event* events = nullptr;
-
-// Need this to use new sdbusplus compatible interfaces
-sdbusPtr sdbusp;
-
-// Global Host Bound Command manager
-using cmdManagerPtr = std::unique_ptr<phosphor::host::command::Manager>;
-cmdManagerPtr cmdManager;
-
-// Global timer for network changes
-std::unique_ptr<phosphor::Timer> networkTimer = nullptr;
-
-// Command and handler tuple. Used when clients ask the command to be put
-// into host message queue
-using CommandHandler = phosphor::host::command::CommandHandler;
-
-// Initialise restricted mode to true
-bool restricted_mode = true;
-
-FILE *ipmiio, *ipmidbus, *ipmicmddetails;
-
-void print_usage(void)
-{
-    std::fprintf(stderr, "Options:  [-d mask]\n");
-    std::fprintf(stderr, "    mask : 0x01 - Print ipmi packets\n");
-    std::fprintf(stderr, "    mask : 0x02 - Print DBUS operations\n");
-    std::fprintf(stderr, "    mask : 0x04 - Print ipmi command details\n");
-    std::fprintf(stderr, "    mask : 0xFF - Print all trace\n");
-}
-
-const char* DBUS_INTF = "org.openbmc.HostIpmi";
-
-const char* FILTER =
-    "type='signal',interface='org.openbmc.HostIpmi',member='ReceivedMessage'";
-
-typedef std::pair<ipmi_netfn_t, ipmi_cmd_t> ipmi_fn_cmd_t;
-typedef std::pair<ipmid_callback_t, ipmi_context_t> ipmi_fn_context_t;
-
-// Global data structure that contains the IPMI command handler's registrations.
-std::map<ipmi_fn_cmd_t, ipmi_fn_context_t> g_ipmid_router_map;
-
-// IPMI Spec, shared Reservation ID.
-static unsigned short selReservationID = 0xFFFF;
-static bool selReservationValid = false;
-
-unsigned short reserveSel(void)
-{
-    // IPMI spec, Reservation ID, the value simply increases against each
-    // execution of the Reserve SEL command.
-    if (++selReservationID == 0)
-    {
-        selReservationID = 1;
-    }
-    selReservationValid = true;
-    return selReservationID;
-}
-
-bool checkSELReservation(unsigned short id)
-{
-    return (selReservationValid && selReservationID == id);
-}
-
-void cancelSELReservation(void)
-{
-    selReservationValid = false;
-}
-
-namespace internal
-{
-
-constexpr auto restrictionModeIntf =
-    "xyz.openbmc_project.Control.Security.RestrictionMode";
-
-namespace cache
-{
-
-std::unique_ptr<settings::Objects> objects = nullptr;
-
-} // namespace cache
-} // namespace internal
-
-#ifndef HEXDUMP_COLS
-#define HEXDUMP_COLS 16
-#endif
-
-void hexdump(FILE* s, void* mem, size_t len)
-{
-    unsigned int i, j;
-
-    for (i = 0;
-         i <
-         len + ((len % HEXDUMP_COLS) ? (HEXDUMP_COLS - len % HEXDUMP_COLS) : 0);
-         i++)
-    {
-        /* print offset */
-        if (i % HEXDUMP_COLS == 0)
-        {
-            std::fprintf(s, "0x%06x: ", i);
-        }
-
-        /* print hex data */
-        if (i < len)
-        {
-            std::fprintf(s, "%02x ", 0xFF & ((char*)mem)[i]);
-        }
-        else /* end of block, just aligning for ASCII dump */
-        {
-            std::fprintf(s, "   ");
-        }
-
-        /* print ASCII dump */
-        if (i % HEXDUMP_COLS == (HEXDUMP_COLS - 1))
-        {
-            for (j = i - (HEXDUMP_COLS - 1); j <= i; j++)
-            {
-                if (j >= len) /* end of block, not really printing */
-                {
-                    std::fputc(' ', s);
-                }
-                else if (std::isprint(((char*)mem)[j])) /* printable char */
-                {
-                    std::fputc(0xFF & ((char*)mem)[j], s);
-                }
-                else /* other char */
-                {
-                    std::fputc('.', s);
-                }
-            }
-            std::fputc('\n', s);
-        }
-    }
-}
-
-// Method that gets called by shared libraries to get their command handlers
-// registered
-void ipmi_register_callback(ipmi_netfn_t netfn, ipmi_cmd_t cmd,
-                            ipmi_context_t context, ipmid_callback_t handler,
-                            ipmi_cmd_privilege_t priv)
-{
-    // Pack NetFn and Command in one.
-    auto netfn_and_cmd = std::make_pair(netfn, cmd);
-
-    // Pack Function handler and Data in another.
-    auto handler_and_context = std::make_pair(handler, context);
-
-    // Check if the registration has already been made..
-    auto iter = g_ipmid_router_map.find(netfn_and_cmd);
-    if (iter != g_ipmid_router_map.end())
-    {
-        log<level::ERR>("Duplicate registration", entry("NETFN=0x%X", netfn),
-                        entry("CMD=0x%X", cmd));
-    }
-    else
-    {
-        // This is a fresh registration.. Add it to the map.
-        g_ipmid_router_map.emplace(netfn_and_cmd, handler_and_context);
-    }
-
-    return;
-}
-
-// Looks at the map and calls corresponding handler functions.
-ipmi_ret_t ipmi_netfn_router(ipmi_netfn_t netfn, ipmi_cmd_t cmd,
-                             ipmi_request_t request, ipmi_response_t response,
-                             ipmi_data_len_t data_len)
-{
-    // return from the Command handlers.
-    ipmi_ret_t rc = IPMI_CC_INVALID;
-
-    // If restricted mode is true and command is not whitelisted, don't
-    // execute the command
-    if (restricted_mode)
-    {
-        if (!std::binary_search(whitelist.cbegin(), whitelist.cend(),
-                                std::make_pair(netfn, cmd)))
-        {
-            log<level::ERR>("Net function not whitelisted",
-                            entry("NETFN=0x%X", netfn), entry("CMD=0x%X", cmd));
-            rc = IPMI_CC_INSUFFICIENT_PRIVILEGE;
-            std::memcpy(response, &rc, IPMI_CC_LEN);
-            *data_len = IPMI_CC_LEN;
-            return rc;
-        }
-    }
-
-    // Walk the map that has the registered handlers and invoke the approprite
-    // handlers for matching commands.
-    auto iter = g_ipmid_router_map.find(std::make_pair(netfn, cmd));
-    if (iter == g_ipmid_router_map.end())
-    {
-        /* By default should only print on failure to find wildcard command. */
-#ifdef __IPMI_DEBUG__
-        log<level::ERR>(
-            "No registered handlers for NetFn, trying Wilcard implementation",
-            entry("NET_FUN=0x%X", netfn) entry("CMD=0x%X", IPMI_CMD_WILDCARD));
-#endif
-
-        // Now that we did not find any specific [NetFn,Cmd], tuple, check for
-        // NetFn, WildCard command present.
-        iter =
-            g_ipmid_router_map.find(std::make_pair(netfn, IPMI_CMD_WILDCARD));
-        if (iter == g_ipmid_router_map.end())
-        {
-            log<level::ERR>("No Registered handlers for NetFn",
-                            entry("NET_FUN=0x%X", netfn),
-                            entry("CMD=0x%X", IPMI_CMD_WILDCARD));
-
-            // Respond with a 0xC1
-            std::memcpy(response, &rc, IPMI_CC_LEN);
-            *data_len = IPMI_CC_LEN;
-            return rc;
-        }
-    }
-
-#ifdef __IPMI_DEBUG__
-    // We have either a perfect match -OR- a wild card atleast,
-    log<level::ERR>("Calling Net function",
-                    entry("NET_FUN=0x%X", netfn) entry("CMD=0x%X", cmd));
-#endif
-
-    // Extract the map data onto appropriate containers
-    auto handler_and_context = iter->second;
-
-    // Creating a pointer type casted to char* to make sure we advance 1 byte
-    // when we advance pointer to next's address. advancing void * would not
-    // make sense.
-    char* respo = &((char*)response)[IPMI_CC_LEN];
-
-    try
-    {
-        // Response message from the plugin goes into a byte post the base
-        // response
-        rc = (handler_and_context.first)(netfn, cmd, request, respo, data_len,
-                                         handler_and_context.second);
-    }
-    // IPMI command handlers can throw unhandled exceptions, catch those
-    // and return sane error code.
-    catch (const std::exception& e)
-    {
-        log<level::ERR>(e.what(), entry("NET_FUN=0x%X", netfn),
-                        entry("CMD=0x%X", cmd));
-        rc = IPMI_CC_UNSPECIFIED_ERROR;
-        *data_len = 0;
-        // fall through
-    }
-    // Now copy the return code that we got from handler and pack it in first
-    // byte.
-    std::memcpy(response, &rc, IPMI_CC_LEN);
-
-    // Data length is now actual data + completion code.
-    *data_len = *data_len + IPMI_CC_LEN;
-
-    return rc;
-}
-
-static int send_ipmi_message(sd_bus_message* req, unsigned char seq,
-                             unsigned char netfn, unsigned char lun,
-                             unsigned char cmd, unsigned char cc,
-                             unsigned char* buf, unsigned char len)
-{
-
-    sd_bus_error error = SD_BUS_ERROR_NULL;
-    sd_bus_message *reply = NULL, *m = NULL;
-    const char *dest, *path;
-    int r, pty;
-
-    dest = sd_bus_message_get_sender(req);
-    path = sd_bus_message_get_path(req);
-
-    r = sd_bus_message_new_method_call(bus, &m, dest, path, DBUS_INTF,
-                                       "sendMessage");
-    if (r < 0)
-    {
-        log<level::ERR>("Failed to add the method object",
-                        entry("ERRNO=0x%X", -r));
-        return -1;
-    }
-
-    // Responses in IPMI require a bit set.  So there ya go...
-    netfn |= 0x01;
-
-    // Add the bytes needed for the methods to be called
-    r = sd_bus_message_append(m, "yyyyy", seq, netfn, lun, cmd, cc);
-    if (r < 0)
-    {
-        log<level::ERR>("Failed add the netfn and others",
-                        entry("ERRNO=0x%X", -r));
-        goto final;
-    }
-
-    r = sd_bus_message_append_array(m, 'y', buf, len);
-    if (r < 0)
-    {
-        log<level::ERR>("Failed to add the string of response bytes",
-                        entry("ERRNO=0x%X", -r));
-        goto final;
-    }
-
-    // Call the IPMI responder on the bus so the message can be sent to the CEC
-    r = sd_bus_call(bus, m, 0, &error, &reply);
-    if (r < 0)
-    {
-        log<level::ERR>("Failed to call the method", entry("DEST=%s", dest),
-                        entry("PATH=%s", path), entry("ERRNO=0x%X", -r));
-        goto final;
-    }
-
-    r = sd_bus_message_read(reply, "x", &pty);
-    if (r < 0)
-    {
-        log<level::ERR>("Failed to get a reply from the method",
-                        entry("ERRNO=0x%X", -r));
-    }
-
-final:
-    sd_bus_error_free(&error);
-    m = sd_bus_message_unref(m);
-    reply = sd_bus_message_unref(reply);
-
-    return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
-}
-
-void cache_restricted_mode()
-{
-    restricted_mode = false;
-    using namespace sdbusplus::xyz::openbmc_project::Control::Security::server;
-    using namespace internal;
-    using namespace internal::cache;
-    sdbusplus::bus::bus dbus(ipmid_get_sd_bus_connection());
-    const auto& restrictionModeSetting =
-        objects->map.at(restrictionModeIntf).front();
-    auto method = dbus.new_method_call(
-        objects->service(restrictionModeSetting, restrictionModeIntf).c_str(),
-        restrictionModeSetting.c_str(), "org.freedesktop.DBus.Properties",
-        "Get");
-    method.append(restrictionModeIntf, "RestrictionMode");
-    auto resp = dbus.call(method);
-    if (resp.is_method_error())
-    {
-        log<level::ERR>("Error in RestrictionMode Get");
-        // Fail-safe to true.
-        restricted_mode = true;
-        return;
-    }
-    sdbusplus::message::variant<std::string> result;
-    resp.read(result);
-    auto restrictionMode = RestrictionMode::convertModesFromString(
-        variant_ns::get<std::string>(result));
-    if (RestrictionMode::Modes::Whitelist == restrictionMode)
-    {
-        restricted_mode = true;
-    }
-}
-
-static int handle_restricted_mode_change(sd_bus_message* m, void* user_data,
-                                         sd_bus_error* ret_error)
-{
-    cache_restricted_mode();
-    return 0;
-}
-
-static int handle_ipmi_command(sd_bus_message* m, void* user_data,
-                               sd_bus_error* ret_error)
-{
-    int r = 0;
-    unsigned char sequence, netfn, lun, cmd;
-    const void* request;
-    size_t sz;
-    size_t resplen = MAX_IPMI_BUFFER;
-    unsigned char response[MAX_IPMI_BUFFER];
-
-    std::memset(response, 0, MAX_IPMI_BUFFER);
-
-    r = sd_bus_message_read(m, "yyyy", &sequence, &netfn, &lun, &cmd);
-    if (r < 0)
-    {
-        log<level::ERR>("Failed to parse signal message",
-                        entry("ERRNO=0x%X", -r));
-        return -1;
-    }
-
-    r = sd_bus_message_read_array(m, 'y', &request, &sz);
-    if (r < 0)
-    {
-        log<level::ERR>("Failed to parse signal message",
-                        entry("ERRNO=0x%X", -r));
-        return -1;
-    }
-
-    std::fprintf(ipmiio,
-                 "IPMI Incoming: Seq 0x%02x, NetFn 0x%02x, CMD: 0x%02x \n",
-                 sequence, netfn, cmd);
-    hexdump(ipmiio, (void*)request, sz);
-
-    // Allow the length field to be used for both input and output of the
-    // ipmi call
-    resplen = sz;
-
-    // Now that we have parsed the entire byte array from the caller
-    // we can call the ipmi router to do the work...
-    r = ipmi_netfn_router(netfn, cmd, (void*)request, (void*)response,
-                          &resplen);
-    if (r != 0)
-    {
-#ifdef __IPMI_DEBUG__
-        log<level::ERR>("ERROR in handling NetFn", entry("ERRNO=0x%X", -r),
-                        entry("NET_FUN=0x%X", netfn), entry("CMD=0x%X", cmd));
-#endif
-        resplen = 0;
-    }
-    else
-    {
-        resplen = resplen - 1; // first byte is for return code.
-    }
-
-    std::fprintf(ipmiio, "IPMI Response:\n");
-    hexdump(ipmiio, (void*)response, resplen);
-
-    // Send the response buffer from the ipmi command
-    r = send_ipmi_message(m, sequence, netfn, lun, cmd, response[0],
-                          ((unsigned char*)response) + 1, resplen);
-    if (r < 0)
-    {
-        log<level::ERR>("Failed to send the response message");
-        return -1;
-    }
-
-    return 0;
-}
-
-//----------------------------------------------------------------------
-// handler_select
-// Select all the files ending with with .so. in the given diretcory
-// @d: dirent structure containing the file name
-//----------------------------------------------------------------------
-int handler_select(const struct dirent* entry)
-{
-    // To hold ".so" from entry->d_name;
-    char dname_copy[4] = {0};
-
-    // We want to avoid checking for everything and isolate to the ones having
-    // .so.* or .so in them.
-    // Check for versioned libraries .so.*
-    if (strstr(entry->d_name, IPMI_PLUGIN_SONAME_EXTN))
-    {
-        return 1;
-    }
-    // Check for non versioned libraries .so
-    else if (strstr(entry->d_name, IPMI_PLUGIN_EXTN))
-    {
-        // It is possible that .so could be anywhere in the string but unlikely
-        // But being careful here. Get the base address of the string, move
-        // until end and come back 3 steps and that gets what we need.
-        strcpy(dname_copy, (entry->d_name + strlen(entry->d_name) -
-                            strlen(IPMI_PLUGIN_EXTN)));
-        if (strcmp(dname_copy, IPMI_PLUGIN_EXTN) == 0)
-        {
-            return 1;
-        }
-    }
-    return 0;
-}
-
-// This will do a dlopen of every .so in ipmi_lib_path and will dlopen
-// everything so that they will register a callback handler
-void ipmi_register_callback_handlers(const char* ipmi_lib_path)
-{
-    // For walking the ipmi_lib_path
-    struct dirent** handler_list;
-
-    // This is used to check and abort if someone tries to register a bad one.
-    void* lib_handler = NULL;
-
-    if (ipmi_lib_path == NULL)
-    {
-        log<level::ERR>("No handlers to be registered for ipmi.. Aborting");
-        assert(0);
-    }
-    else
-    {
-        // 1: Open ipmi_lib_path. Its usually "/usr/lib/phosphor-host-ipmid"
-        // 2: Scan the directory for the files that end with .so
-        // 3: For each one of them, just do a 'dlopen' so that they register
-        //    the handlers for callback routines.
-
-        std::string handler_fqdn = ipmi_lib_path;
-
-        // Append a "/" since we need to add the name of the .so. If there is
-        // already a .so, adding one more is not any harm.
-        handler_fqdn += "/";
-
-        int num_handlers =
-            scandir(ipmi_lib_path, &handler_list, handler_select, alphasort);
-        if (num_handlers < 0)
-            return;
-
-        while (num_handlers--)
-        {
-            handler_fqdn = ipmi_lib_path;
-            handler_fqdn += handler_list[num_handlers]->d_name;
-#ifdef __IPMI_DEBUG__
-            log<level::DEBUG>("Registering handler",
-                              entry("HANDLER=%s", handler_fqdn.c_str()));
-#endif
-
-            lib_handler = dlopen(handler_fqdn.c_str(), RTLD_NOW);
-
-            if (lib_handler == NULL)
-            {
-                log<level::ERR>("ERROR opening",
-                                entry("HANDLER=%s", handler_fqdn.c_str()),
-                                entry("ERROR=%s", dlerror()));
-            }
-            // Wipe the memory allocated for this particular entry.
-            free(handler_list[num_handlers]);
-        }
-
-        // Done with all registration.
-        free(handler_list);
-    }
-
-    // TODO : What to be done on the memory that is given by dlopen ?.
-    return;
-}
-
-sd_bus* ipmid_get_sd_bus_connection(void)
-{
-    return bus;
-}
-
-sd_event* ipmid_get_sd_event_connection(void)
-{
-    return events;
-}
-
-sd_bus_slot* ipmid_get_sd_bus_slot(void)
-{
-    return ipmid_slot;
-}
-
-EInterfaceIndex getInterfaceIndex(void)
-{
-    return interfaceKCS;
-}
-
-// Calls host command manager to do the right thing for the command
-void ipmid_send_cmd_to_host(CommandHandler&& cmd)
-{
-    return cmdManager->execute(std::move(cmd));
-}
-
-cmdManagerPtr& ipmid_get_host_cmd_manager()
-{
-    return cmdManager;
-}
-
-sdbusPtr& ipmid_get_sdbus_plus_handler()
-{
-    return sdbusp;
-}
-
-int main(int argc, char* argv[])
-{
-    int r;
-    unsigned long tvalue;
-    int c;
-
-    // This file and subsequient switch is for turning on levels
-    // of trace
-    ipmicmddetails = ipmiio = ipmidbus = fopen("/dev/null", "w");
-
-    while ((c = getopt(argc, argv, "h:d:")) != -1)
-        switch (c)
-        {
-            case 'd':
-                tvalue = strtoul(optarg, NULL, 16);
-                if (1 & tvalue)
-                {
-                    ipmiio = stdout;
-                }
-                if (2 & tvalue)
-                {
-                    ipmidbus = stdout;
-                }
-                if (4 & tvalue)
-                {
-                    ipmicmddetails = stdout;
-                }
-                break;
-            case 'h':
-            case '?':
-                print_usage();
-                return 1;
-        }
-
-    /* Connect to system bus */
-    r = sd_bus_default_system(&bus);
-    if (r < 0)
-    {
-        log<level::ERR>("Failed to connect to system bus",
-                        entry("ERRNO=0x%X", -r));
-        goto finish;
-    }
-
-    /* Get an sd event handler */
-    r = sd_event_default(&events);
-    if (r < 0)
-    {
-        log<level::ERR>("Failure to create sd_event handler",
-                        entry("ERRNO=0x%X", -r));
-        goto finish;
-    }
-
-    // Now create the Host Bound Command manager. Need sdbusplus
-    // to use the generated bindings
-    sdbusp = std::make_unique<sdbusplus::bus::bus>(bus);
-    sdbusp->request_name("xyz.openbmc_project.Ipmi.Host");
-
-    cmdManager = std::make_unique<phosphor::host::command::Manager>(*sdbusp);
-
-    // Activate OemRouter.
-    oem::mutableRouter()->activate();
-
-    // Register all the handlers that provider implementation to IPMI commands.
-    ipmi_register_callback_handlers(HOST_IPMI_LIB_PATH);
-
-    // Watch for BT messages
-    r = sd_bus_add_match(bus, &ipmid_slot, FILTER, handle_ipmi_command, NULL);
-    if (r < 0)
-    {
-        log<level::ERR>("Failed: sd_bus_add_match", entry("FILTER=%s", FILTER),
-                        entry("ERRNO=0x%X", -r));
-        goto finish;
-    }
-
-    // Attach the bus to sd_event to service user requests
-    sd_bus_attach_event(bus, events, SD_EVENT_PRIORITY_NORMAL);
-
-    {
-        using namespace internal;
-        using namespace internal::cache;
-        sdbusplus::bus::bus dbus{bus};
-        objects = std::make_unique<settings::Objects>(
-            dbus, std::vector<settings::Interface>({restrictionModeIntf}));
-        // Initialize restricted mode
-        cache_restricted_mode();
-        // Wait for changes on Restricted mode
-        sdbusplus::bus::match_t restrictedModeMatch(
-            dbus,
-            sdbusRule::propertiesChanged(
-                objects->map.at(restrictionModeIntf).front(),
-                restrictionModeIntf),
-            handle_restricted_mode_change);
-
-        r = sd_event_loop(events);
-    }
-
-finish:
-    sd_event_unref(events);
-    sd_bus_detach_event(bus);
-    sd_bus_slot_unref(ipmid_slot);
-    sd_bus_unref(bus);
-    return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
-}
diff --git a/ipmid.hpp b/ipmid.hpp
deleted file mode 100644
index 93a85b0..0000000
--- a/ipmid.hpp
+++ /dev/null
@@ -1,24 +0,0 @@
-#pragma once
-
-#include <ipmid/api.h>
-#include <stdio.h>
-
-// When the requester sends in a netfn and a command along with data, this
-// function will look for registered handlers that will handle that [netfn,cmd]
-// and will make a call to that plugin implementation and send back the
-// response.
-ipmi_ret_t ipmi_netfn_router(const ipmi_netfn_t, const ipmi_cmd_t,
-                             ipmi_request_t, ipmi_response_t,
-                             unsigned int* data_len);
-
-// Plugin libraries need to _end_ with .so
-#define IPMI_PLUGIN_EXTN ".so"
-// Plugin libraries can be versioned with suffix .so.*
-#define IPMI_PLUGIN_SONAME_EXTN ".so."
-
-// The BT FIFO in the AST2400 can only handle 64 bytes.
-// Can only allow 63 because the BT interface still
-// needs 1 byte for the length field.
-#define MAX_IPMI_BUFFER 64
-
-extern FILE *ipmiio, *ipmidbus, *ipmicmddetails;
diff --git a/sensorhandler.cpp b/sensorhandler.cpp
index 4da40af..cf8feaa 100644
--- a/sensorhandler.cpp
+++ b/sensorhandler.cpp
@@ -1,7 +1,6 @@
 #include "sensorhandler.hpp"
 
 #include "fruread.hpp"
-#include "ipmid.hpp"
 
 #include <ipmid/api.h>
 #include <mapper.h>
diff --git a/transporthandler.cpp b/transporthandler.cpp
index 7d678a8..1662530 100644
--- a/transporthandler.cpp
+++ b/transporthandler.cpp
@@ -1,7 +1,6 @@
 #include "transporthandler.hpp"
 
 #include "app/channel.hpp"
-#include "ipmid.hpp"
 #include "user_channel/channel_layer.hpp"
 
 #include <arpa/inet.h>
