diff --git a/CMakeLists.txt b/CMakeLists.txt
deleted file mode 100644
index f5cf270..0000000
--- a/CMakeLists.txt
+++ /dev/null
@@ -1,109 +0,0 @@
-cmake_minimum_required (VERSION 3.5 FATAL_ERROR)
-
-cmake_policy (SET CMP0054 NEW)
-
-option (YOCTO "Use YOCTO depedencies system" OFF)
-include (ExternalProject)
-set (CMAKE_CXX_STANDARD 17)
-set (CMAKE_CXX_STANDARD_REQUIRED ON)
-set (CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake ${CMAKE_MODULE_PATH})
-
-
-set (
-    CMAKE_CXX_FLAGS
-    "${CMAKE_CXX_FLAGS} \
-    -Werror \
-    -Wtype-limits \
-    -Wnull-dereference \
-"
-)
-
-project (fii-ipmi-oem CXX)
-
-add_definitions (-DBOOST_ERROR_CODE_HEADER_ONLY)
-add_definitions (-DBOOST_SYSTEM_NO_DEPRECATED)
-add_definitions (-DBOOST_ALL_NO_LIB)
-add_definitions (-DBOOST_NO_RTTI)
-add_definitions (-DBOOST_NO_TYPEID)
-add_definitions (-DBOOST_ASIO_DISABLE_THREADS)
-add_definitions (-DBOOST_COROUTINES_NO_DEPRECATION_WARNING)
-add_definitions (-Wno-psabi)
-
-if (NOT YOCTO) # headers that can't be built without yocto
-    include_directories (SYSTEM non-yocto)
-
-    configure_file (CMakeLists.txt.in 3rdparty/CMakeLists.txt)
-    execute_process (COMMAND ${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}" .
-                     WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/3rdparty)
-    execute_process (COMMAND ${CMAKE_COMMAND} --build .
-                     WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/3rdparty)
-
-    set (CMAKE_PREFIX_PATH ${CMAKE_BINARY_DIR}/prefix ${CMAKE_PREFIX_PATH})
-    include_directories (SYSTEM ${CMAKE_BINARY_DIR}/prefix/include)
-    link_directories (${CMAKE_BINARY_DIR}/prefix/lib)
-
-    include_directories (SYSTEM ${CMAKE_BINARY_DIR}/sdbusplus-src)
-    link_directories (${CMAKE_BINARY_DIR}/sdbusplus-src/.libs)
-    include_directories (SYSTEM ${CMAKE_BINARY_DIR}/phosphor-logging-src)
-    link_directories (${CMAKE_BINARY_DIR}/phosphor-logging-src/.libs)
-    include_directories (SYSTEM ${CMAKE_BINARY_DIR}/phosphor-ipmi-host/include)
-    include_directories (SYSTEM ${CMAKE_BINARY_DIR}/ipmid/user_channel)
-    include_directories (SYSTEM ${CMAKE_BINARY_DIR}) # link_directories  (${CMAK
-                                                     # E_BINARY_DIR}/sdbusplus-
-                                                     # src/.libs)
-endif ()
-
-if (YOCTO)
-    find_package (PkgConfig REQUIRED)
-    pkg_check_modules (LOGGING phosphor-logging REQUIRED)
-    include_directories (SYSTEM ${LOGGING_INCLUDE_DIRS})
-    link_directories (${LOGGING_LIBRARY_DIRS})
-
-    pkg_check_modules (LIBIPMID libipmid REQUIRED)
-    include_directories (SYSTEM ${LIBIPMID_INCLUDE_DIRS})
-    link_directories (${LIBIPMID_LIBRARY_DIRS})
-
-endif ()
-
-include_directories (${CMAKE_CURRENT_SOURCE_DIR}/include)
-
-#
-# import OpenSSL (crypto)
-find_package (OpenSSL REQUIRED)
-include_directories (SYSTEM ${OPENSSL_INCLUDE_DIR})
-
-include_directories (SYSTEM ${CMAKE_BINARY_DIR})
-add_custom_command(OUTPUT include/ipmi-whitelist.hpp
-                  COMMAND ./generate-whitelist.py
-                  ARGS ipmi-whitelist.conf ${CMAKE_BINARY_DIR}/ipmi-whitelist.hpp
-                  MAIN_DEPENDENCY ipmi-whitelist.conf
-                  DEPENDS generate-whitelist.py
-                  WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
-
-add_library (fiioemcmds
-             SHARED
-             src/systemcommands.cpp
-             src/bioscommands.cpp)
-
-set_target_properties (fiioemcmds PROPERTIES VERSION "0.1.0")
-set_target_properties (fiioemcmds PROPERTIES SOVERSION "0")
-target_link_libraries (fiioemcmds stdc++fs)
-target_link_libraries (fiioemcmds ipmid)
-target_link_libraries (fiioemcmds sdbusplus)
-target_link_libraries (fiioemcmds phosphor_logging)
-target_link_libraries (fiioemcmds -luserlayer)
-target_link_libraries (fiioemcmds -lchannellayer)
-target_link_libraries (fiioemcmds ${OPENSSL_CRYPTO_LIBRARY})
-target_link_libraries (fiioemcmds gpiodcxx)
-
-install (TARGETS fiioemcmds DESTINATION lib/ipmid-providers)
-
-target_compile_definitions (
-    fiioemcmds PRIVATE
-#    $<$<BOOL:${INTEL_PFR_ENABLED}>: -DINTEL_PFR_ENABLED>
-#    $<$<BOOL:${BMC_VALIDATION_UNSECURE_FEATURE}>:
-#    -DBMC_VALIDATION_UNSECURE_FEATURE>
-#    $<$<BOOL:${MDR_V1_SUPPORT}>: -DMDR_V1_SUPPORT>
-#    $<$<BOOL:${USING_ENTITY_MANAGER_DECORATORS}>:
-#    -DUSING_ENTITY_MANAGER_DECORATORS>
-)
diff --git a/CMakeLists.txt.in b/CMakeLists.txt.in
deleted file mode 100644
index f50f74d..0000000
--- a/CMakeLists.txt.in
+++ /dev/null
@@ -1,31 +0,0 @@
-cmake_minimum_required (VERSION 3.5)
-
-include (ExternalProject)
-
-file (MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/prefix)
-file (MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/prefix/include)
-
-# requires apt install autoconf-archive and autoconf
-
-externalproject_add (
-    host-ipmid PREFIX ${CMAKE_BINARY_DIR}/phosphor-host-ipmid GIT_REPOSITORY
-    https://github.com/openbmc/phosphor-host-ipmid SOURCE_DIR
-    ${CMAKE_BINARY_DIR}/phosphor-ipmi-host-src BINARY_DIR
-    ${CMAKE_BINARY_DIR}/phosphor-ipmi-host-build CONFIGURE_COMMAND cd
-    ${CMAKE_BINARY_DIR}/phosphor-ipmi-host-src && export
-    PYTHONPATH=${CMAKE_BINARY_DIR}/prefix/lib/python2.7/site-packages:$ENV{PYTHONPATH}
-    && export PATH=${CMAKE_BINARY_DIR}/prefix/bin:$ENV{PATH} && export
-    PKG_CONFIG_PATH=${CMAKE_BINARY_DIR}/prefix/lib/pkgconfig && ./bootstrap.sh
-    && ./configure --prefix=${CMAKE_BINARY_DIR}/prefix
-    CPPFLAGS=-I${CMAKE_BINARY_DIR}/prefix/include/
-    CXXFLAGS=-Wno-error=unused-result LDFLAGS=-L${CMAKE_BINARY_DIR}/prefix/lib/
-    BUILD_COMMAND cd ${CMAKE_BINARY_DIR}/phosphor-ipmi-host-src && export
-    PYTHONPATH=${CMAKE_BINARY_DIR}/prefix/lib/python2.7/site-packages:$ENV{PYTHONPATH}
-    && export PATH=${CMAKE_BINARY_DIR}/prefix/bin:$ENV{PATH} && export
-    PKG_CONFIG_PATH=${CMAKE_BINARY_DIR}/prefix/lib/pkgconfig && make -j
-    verbose=1 INSTALL_COMMAND cd ${CMAKE_BINARY_DIR}/phosphor-ipmi-host-src &&
-    make install && mkdir -p
-    "${CMAKE_BINARY_DIR}/prefix/include/ipmid" && cp include/ipmid/api.h
-    "${CMAKE_BINARY_DIR}/prefix/include/ipmid/" LOG_DOWNLOAD ON
-)
-
diff --git a/LICENSE b/LICENSE
deleted file mode 100644
index 261eeb9..0000000
--- a/LICENSE
+++ /dev/null
@@ -1,201 +0,0 @@
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
-   APPENDIX: How to apply the Apache License to your work.
-
-      To apply the Apache License to your work, attach the following
-      boilerplate notice, with the fields enclosed by brackets "[]"
-      replaced with your own identifying information. (Don't include
-      the brackets!)  The text should be enclosed in the appropriate
-      comment syntax for the file format. We also recommend that a
-      file or class name and description of purpose be included on the
-      same "printed page" as the copyright notice for easier
-      identification within third-party archives.
-
-   Copyright [yyyy] [name of copyright owner]
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
diff --git a/MAINTAINERS b/MAINTAINERS
deleted file mode 100644
index f4cb0b5..0000000
--- a/MAINTAINERS
+++ /dev/null
@@ -1,46 +0,0 @@
-How to use this list:
-    Find the most specific section entry (described below) that matches where
-    your change lives and add the reviewers (R) and maintainers (M) as
-    reviewers. You can use the same method to track down who knows a particular
-    code base best.
-
-    Your change/query may span multiple entries; that is okay.
-
-    If you do not find an entry that describes your request at all, someone
-    forgot to update this list; please at least file an issue or send an email
-    to a maintainer, but preferably you should just update this document.
-
-Description of section entries:
-
-    Section entries are structured according to the following scheme:
-
-    X:  NAME <EMAIL_USERNAME@DOMAIN> <IRC_USERNAME!>
-    X:  ...
-    .
-    .
-    .
-
-    Where REPO_NAME is the name of the repository within the OpenBMC GitHub
-    organization; FILE_PATH is a file path within the repository, possibly with
-    wildcards; X is a tag of one of the following types:
-
-    M:  Denotes maintainer; has fields NAME <EMAIL_USERNAME@DOMAIN> <IRC_USERNAME!>;
-        if omitted from an entry, assume one of the maintainers from the
-        MAINTAINERS entry.
-    R:  Denotes reviewer; has fields NAME <EMAIL_USERNAME@DOMAIN> <IRC_USERNAME!>;
-        these people are to be added as reviewers for a change matching the repo
-        path.
-    F:  Denotes forked from an external repository; has fields URL.
-
-    Line comments are to be denoted "# SOME COMMENT" (typical shell style
-    comment); it is important to follow the correct syntax and semantics as we
-    may want to use automated tools with this file in the future.
-
-    A change cannot be added to an OpenBMC repository without a MAINTAINER's
-    approval; thus, a MAINTAINER should always be listed as a reviewer.
-
-START OF MAINTAINERS LIST
--------------------------
-
-M:  Lancelot Kao <lancelot.kao@fii-usa.com> <Lancelot-Kao!>
-M:  Mohaimen Alsamarai <Mohaimen.Alsamarai@fii-na.com> <Mohaimen13!>
diff --git a/README.md b/README.md
deleted file mode 100644
index e2aa7da..0000000
--- a/README.md
+++ /dev/null
@@ -1,64 +0,0 @@
-### Fii IPMI OEM Commands (0x34)
-
-There are and will be a variety of sys specific commands.
-
-### System Commands (0x h)
-
-#### PCIe Bifurcation Command 0x03
-
-The PCIe bifurcation command checks the type of pcei adapter instailled in
-each slot.
-
-Request
-
-|Byte(s) |Value  |Data
-|--------|-------|----
-|0x00|0x03|Subcommand
-
-Response
-
-|Byte(s) |Value  |Data
-|--------|-------|----
-|0x00|0x03|Subcommand
-|0x01|0x--|Bifurcation each bit identified the slot support x16(1b) or x8(0b)
-|0x02|0x--|Present bit each bit identified PCIe adapter installed(0b) or not(1b)
-
-Example
-|# |Command |Example
-|--------|-------|----
-|1|Read the information|ipmitool 0x34 0x03    
-
-### BIOS Related Commands (7x h)
-
-#### BIOS Boot Count 0x71
-
-This is a 32 bits register that provides bios pushs the boot counter to BMC, or 
-get the boot counter from BMC.
-
-Request
-
-|Byte(s) |Value  |Data
-|--------|-------|----
-|0x00|0x03|Subcommand
-|0x01|0x00/0x01| read/write the boot counter register
-|0x02|0x--|Byte 0
-|0x03|0x--|Byte 1
-|0x04|0x--|Byte 2
-|0x05|0x--|Byte 3
-
-Response
-
-|Byte(s) |Value  |Data
-|--------|-------|----
-|0x00|0x71|Subcommand
-|0x00|0x--|Byte 0
-|0x01|0x--|Byte 1
-|0x02|0x--|Byte 2
-|0x03|0x--|Byte 3
-
-Example
-|# |Command |Example
-|--------|-------|----
-|1|Read the boot count|ipmitool raw 0x34 0x71 0x00   
-|2|Add the boot count by 1|ipmitool raw 0x34 0x71 0x01   
-|3|Add the boot count by index|ipmitool raw 0x34 0x71 0x01 byte0 byte1 byte2 byte3   
diff --git a/generate-whitelist.py b/generate-whitelist.py
deleted file mode 100755
index c732726..0000000
--- a/generate-whitelist.py
+++ /dev/null
@@ -1,107 +0,0 @@
-#!/usr/bin/env python3
-
-import re, sys, os.path
-
-def usage():
-    sys.stderr.write("Usage: $0 whitelist-config-in whitelist-header-out\n")
-    sys.stderr.write("    Reads in whitelist config, sorting the contents\n")
-    sys.stderr.write("    and outputs a header file\n")
-    sys.exit(-1)
-
-class Error(Exception):
-    pass
-
-class DuplicateEntry(Error):
-    def __init__(self, e):
-        super(Error, self).__init__(
-             "Multiple entries with matching netfn/cmd found ({})".format(e))
-
-class ParseError(Error):
-    def __init__(self, d):
-        super(Error, self).__init__("Parse error at: '{}'".format(d))
-
-class entry:
-    linere = re.compile(
-            r'(0x[0-9a-f]{2}):(0x[0-9a-f]{2})((:(0x[0-9a-f]{4}))?)\s*((//\s*(.*))?)',
-            re.I
-        )
-    def __init__(self, data):
-        # parse data line into values:
-        # type 1, two values: netfn, cmd
-        # type 2, three values: netfn, cmd, channels
-        try:
-            m = self.linere.fullmatch(data).groups()
-        except:
-            raise ParseError(data)
-        self.netfn = int(m[0], 16)
-        self.cmd = int(m[1], 16)
-        if m[4] is not None:
-            self.channels = int(m[4], 16)
-        else:
-            # if no channel was provided, default to previous behavior, which
-            # is allow all interfaces, including the system interface (ch 15)
-            self.channels = 0xffff
-        if m[6] is not None:
-            self.comment = "// " + m[7]
-        else:
-            self.comment = "//"
-    def __str__(self):
-        return " ".join([ '{',
-            "0x{0.netfn:02x},".format(self),
-            "0x{0.cmd:02x},".format(self),
-            "0x{0.channels:04x}".format(self),
-            "},",
-            "{0.comment}".format(self),
-        ])
-    def __lt__(self, other):
-        if self.netfn == other.netfn:
-            return self.cmd < other.cmd
-        return self.netfn < other.netfn
-    def match(self, other):
-        return (self.netfn == other.netfn) and (self.cmd == other.cmd)
-
-def parse(config):
-    entries = []
-    with open(config) as f:
-        for line in f:
-            line = line.strip()
-            if len(line) == 0 or line[0] == '#':
-                continue
-            e = entry(line)
-            if any([e.match(item) for item in entries]):
-                d = DuplicateEntry(e)
-                sys.stderr.write("WARNING: {}\n".format(d))
-            else:
-                entries.append(e)
-    entries.sort()
-    return entries
-
-def output(entries, hppfile):
-    lines = [
-            "#pragma once",
-            "",
-            "// AUTOGENERATED FILE; DO NOT MODIFY",
-            "",
-            "#include <array>",
-            "#include <tuple>",
-            "",
-            "using netfncmd_tuple = std::tuple<unsigned char, unsigned char, unsigned short>;",
-            "",
-            "constexpr const std::array<netfncmd_tuple, {}> whitelist = ".format(
-                    len(entries)),
-            "{{"
-            ]
-    lines.extend(['    {}'.format(e) for e in entries])
-    lines.append("}};\n");
-
-    with open(hppfile, "w") as hpp:
-        hpp.write("\n".join(lines))
-
-
-if __name__ == "__main__":
-    if len(sys.argv) != 3:
-        usage()
-    config = sys.argv[1]
-    header = sys.argv[2]
-    entries = parse(config)
-    output(entries, header)
diff --git a/include/bioscommands.hpp b/include/bioscommands.hpp
deleted file mode 100644
index 15b6c13..0000000
--- a/include/bioscommands.hpp
+++ /dev/null
@@ -1,26 +0,0 @@
-/********************************************************************************
-*                       HON HAI Precision IND.Co., LTD.                         *
-*            Personal Computer & Enterprise Product Business Group              *
-*                      Enterprise Product Business Group                        *
-*                                                                               *
-*     Copyright (c) 2010 by FOXCONN/CESBG/CABG/SRD. All rights reserved.        *
-*     All data and information contained in this document is confidential       *
-*     and proprietary information of FOXCONN/CESBG/CABG/SRD and all rights      *
-*     are reserved. By accepting this material the recipient agrees that        *
-*     the information contained therein is held in confidence and in trust      *
-*     and will not be used, copied, reproduced in whole or in part, nor its     *
-*     contents revealed in any manner to others without the express written     *
-*     permission of FOXCONN/CESBG/CABG/SRD.                                     *
-*                                                                               *
-********************************************************************************/
-
-#pragma once
-
-#define BOOT_COUNT_FILE "/etc/conf/bios.cnt"
-
-enum fii_bios_cmds
-{
-    FII_CMD_BIOS_BOOT_COUNT = 0x71,
-};
-
-#define FII_CMD_BIOS_BOOT_COUNT_LEN 5
diff --git a/include/common.hpp b/include/common.hpp
deleted file mode 100644
index c2d64a9..0000000
--- a/include/common.hpp
+++ /dev/null
@@ -1,32 +0,0 @@
-/********************************************************************************
-*                       HON HAI Precision IND.Co., LTD.                         *
-*            Personal Computer & Enterprise Product Business Group              *
-*                      Enterprise Product Business Gro:qup                      *
-*                                                                               *
-*     Copyright (c) 2010 by FOXCONN/CESBG/CABG/SRD. All rights reserved.        *
-*     All data and information contained in this document is confidential       *
-*     and proprietary information of FOXCONN/CESBG/CABG/SRD and all rights      *
-*     are reserved. By accepting this material the recipient agrees that        *
-*     the information contained therein is held in confidence and in trust      *
-*     and will not be used, copied, reproduced in whole or in part, nor its     *
-*     contents revealed in any manner to others without the express written     *
-*     permission of FOXCONN/CESBG/CABG/SRD.                                     *
-*                                                                               *
-********************************************************************************/
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <iostream>
-#include <iomanip>
-#include <sstream>
-#include <fstream>
-
-#include <ipmid/api.hpp>
-#include <ipmid/utils.hpp>
-#include <ipmid/message.hpp>
-#include <phosphor-logging/log.hpp>
-#include <sdbusplus/message/types.hpp>
-
-#define OP_CODE_READ	0b00
-#define OP_CODE_WRITE	0b01
-
diff --git a/include/systemcommands.hpp b/include/systemcommands.hpp
deleted file mode 100644
index 2a67a0b..0000000
--- a/include/systemcommands.hpp
+++ /dev/null
@@ -1,24 +0,0 @@
-/********************************************************************************
-*                       HON HAI Precision IND.Co., LTD.                         *
-*            Personal Computer & Enterprise Product Business Group              *
-*                      Enterprise Product Business Group                        *
-*                                                                               *
-*     Copyright (c) 2010 by FOXCONN/CESBG/CABG/SRD. All rights reserved.        *
-*     All data and information contained in this document is confidential       *
-*     and proprietary information of FOXCONN/CESBG/CABG/SRD and all rights      *
-*     are reserved. By accepting this material the recipient agrees that        *
-*     the information contained therein is held in confidence and in trust      *
-*     and will not be used, copied, reproduced in whole or in part, nor its     *
-*     contents revealed in any manner to others without the express written     *
-*     permission of FOXCONN/CESBG/CABG/SRD.                                     *
-*                                                                               *
-********************************************************************************/
-
-#pragma once
-
-#define PCIEINFO_COMMAND "i2cget -y -a -f 26 0x76 0x01 i 2"
-
-enum fii_sys_cmds
-{
-    FII_CMD_SYS_PCIE_INFO = 0x03,
-};
diff --git a/ipmi-whitelist.conf b/ipmi-whitelist.conf
deleted file mode 100644
index 67b9f76..0000000
--- a/ipmi-whitelist.conf
+++ /dev/null
@@ -1,81 +0,0 @@
-#<NetFn>:<Command>
-0x00:0x00    //<Chassis>:<Chassis Capabiliti>
-0x00:0x01    //<Chassis>:<Get Chassis Status>
-0x00:0x02    //<Chassis>:<Chassis Control>
-0x00:0x04    //<Chassis>:<Chassis Identify>
-0x00:0x05    //<Chassis>:<Set Chassis Capabilities>
-0x00:0x06    //<Chassis>:<Set Power Restore Policy>
-0x00:0x08    //<Chassis>:<Set System Boot Options>
-0x00:0x09    //<Chassis>:<Get System Boot Options>
-0x00:0x0F    //<Chassis>:<Get POH Counter>
-0x04:0x02    //<Sensor/Event>:<Platform Event>
-0x04:0x20    //<Sensor/Event>:<Get Device SDR Info>
-0x04:0x21    //<Sensor/Event>:<Get Device SDR>
-0x04:0x22    //<Sensor/Event>:<Reserve Device SDR Repository>
-0x04:0x27    //<Sensor/Event>:<Get Sensor Threshold>
-0x04:0x29    //<Sensor/Event>:<Get Sensor Event Enable>
-0x04:0x2B    //<Sensor/Event>:<Get Sensor Event Status>
-0x04:0x2D    //<Sensor/Event>:<Get Sensor Reading>
-0x04:0x2F    //<Sensor/Event>:<Get Sensor Type>
-0x04:0x30    //<Sensor/Event>:<Set Sensor Reading and Event Status>
-0x06:0x01    //<App>:<Get Device ID>
-0x06:0x02    //<App>:<Cold Reset>
-0x06:0x03    //<App>:<Warm Reset>
-0x06:0x04    //<App>:<Get Self Test Results>
-0x06:0x06    //<App>:<Set ACPI Power State>
-0x06:0x07    //<App>:<Get ACPI Power State>
-0x06:0x08    //<App>:<Get Device GUID>
-0x06:0x22    //<App>:<Reset Watchdog Timer>
-0x06:0x24    //<App>:<Set Watchdog Timer>
-0x06:0x25    //<App>:<Get Watchdog Timer>
-0x06:0x35    //<App>:<Read Event Message Buffer>
-0x06:0x3D    //<App>:<Get Session Info>
-0x06:0x40    //<App>:<Set Channel Access>
-0x06:0x41    //<App>:<Get Channel Access>
-0x06:0x42    //<App>:<Get Channel Info>
-0x06:0x43    //<App>:<Set User Access>
-0x06:0x44    //<App>:<Get User Access>
-0x06:0x45    //<App>:<Set User Name>
-0x06:0x46    //<App>:<Get User Name>
-0x06:0x47    //<App>:<Set User Password>
-0x06:0x48    //<App>:<Activate Payload>
-0x06:0x49    //<App>:<Deactivate Payload>
-0x06:0x4A    //<App>:<Get Payload Activation Status>
-0x06:0x4B    //<App>:<Get Payload Instance Info>
-0x06:0x54    //<App>:<Get Channel Cipher Suites>
-0x06:0x58    //<App>:<Set System Info Parameters>
-0x06:0x59    //<App>:<Get System Info Parameters>
-0x0A:0x10    //<Storage>:<Get FRU Inventory Area Info>
-0x0A:0x11    //<Storage>:<Read FRU Data>
-0x0A:0x20    //<Storage>:<Get SDR Repository Info>
-0x0A:0x22    //<Storage>:<Reserve SDR Repository>
-0x0A:0x23    //<Storage>:<Get SDR>
-0x0A:0x40    //<Storage>:<Get SEL Info>
-0x0A:0x42    //<Storage>:<Reserve SEL>
-0x0A:0x43    //<Storage>:<Get SEL Entry>
-0x0A:0x44    //<Storage>:<Add SEL Entry>
-0x0A:0x46    //<Storage>:<Delete SEL Entry>
-0x0A:0x47    //<Storage>:<Clear SEL>
-0x0A:0x48    //<Storage>:<Get SEL Time>
-0x0A:0x49    //<Storage>:<Set SEL Time>
-0x0C:0x01    //<Transport>:<Set LAN Configuration Parameters>
-0x0C:0x02    //<Transport>:<Get LAN Configuration Parameters>
-0x2C:0x00    //<Group Extension>:<Group Extension Command>
-0x2C:0x01    //<Group Extension>:<Get DCMI Capabilities>
-0x2C:0x02    //<Group Extension>:<Get Power Reading>
-0x2C:0x03    //<Group Extension>:<Get Power Limit>
-0x2C:0x06    //<Group Extension>:<Get Asset Tag>
-0x2C:0x07    //<Group Extension>:<Get Sensor Info>
-0x2C:0x09    //<Group Extension>:<Get Management Controller Identifier String>
-0x2C:0x0A    //<Group Extension>:<Set Management Controller Identifier String>
-0x2C:0x10    //<Group Extension>:<Get Temperature Readings>
-0x2C:0x12    //<Group Extension>:<Set DCMI Configuration Parameters>
-0x2C:0x13    //<Group Extension>:<Get DCMI Configuration Parameters>
-0x2C:0x3E    //<Group Extension>:<Get HPM.x Capabilities>
-0x2E:0x02    //<Google OEM>:<I2C via Proxy Adapter>
-0x2E:0x04    //<Google OEM>:<Fan Manual Control Mode>
-0x2E:0x30    //<Google OEM>:<Ethernet Statistics>
-0x2E:0x32    //<Google OEM>:<Sys Commands>
-0x2E:0x80    //<Google OEM>:<Blob Commands>
-0x34:0x03    //<Fii OEM>:<System PCIe Bifurcation Commands>
-0x34:0x71    //<Fii OEM>:<BIOS Boot Count Commands>
diff --git a/src/bioscommands.cpp b/src/bioscommands.cpp
deleted file mode 100644
index 9670def..0000000
--- a/src/bioscommands.cpp
+++ /dev/null
@@ -1,105 +0,0 @@
-/********************************************************************************
-*                       HON HAI Precision IND.Co., LTD.                         *
-*            Personal Computer & Enterprise Product Business Group              *
-*                      Enterprise Product Business Gro:qup                      *
-*                                                                               *
-*     Copyright (c) 2010 by FOXCONN/CESBG/CABG/SRD. All rights reserved.        *
-*     All data and information contained in this document is confidential       *
-*     and proprietary information of FOXCONN/CESBG/CABG/SRD and all rights      *
-*     are reserved. By accepting this material the recipient agrees that        *
-*     the information contained therein is held in confidence and in trust      *
-*     and will not be used, copied, reproduced in whole or in part, nor its     *
-*     contents revealed in any manner to others without the express written     *
-*     permission of FOXCONN/CESBG/CABG/SRD.                                     *
-*                                                                               *
-********************************************************************************/
-
-#include <common.hpp>
-#include <bioscommands.hpp>
-
-namespace ipmi
-{
-    static void registerBIOSFunctions() __attribute__((constructor));
-
-    ipmi::RspType<std::vector<uint8_t>> FiiBIOSBootCount(boost::asio::yield_context yield, std::vector<uint8_t> reqParams)
-    {
-        bool op;
-        std::vector<uint8_t> boot_count;
-        uint32_t counter = 0, ret;
-
-        if (reqParams.empty())
-        {
-            phosphor::logging::log<phosphor::logging::level::ERR>(" Fii bios cmd : command format error.");
-            return ipmi::responseReqDataLenInvalid();
-        }
-
-        op = reqParams[0] & 0b11;
-        // check the boot count file exist or not
-        std::fstream fptr(BOOT_COUNT_FILE);
-
-        if (!fptr.is_open())
-        {
-            std::cerr << " Fii bios cmd : file didn't exist and try to create one\n";
-            ret = system("mkdir -p /etc/conf");
-            std::ofstream outfile (BOOT_COUNT_FILE);
-            outfile << "0" << std::endl;
-            outfile.close();
-            boot_count.push_back(static_cast<uint8_t>(counter));
-            boot_count.push_back(static_cast<uint8_t>(counter >> 8));
-            boot_count.push_back(static_cast<uint8_t>(counter >> 16));
-            boot_count.push_back(static_cast<uint8_t>(counter >> 24));
-            return ipmi::responseSuccess(boot_count);
-        }
-        else
-        {
-            std::string str;
-            while (std::getline(fptr, str))
-            {
-                //boot_count.push_back(static_cast<uint8_t>(std::stoul(str)));
-                counter = (std::stoul(str));
-                //std::cerr << " Fii bios cmd : " << counter << std::endl;
-            }
-            boot_count.push_back(static_cast<uint8_t>(counter));
-            boot_count.push_back(static_cast<uint8_t>(counter >> 8));
-            boot_count.push_back(static_cast<uint8_t>(counter >> 16));
-            boot_count.push_back(static_cast<uint8_t>(counter >> 24));
-            fptr.close();
-        }
-        if (op == OP_CODE_READ)
-        {
-            return ipmi::responseSuccess(boot_count);
-        }
-        else if (op == OP_CODE_WRITE)
-        {
-            uint32_t value = 0;
-            if (reqParams.size() == 1)
-            {
-                boot_count[0] += 1;
-                value = boot_count[0] + (boot_count[1] << 8) + (boot_count[2] << 16) + (boot_count[3] << 24);
-            }
-            else if (reqParams.size() == FII_CMD_BIOS_BOOT_COUNT_LEN)
-            {
-                value = reqParams[1] + + (reqParams[2] << 8) + (reqParams[3] << 16) + (reqParams[4] << 24);
-                boot_count.clear();
-                boot_count.insert(boot_count.begin(), reqParams.begin()+1, reqParams.end());
-            }
-            std::ofstream fptr_w(BOOT_COUNT_FILE, std::ios::out | std::ios::trunc);
-            fptr_w << value << std::endl;
-            fptr_w.close();
-        }
-        else
-        {
-            return ipmi::responseInvalidCommand();
-        }
-        return ipmi::responseSuccess(boot_count);   
-    }
-
-    void registerBIOSFunctions()
-    {
-        std::fprintf(stderr, "Registering OEM:[0x34], Cmd:[%#04X] for Fii BIOS OEM Commands\n", FII_CMD_BIOS_BOOT_COUNT);
-        ipmi::registerHandler(ipmi::prioOemBase, ipmi::netFnOemThree, FII_CMD_BIOS_BOOT_COUNT, ipmi::Privilege::User,
-            FiiBIOSBootCount);
-
-        return;
-    }
-}
diff --git a/src/systemcommands.cpp b/src/systemcommands.cpp
deleted file mode 100644
index eb5a578..0000000
--- a/src/systemcommands.cpp
+++ /dev/null
@@ -1,70 +0,0 @@
-/********************************************************************************
-*                       HON HAI Precision IND.Co., LTD.                         *
-*            Personal Computer & Enterprise Product Business Group              *
-*                      Enterprise Product Business Gro:qup                      *
-*                                                                               *
-*     Copyright (c) 2010 by FOXCONN/CESBG/CABG/SRD. All rights reserved.        *
-*     All data and information contained in this document is confidential       *
-*     and proprietary information of FOXCONN/CESBG/CABG/SRD and all rights      *
-*     are reserved. By accepting this material the recipient agrees that        *
-*     the information contained therein is held in confidence and in trust      *
-*     and will not be used, copied, reproduced in whole or in part, nor its     *
-*     contents revealed in any manner to others without the express written     *
-*     permission of FOXCONN/CESBG/CABG/SRD.                                     *
-*                                                                               *
-********************************************************************************/
-
-#include <common.hpp>
-#include <systemcommands.hpp>
-
-#include <stdio.h>
-
-namespace ipmi
-{
-static void registerSystemFunctions() __attribute__((constructor));
- 
-ipmi::RspType<std::vector<uint8_t>> FiiSysPCIeInfo(boost::asio::yield_context yield)
-{
-	std::vector<uint8_t> rsp;
-	char buffer[128], *token;
-	uint32_t value;
-	FILE *pipe = popen(PCIEINFO_COMMAND, "r");
-
-	// Read pcie bifurcation information
-	// it return two bytes, 1st byte bifurcation, 2nd byte present pin
-	if (!pipe) throw std::runtime_error("popen() failed !!!");
-	while (fgets(buffer, sizeof(buffer), pipe) != NULL)
-	{
-		std::cerr << " Command : " << buffer << std::endl;
-	}
-	pclose(pipe);
-
-	token = std::strtok(buffer, " ");
-	if (token == NULL)
-	{
-		phosphor::logging::log<phosphor::logging::level::ERR>(
-			"Fii system cmd : Error geting PCIe Info came back null");
-		ipmi::responseUnspecifiedError();
-	}
-	token = std::strtok(NULL, " ");
-	while (token != NULL)
-	{
-		//std::cerr << " Command token: " << token << std::endl;
-		value = std::stoul(token, nullptr, 16);
-		//std::cerr << " Command value: " << value << ":" << std::hex << value << std::endl;
-		rsp.push_back(static_cast<uint8_t>(value & 0xFF));
-		token = std::strtok(NULL, " ");
-	}
-  
-	return ipmi::responseSuccess(rsp);   
-}
-    
-void registerSystemFunctions()
-{
-	std::fprintf(stderr, "Registering OEM:[0x34], Cmd:[%#04X] for Fii System OEM Commands\n", FII_CMD_SYS_PCIE_INFO);
-	ipmi::registerHandler(ipmi::prioOemBase, ipmi::netFnOemThree, FII_CMD_SYS_PCIE_INFO, ipmi::Privilege::User,
-				FiiSysPCIeInfo);
-    
-	return;
-}
-}
