diff --git a/sensors/.clang-format b/sensors/.clang-format
deleted file mode 100644
index dd27708..0000000
--- a/sensors/.clang-format
+++ /dev/null
@@ -1,98 +0,0 @@
----
-Language:        Cpp
-# BasedOnStyle:  LLVM
-AccessModifierOffset: -2
-AlignAfterOpenBracket: Align
-AlignConsecutiveAssignments: false
-AlignConsecutiveDeclarations: false
-AlignEscapedNewlinesLeft: false
-AlignOperands:   true
-AlignTrailingComments: true
-AllowAllParametersOfDeclarationOnNextLine: true
-AllowShortBlocksOnASingleLine: false
-AllowShortCaseLabelsOnASingleLine: false
-AllowShortFunctionsOnASingleLine: None
-AllowShortIfStatementsOnASingleLine: false
-AllowShortLoopsOnASingleLine: false
-AlwaysBreakAfterDefinitionReturnType: None
-AlwaysBreakAfterReturnType: None
-AlwaysBreakBeforeMultilineStrings: false
-AlwaysBreakTemplateDeclarations: false
-BinPackArguments: true
-BinPackParameters: true
-BraceWrapping:
-  AfterClass:      true
-  AfterControlStatement: true
-  AfterEnum:       true
-  AfterFunction:   true
-  AfterNamespace:  true
-  AfterObjCDeclaration: true
-  AfterStruct:     true
-  AfterUnion:      true
-  BeforeCatch:     true
-  BeforeElse:      true
-  IndentBraces:    false
-BreakBeforeBinaryOperators: None
-BreakBeforeBraces: Custom
-BreakBeforeTernaryOperators: true
-BreakConstructorInitializers: AfterColon
-ColumnLimit:     80
-CommentPragmas:  '^ IWYU pragma:'
-ConstructorInitializerAllOnOneLineOrOnePerLine: false
-ConstructorInitializerIndentWidth: 4
-ContinuationIndentWidth: 4
-Cpp11BracedListStyle: true
-DerivePointerAlignment: true
-PointerAlignment: Left
-DisableFormat:   false
-ExperimentalAutoDetectBinPacking: false
-FixNamespaceComments: true
-ForEachMacros:   [ foreach, Q_FOREACH, BOOST_FOREACH ]
-IncludeBlocks: Regroup
-IncludeCategories:
-  - Regex:           '^[<"](gtest|gmock)'
-    Priority:        5
-  - Regex:           '^"config.h"'
-    Priority:        -1
-  - Regex:           '^".*\.hpp"'
-    Priority:        1
-  - Regex:           '^<.*\.h>'
-    Priority:        2
-  - Regex:           '^<.*'
-    Priority:        3
-  - Regex:           '.*'
-    Priority:        4
-IndentCaseLabels: true
-IndentWidth:     4
-IndentWrappedFunctionNames: true
-KeepEmptyLinesAtTheStartOfBlocks: true
-MacroBlockBegin: ''
-MacroBlockEnd:   ''
-MaxEmptyLinesToKeep: 1
-NamespaceIndentation: None
-ObjCBlockIndentWidth: 2
-ObjCSpaceAfterProperty: false
-ObjCSpaceBeforeProtocolList: true
-PenaltyBreakBeforeFirstCallParameter: 19
-PenaltyBreakComment: 300
-PenaltyBreakFirstLessLess: 120
-PenaltyBreakString: 1000
-PenaltyExcessCharacter: 1000000
-PenaltyReturnTypeOnItsOwnLine: 60
-PointerAlignment: Right
-ReflowComments:  true
-SortIncludes:    true
-SpaceAfterCStyleCast: false
-SpaceBeforeAssignmentOperators: true
-SpaceBeforeParens: ControlStatements
-SpaceInEmptyParentheses: false
-SpacesBeforeTrailingComments: 1
-SpacesInAngles:  false
-SpacesInContainerLiterals: true
-SpacesInCStyleCastParentheses: false
-SpacesInParentheses: false
-SpacesInSquareBrackets: false
-Standard:        Cpp11
-TabWidth:        4
-UseTab:          Never
-...
diff --git a/sensors/.gitignore b/sensors/.gitignore
deleted file mode 100644
index 4fa6dc2..0000000
--- a/sensors/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-build
-.vscode
-toolchain.cmake
diff --git a/sensors/CMakeLists.txt b/sensors/CMakeLists.txt
deleted file mode 100644
index a1c80e4..0000000
--- a/sensors/CMakeLists.txt
+++ /dev/null
@@ -1,125 +0,0 @@
-cmake_minimum_required (VERSION 2.8.10 FATAL_ERROR)
-set (BUILD_SHARED_LIBRARIES OFF)
-include (ExternalProject)
-set (CMAKE_CXX_STANDARD 17)
-set (CMAKE_CXX_STANDARD_REQUIRED ON)
-set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -lstdc++fs")
-set (CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake ${CMAKE_MODULE_PATH})
-
-option (HUNTER_ENABLED "Enable hunter package pulling" OFF)
-include ("cmake/HunterGate.cmake")
-
-huntergate (URL "https://github.com/ruslo/hunter/archive/v0.18.64.tar.gz" SHA1
-            "baf9c8cc4f65306f0e442b5419967b4c4c04589a")
-
-project (sensors CXX)
-
-set (FAN_SRC_FILES src/TachSensor.cpp src/PwmSensor.cpp src/Utils.cpp
-     src/Thresholds.cpp)
-
-set (HWMON_TEMP_SRC_FILES src/Utils.cpp src/HwmonTempSensor.cpp
-     src/Thresholds.cpp)
-
-set (CPU_SRC_FILES src/Utils.cpp src/CPUSensor.cpp src/Thresholds.cpp)
-
-set (ADC_SRC_FILES src/Utils.cpp src/ADCSensor.cpp src/Thresholds.cpp)
-
-set (EXTERNAL_PACKAGES Boost sdbusplus-project nlohmann-json)
-set (SENSOR_LINK_LIBS -lsystemd stdc++fs sdbusplus)
-
-option (EXTERNAL_PROJECT "Enable Cloning External Projects" OFF)
-if (EXTERNAL_PROJECT)
-    option (ENABLE_TEST "Enable Google Test" OFF)
-    include_directories (${CMAKE_CURRENT_SOURCE_DIR}/include/non-yocto)
-
-    externalproject_add (
-        Boost URL
-        https://dl.bintray.com/boostorg/release/1.66.0/source/boost_1_66_0.tar.gz
-        URL_MD5 d275cd85b00022313c171f602db59fc5 SOURCE_DIR
-        "${CMAKE_BINARY_DIR}/boost-src" BINARY_DIR
-        "${CMAKE_BINARY_DIR}/boost-build" CONFIGURE_COMMAND "" BUILD_COMMAND ""
-        INSTALL_COMMAND ""
-    )
-    include_directories (${CMAKE_BINARY_DIR}/boost-src)
-    set (CMAKE_PREFIX_PATH ${CMAKE_BINARY_DIR}/boost-src ${CMAKE_PREFIX_PATH})
-
-    # requires apt install autoconf-archive and autoconf
-    externalproject_add (sdbusplus-project PREFIX
-                         ${CMAKE_BINARY_DIR}/sdbusplus-project GIT_REPOSITORY
-                         https://github.com/openbmc/sdbusplus.git SOURCE_DIR
-                         ${CMAKE_BINARY_DIR}/sdbusplus-src BINARY_DIR
-                         ${CMAKE_BINARY_DIR}/sdbusplus-build CONFIGURE_COMMAND
-                         "" BUILD_COMMAND cd ${CMAKE_BINARY_DIR}/sdbusplus-src
-                         && ./bootstrap.sh && ./configure --enable-transaction
-                         && make -j libsdbusplus.la INSTALL_COMMAND ""
-                         LOG_DOWNLOAD ON)
-    include_directories (${CMAKE_BINARY_DIR}/sdbusplus-src)
-    link_directories (${CMAKE_BINARY_DIR}/sdbusplus-src/.libs)
-
-    externalproject_add (nlohmann-json PREFIX
-                         ${CMAKE_CURRENT_BINARY_DIR}/nlohmann-json
-                         GIT_REPOSITORY https://github.com/nlohmann/json.git
-                         SOURCE_DIR ${CMAKE_BINARY_DIR}/nlohmann-json-src
-                         BINARY_DIR ${CMAKE_BINARY_DIR}/nlohmann-json-build
-                         CONFIGURE_COMMAND "" BUILD_COMMAND "" INSTALL_COMMAND
-                         "" LOG_DOWNLOAD ON)
-    include_directories (${CMAKE_BINARY_DIR}/nlohmann-json-src/include)
-    if (ENABLE_TEST)
-        option (HUNTER_ENABLED "Enable hunter package pulling" ON)
-        hunter_add_package (GTest)
-
-        find_package (GTest CONFIG REQUIRED)
-
-        enable_testing ()
-
-        add_executable (runTachTests tests/test_TachSensor.cpp ${FAN_SRC_FILES})
-        add_test (NAME test_fansensor COMMAND runTachTests)
-        target_link_libraries (runTachTests GTest::main GTest::gtest pthread
-                               ${DBUS_LIBRARIES} stdc++fs)
-        add_dependencies (runTachTests nlohmann-json)
-
-        add_executable (runHwmonTempTests tests/test_HwmonTempSensor.cpp
-                        ${HWMON_TEMP_SRC_FILES})
-        add_test (NAME test_hwmontempsensor COMMAND runHwmonTempTests)
-        target_link_libraries (runHwmonTempTests GTest::main GTest::gtest
-                               pthread ${DBUS_LIBRARIES} stdc++fs)
-        add_dependencies (runHwmonTempTests nlohmann-json)
-    endif ()
-
-endif ()
-
-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)
-
-link_directories (${EXTERNAL_INSTALL_LOCATION}/lib)
-
-include_directories (${CMAKE_CURRENT_SOURCE_DIR}/include)
-
-add_executable (fansensor src/FanMain.cpp ${FAN_SRC_FILES})
-add_dependencies (fansensor sdbusplus)
-target_link_libraries (fansensor ${SENSOR_LINK_LIBS})
-
-add_executable (hwmontempsensor src/HwmonTempMain.cpp ${HWMON_TEMP_SRC_FILES})
-add_dependencies (hwmontempsensor sdbusplus)
-target_link_libraries (hwmontempsensor ${SENSOR_LINK_LIBS})
-
-add_executable (cpusensor src/CPUSensorMain.cpp ${CPU_SRC_FILES})
-add_dependencies (cpusensor sdbusplus)
-target_link_libraries (cpusensor ${SENSOR_LINK_LIBS})
-
-add_executable (adcsensor src/ADCSensorMain.cpp ${ADC_SRC_FILES})
-add_dependencies (adcsensor sdbusplus)
-target_link_libraries (adcsensor ${SENSOR_LINK_LIBS})
-
-if (EXTERNAL_PROJECT)
-    add_dependencies (fansensor ${EXTERNAL_PACKAGES})
-    add_dependencies (hwmontempsensor ${EXTERNAL_PACKAGES})
-    add_dependencies (adcsensor ${EXTERNAL_PACKAGES})
-    add_dependencies (cpusensor ${EXTERNAL_PACKAGES})
-endif ()
-
-install (TARGETS fansensor hwmontempsensor cpusensor adcsensor DESTINATION bin)
diff --git a/sensors/Jenkinsfile b/sensors/Jenkinsfile
deleted file mode 100644
index c4f6c7a..0000000
--- a/sensors/Jenkinsfile
+++ /dev/null
@@ -1,26 +0,0 @@
-#!groovy
-
-
-stage 'Debug Build'
-    sh '''
-    rm -rf build_debug
-    mkdir build_debug
-    cd build_debug
-    cmake .. -DCMAKE_BUILD_TYPE="Debug" -DHUNTER_ENABLED=1 -DEXTERNAL_PROJECT=1
-    cmake --build .'''
-
-stage 'Debug Test'
-    sh '''cd build_debug
-    dbus-launch ctest -V --output-on-failure'''
-
-stage 'Release Build'
-    sh '''
-    rm -rf build_release
-    mkdir build_release
-    cd build_release
-    cmake .. -DCMAKE_BUILD_TYPE="Release" -DHUNTER_ENABLED=1 -DEXTERNAL_PROJECT=1
-    cmake --build .'''
-
-stage 'Release Test'
-    sh '''cd build_release
-    dbus-launch ctest -V --output-on-failure'''
diff --git a/sensors/cmake-format.json b/sensors/cmake-format.json
deleted file mode 100644
index 4a68fb7..0000000
--- a/sensors/cmake-format.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
-  "enum_char": ".",
-  "line_ending": "unix",
-  "bullet_char": "*",
-  "max_subargs_per_line": 99,
-  "command_case": "lower",
-  "tab_size": 4,
-  "line_width": 80,
-  "separate_fn_name_with_space": true,
-  "dangle_parens": true,
-  "separate_ctrl_name_with_space": true
-}
-
diff --git a/sensors/cmake/Finddbus.cmake b/sensors/cmake/Finddbus.cmake
deleted file mode 100644
index 2d8eea2..0000000
--- a/sensors/cmake/Finddbus.cmake
+++ /dev/null
@@ -1,61 +0,0 @@
-# - Try to find DBus
-# Once done, this will define
-#
-#  DBUS_FOUND - system has DBus
-#  DBUS_INCLUDE_DIRS - the DBus include directories
-#  DBUS_LIBRARIES - link these to use DBus
-#
-# Copyright (C) 2012 Raphael Kubo da Costa <rakuco@webkit.org>
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-# 1.  Redistributions of source code must retain the above copyright
-#     notice, this list of conditions and the following disclaimer.
-# 2.  Redistributions in binary form must reproduce the above copyright
-#     notice, this list of conditions and the following disclaimer in the
-#     documentation and/or other materials provided with the distribution.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND ITS CONTRIBUTORS ``AS
-# IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
-# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR ITS
-# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
-# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
-# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-FIND_PACKAGE(PkgConfig)
-PKG_CHECK_MODULES(PC_DBUS QUIET dbus-1)
-
-FIND_LIBRARY(DBUS_LIBRARIES
-    NAMES dbus-1
-    HINTS ${PC_DBUS_LIBDIR}
-          ${PC_DBUS_LIBRARY_DIRS}
-)
-
-message("DBUS_LIBRARIES = ${DBUS_LIBRARIES}")
-
-FIND_PATH(DBUS_INCLUDE_DIR
-    NAMES dbus/dbus.h
-    HINTS ${PC_DBUS_INCLUDEDIR}
-          ${PC_DBUS_INCLUDE_DIRS}
-)
-
-GET_FILENAME_COMPONENT(_DBUS_LIBRARY_DIR ${DBUS_LIBRARIES} PATH)
-FIND_PATH(DBUS_ARCH_INCLUDE_DIR
-    NAMES dbus/dbus-arch-deps.h
-    HINTS ${PC_DBUS_INCLUDEDIR}
-          ${PC_DBUS_INCLUDE_DIRS}
-          ${_DBUS_LIBRARY_DIR}
-          ${DBUS_INCLUDE_DIR}
-    PATH_SUFFIXES include
-)
-
-SET(DBUS_INCLUDE_DIRS ${DBUS_INCLUDE_DIR} ${DBUS_ARCH_INCLUDE_DIR})
-
-INCLUDE(FindPackageHandleStandardArgs)
-FIND_PACKAGE_HANDLE_STANDARD_ARGS(DBUS REQUIRED_VARS DBUS_INCLUDE_DIRS DBUS_LIBRARIES)
diff --git a/sensors/cmake/HunterGate.cmake b/sensors/cmake/HunterGate.cmake
deleted file mode 100644
index 97f69cc..0000000
--- a/sensors/cmake/HunterGate.cmake
+++ /dev/null
@@ -1,514 +0,0 @@
-# Copyright (c) 2013-2015, Ruslan Baratov
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions are met:
-#
-# * Redistributions of source code must retain the above copyright notice, this
-#   list of conditions and the following disclaimer.
-#
-# * Redistributions in binary form must reproduce the above copyright notice,
-#   this list of conditions and the following disclaimer in the documentation
-#   and/or other materials provided with the distribution.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-# This is a gate file to Hunter package manager.
-# Include this file using `include` command and add package you need, example:
-#
-#     cmake_minimum_required(VERSION 3.0)
-#
-#     include("cmake/HunterGate.cmake")
-#     HunterGate(
-#         URL "https://github.com/path/to/hunter/archive.tar.gz"
-#         SHA1 "798501e983f14b28b10cda16afa4de69eee1da1d"
-#     )
-#
-#     project(MyProject)
-#
-#     hunter_add_package(Foo)
-#     hunter_add_package(Boo COMPONENTS Bar Baz)
-#
-# Projects:
-#     * https://github.com/hunter-packages/gate/
-#     * https://github.com/ruslo/hunter
-
-option(HUNTER_ENABLED "Enable Hunter package manager support" ON)
-if(HUNTER_ENABLED)
-  if(CMAKE_VERSION VERSION_LESS "3.0")
-    message(FATAL_ERROR "At least CMake version 3.0 required for hunter dependency management."
-      " Update CMake or set HUNTER_ENABLED to OFF.")
-  endif()
-endif()
-
-include(CMakeParseArguments) # cmake_parse_arguments
-
-option(HUNTER_STATUS_PRINT "Print working status" ON)
-option(HUNTER_STATUS_DEBUG "Print a lot info" OFF)
-
-set(HUNTER_WIKI "https://github.com/ruslo/hunter/wiki")
-
-function(hunter_gate_status_print)
-  foreach(print_message ${ARGV})
-    if(HUNTER_STATUS_PRINT OR HUNTER_STATUS_DEBUG)
-      message(STATUS "[hunter] ${print_message}")
-    endif()
-  endforeach()
-endfunction()
-
-function(hunter_gate_status_debug)
-  foreach(print_message ${ARGV})
-    if(HUNTER_STATUS_DEBUG)
-      string(TIMESTAMP timestamp)
-      message(STATUS "[hunter *** DEBUG *** ${timestamp}] ${print_message}")
-    endif()
-  endforeach()
-endfunction()
-
-function(hunter_gate_wiki wiki_page)
-  message("------------------------------ WIKI -------------------------------")
-  message("    ${HUNTER_WIKI}/${wiki_page}")
-  message("-------------------------------------------------------------------")
-  message("")
-  message(FATAL_ERROR "")
-endfunction()
-
-function(hunter_gate_internal_error)
-  message("")
-  foreach(print_message ${ARGV})
-    message("[hunter ** INTERNAL **] ${print_message}")
-  endforeach()
-  message("[hunter ** INTERNAL **] [Directory:${CMAKE_CURRENT_LIST_DIR}]")
-  message("")
-  hunter_gate_wiki("error.internal")
-endfunction()
-
-function(hunter_gate_fatal_error)
-  cmake_parse_arguments(hunter "" "WIKI" "" "${ARGV}")
-  string(COMPARE EQUAL "${hunter_WIKI}" "" have_no_wiki)
-  if(have_no_wiki)
-    hunter_gate_internal_error("Expected wiki")
-  endif()
-  message("")
-  foreach(x ${hunter_UNPARSED_ARGUMENTS})
-    message("[hunter ** FATAL ERROR **] ${x}")
-  endforeach()
-  message("[hunter ** FATAL ERROR **] [Directory:${CMAKE_CURRENT_LIST_DIR}]")
-  message("")
-  hunter_gate_wiki("${hunter_WIKI}")
-endfunction()
-
-function(hunter_gate_user_error)
-  hunter_gate_fatal_error(${ARGV} WIKI "error.incorrect.input.data")
-endfunction()
-
-function(hunter_gate_self root version sha1 result)
-  string(COMPARE EQUAL "${root}" "" is_bad)
-  if(is_bad)
-    hunter_gate_internal_error("root is empty")
-  endif()
-
-  string(COMPARE EQUAL "${version}" "" is_bad)
-  if(is_bad)
-    hunter_gate_internal_error("version is empty")
-  endif()
-
-  string(COMPARE EQUAL "${sha1}" "" is_bad)
-  if(is_bad)
-    hunter_gate_internal_error("sha1 is empty")
-  endif()
-
-  string(SUBSTRING "${sha1}" 0 7 archive_id)
-
-  if(EXISTS "${root}/cmake/Hunter")
-    set(hunter_self "${root}")
-  else()
-    set(
-        hunter_self
-        "${root}/_Base/Download/Hunter/${version}/${archive_id}/Unpacked"
-    )
-  endif()
-
-  set("${result}" "${hunter_self}" PARENT_SCOPE)
-endfunction()
-
-# Set HUNTER_GATE_ROOT cmake variable to suitable value.
-function(hunter_gate_detect_root)
-  # Check CMake variable
-  string(COMPARE NOTEQUAL "${HUNTER_ROOT}" "" not_empty)
-  if(not_empty)
-    set(HUNTER_GATE_ROOT "${HUNTER_ROOT}" PARENT_SCOPE)
-    hunter_gate_status_debug("HUNTER_ROOT detected by cmake variable")
-    return()
-  endif()
-
-  # Check environment variable
-  string(COMPARE NOTEQUAL "$ENV{HUNTER_ROOT}" "" not_empty)
-  if(not_empty)
-    set(HUNTER_GATE_ROOT "$ENV{HUNTER_ROOT}" PARENT_SCOPE)
-    hunter_gate_status_debug("HUNTER_ROOT detected by environment variable")
-    return()
-  endif()
-
-  # Check HOME environment variable
-  string(COMPARE NOTEQUAL "$ENV{HOME}" "" result)
-  if(result)
-    set(HUNTER_GATE_ROOT "$ENV{HOME}/.hunter" PARENT_SCOPE)
-    hunter_gate_status_debug("HUNTER_ROOT set using HOME environment variable")
-    return()
-  endif()
-
-  # Check SYSTEMDRIVE and USERPROFILE environment variable (windows only)
-  if(WIN32)
-    string(COMPARE NOTEQUAL "$ENV{SYSTEMDRIVE}" "" result)
-    if(result)
-      set(HUNTER_GATE_ROOT "$ENV{SYSTEMDRIVE}/.hunter" PARENT_SCOPE)
-      hunter_gate_status_debug(
-          "HUNTER_ROOT set using SYSTEMDRIVE environment variable"
-      )
-      return()
-    endif()
-
-    string(COMPARE NOTEQUAL "$ENV{USERPROFILE}" "" result)
-    if(result)
-      set(HUNTER_GATE_ROOT "$ENV{USERPROFILE}/.hunter" PARENT_SCOPE)
-      hunter_gate_status_debug(
-          "HUNTER_ROOT set using USERPROFILE environment variable"
-      )
-      return()
-    endif()
-  endif()
-
-  hunter_gate_fatal_error(
-      "Can't detect HUNTER_ROOT"
-      WIKI "error.detect.hunter.root"
-  )
-endfunction()
-
-macro(hunter_gate_lock dir)
-  if(NOT HUNTER_SKIP_LOCK)
-    if("${CMAKE_VERSION}" VERSION_LESS "3.2")
-      hunter_gate_fatal_error(
-          "Can't lock, upgrade to CMake 3.2 or use HUNTER_SKIP_LOCK"
-          WIKI "error.can.not.lock"
-      )
-    endif()
-    hunter_gate_status_debug("Locking directory: ${dir}")
-    file(LOCK "${dir}" DIRECTORY GUARD FUNCTION)
-    hunter_gate_status_debug("Lock done")
-  endif()
-endmacro()
-
-function(hunter_gate_download dir)
-  string(
-      COMPARE
-      NOTEQUAL
-      "$ENV{HUNTER_DISABLE_AUTOINSTALL}"
-      ""
-      disable_autoinstall
-  )
-  if(disable_autoinstall AND NOT HUNTER_RUN_INSTALL)
-    hunter_gate_fatal_error(
-        "Hunter not found in '${dir}'"
-        "Set HUNTER_RUN_INSTALL=ON to auto-install it from '${HUNTER_GATE_URL}'"
-        "Settings:"
-        "  HUNTER_ROOT: ${HUNTER_GATE_ROOT}"
-        "  HUNTER_SHA1: ${HUNTER_GATE_SHA1}"
-        WIKI "error.run.install"
-    )
-  endif()
-  string(COMPARE EQUAL "${dir}" "" is_bad)
-  if(is_bad)
-    hunter_gate_internal_error("Empty 'dir' argument")
-  endif()
-
-  string(COMPARE EQUAL "${HUNTER_GATE_SHA1}" "" is_bad)
-  if(is_bad)
-    hunter_gate_internal_error("HUNTER_GATE_SHA1 empty")
-  endif()
-
-  string(COMPARE EQUAL "${HUNTER_GATE_URL}" "" is_bad)
-  if(is_bad)
-    hunter_gate_internal_error("HUNTER_GATE_URL empty")
-  endif()
-
-  set(done_location "${dir}/DONE")
-  set(sha1_location "${dir}/SHA1")
-
-  set(build_dir "${dir}/Build")
-  set(cmakelists "${dir}/CMakeLists.txt")
-
-  hunter_gate_lock("${dir}")
-  if(EXISTS "${done_location}")
-    # while waiting for lock other instance can do all the job
-    hunter_gate_status_debug("File '${done_location}' found, skip install")
-    return()
-  endif()
-
-  file(REMOVE_RECURSE "${build_dir}")
-  file(REMOVE_RECURSE "${cmakelists}")
-
-  file(MAKE_DIRECTORY "${build_dir}") # check directory permissions
-
-  # Disabling languages speeds up a little bit, reduces noise in the output
-  # and avoids path too long windows error
-  file(
-      WRITE
-      "${cmakelists}"
-      "cmake_minimum_required(VERSION 3.0)\n"
-      "project(HunterDownload LANGUAGES NONE)\n"
-      "include(ExternalProject)\n"
-      "ExternalProject_Add(\n"
-      "    Hunter\n"
-      "    URL\n"
-      "    \"${HUNTER_GATE_URL}\"\n"
-      "    URL_HASH\n"
-      "    SHA1=${HUNTER_GATE_SHA1}\n"
-      "    DOWNLOAD_DIR\n"
-      "    \"${dir}\"\n"
-      "    SOURCE_DIR\n"
-      "    \"${dir}/Unpacked\"\n"
-      "    CONFIGURE_COMMAND\n"
-      "    \"\"\n"
-      "    BUILD_COMMAND\n"
-      "    \"\"\n"
-      "    INSTALL_COMMAND\n"
-      "    \"\"\n"
-      ")\n"
-  )
-
-  if(HUNTER_STATUS_DEBUG)
-    set(logging_params "")
-  else()
-    set(logging_params OUTPUT_QUIET)
-  endif()
-
-  hunter_gate_status_debug("Run generate")
-
-  # Need to add toolchain file too.
-  # Otherwise on Visual Studio + MDD this will fail with error:
-  # "Could not find an appropriate version of the Windows 10 SDK installed on this machine"
-  if(EXISTS "${CMAKE_TOOLCHAIN_FILE}")
-    set(toolchain_arg "-DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}")
-  else()
-    # 'toolchain_arg' can't be empty
-    set(toolchain_arg "-DCMAKE_TOOLCHAIN_FILE=")
-  endif()
-
-  execute_process(
-      COMMAND "${CMAKE_COMMAND}" "-H${dir}" "-B${build_dir}" "-G${CMAKE_GENERATOR}" "${toolchain_arg}"
-      WORKING_DIRECTORY "${dir}"
-      RESULT_VARIABLE download_result
-      ${logging_params}
-  )
-
-  if(NOT download_result EQUAL 0)
-    hunter_gate_internal_error("Configure project failed")
-  endif()
-
-  hunter_gate_status_print(
-      "Initializing Hunter workspace (${HUNTER_GATE_SHA1})"
-      "  ${HUNTER_GATE_URL}"
-      "  -> ${dir}"
-  )
-  execute_process(
-      COMMAND "${CMAKE_COMMAND}" --build "${build_dir}"
-      WORKING_DIRECTORY "${dir}"
-      RESULT_VARIABLE download_result
-      ${logging_params}
-  )
-
-  if(NOT download_result EQUAL 0)
-    hunter_gate_internal_error("Build project failed")
-  endif()
-
-  file(REMOVE_RECURSE "${build_dir}")
-  file(REMOVE_RECURSE "${cmakelists}")
-
-  file(WRITE "${sha1_location}" "${HUNTER_GATE_SHA1}")
-  file(WRITE "${done_location}" "DONE")
-
-  hunter_gate_status_debug("Finished")
-endfunction()
-
-# Must be a macro so master file 'cmake/Hunter' can
-# apply all variables easily just by 'include' command
-# (otherwise PARENT_SCOPE magic needed)
-macro(HunterGate)
-  if(HUNTER_GATE_DONE)
-    # variable HUNTER_GATE_DONE set explicitly for external project
-    # (see `hunter_download`)
-    set_property(GLOBAL PROPERTY HUNTER_GATE_DONE YES)
-  endif()
-
-  # First HunterGate command will init Hunter, others will be ignored
-  get_property(_hunter_gate_done GLOBAL PROPERTY HUNTER_GATE_DONE SET)
-
-  if(NOT HUNTER_ENABLED)
-    # Empty function to avoid error "unknown function"
-    function(hunter_add_package)
-    endfunction()
-  elseif(_hunter_gate_done)
-    hunter_gate_status_debug("Secondary HunterGate (use old settings)")
-    hunter_gate_self(
-        "${HUNTER_CACHED_ROOT}"
-        "${HUNTER_VERSION}"
-        "${HUNTER_SHA1}"
-        _hunter_self
-    )
-    include("${_hunter_self}/cmake/Hunter")
-  else()
-    set(HUNTER_GATE_LOCATION "${CMAKE_CURRENT_LIST_DIR}")
-
-    string(COMPARE NOTEQUAL "${PROJECT_NAME}" "" _have_project_name)
-    if(_have_project_name)
-      hunter_gate_fatal_error(
-          "Please set HunterGate *before* 'project' command. "
-          "Detected project: ${PROJECT_NAME}"
-          WIKI "error.huntergate.before.project"
-      )
-    endif()
-
-    cmake_parse_arguments(
-        HUNTER_GATE "LOCAL" "URL;SHA1;GLOBAL;FILEPATH" "" ${ARGV}
-    )
-
-    string(COMPARE EQUAL "${HUNTER_GATE_SHA1}" "" _empty_sha1)
-    string(COMPARE EQUAL "${HUNTER_GATE_URL}" "" _empty_url)
-    string(
-        COMPARE
-        NOTEQUAL
-        "${HUNTER_GATE_UNPARSED_ARGUMENTS}"
-        ""
-        _have_unparsed
-    )
-    string(COMPARE NOTEQUAL "${HUNTER_GATE_GLOBAL}" "" _have_global)
-    string(COMPARE NOTEQUAL "${HUNTER_GATE_FILEPATH}" "" _have_filepath)
-
-    if(_have_unparsed)
-      hunter_gate_user_error(
-          "HunterGate unparsed arguments: ${HUNTER_GATE_UNPARSED_ARGUMENTS}"
-      )
-    endif()
-    if(_empty_sha1)
-      hunter_gate_user_error("SHA1 suboption of HunterGate is mandatory")
-    endif()
-    if(_empty_url)
-      hunter_gate_user_error("URL suboption of HunterGate is mandatory")
-    endif()
-    if(_have_global)
-      if(HUNTER_GATE_LOCAL)
-        hunter_gate_user_error("Unexpected LOCAL (already has GLOBAL)")
-      endif()
-      if(_have_filepath)
-        hunter_gate_user_error("Unexpected FILEPATH (already has GLOBAL)")
-      endif()
-    endif()
-    if(HUNTER_GATE_LOCAL)
-      if(_have_global)
-        hunter_gate_user_error("Unexpected GLOBAL (already has LOCAL)")
-      endif()
-      if(_have_filepath)
-        hunter_gate_user_error("Unexpected FILEPATH (already has LOCAL)")
-      endif()
-    endif()
-    if(_have_filepath)
-      if(_have_global)
-        hunter_gate_user_error("Unexpected GLOBAL (already has FILEPATH)")
-      endif()
-      if(HUNTER_GATE_LOCAL)
-        hunter_gate_user_error("Unexpected LOCAL (already has FILEPATH)")
-      endif()
-    endif()
-
-    hunter_gate_detect_root() # set HUNTER_GATE_ROOT
-
-    # Beautify path, fix probable problems with windows path slashes
-    get_filename_component(
-        HUNTER_GATE_ROOT "${HUNTER_GATE_ROOT}" ABSOLUTE
-    )
-    hunter_gate_status_debug("HUNTER_ROOT: ${HUNTER_GATE_ROOT}")
-    if(NOT HUNTER_ALLOW_SPACES_IN_PATH)
-      string(FIND "${HUNTER_GATE_ROOT}" " " _contain_spaces)
-      if(NOT _contain_spaces EQUAL -1)
-        hunter_gate_fatal_error(
-            "HUNTER_ROOT (${HUNTER_GATE_ROOT}) contains spaces."
-            "Set HUNTER_ALLOW_SPACES_IN_PATH=ON to skip this error"
-            "(Use at your own risk!)"
-            WIKI "error.spaces.in.hunter.root"
-        )
-      endif()
-    endif()
-
-    string(
-        REGEX
-        MATCH
-        "[0-9]+\\.[0-9]+\\.[0-9]+[-_a-z0-9]*"
-        HUNTER_GATE_VERSION
-        "${HUNTER_GATE_URL}"
-    )
-    string(COMPARE EQUAL "${HUNTER_GATE_VERSION}" "" _is_empty)
-    if(_is_empty)
-      set(HUNTER_GATE_VERSION "unknown")
-    endif()
-
-    hunter_gate_self(
-        "${HUNTER_GATE_ROOT}"
-        "${HUNTER_GATE_VERSION}"
-        "${HUNTER_GATE_SHA1}"
-        _hunter_self
-    )
-
-    set(_master_location "${_hunter_self}/cmake/Hunter")
-    if(EXISTS "${HUNTER_GATE_ROOT}/cmake/Hunter")
-      # Hunter downloaded manually (e.g. by 'git clone')
-      set(_unused "xxxxxxxxxx")
-      set(HUNTER_GATE_SHA1 "${_unused}")
-      set(HUNTER_GATE_VERSION "${_unused}")
-    else()
-      get_filename_component(_archive_id_location "${_hunter_self}/.." ABSOLUTE)
-      set(_done_location "${_archive_id_location}/DONE")
-      set(_sha1_location "${_archive_id_location}/SHA1")
-
-      # Check Hunter already downloaded by HunterGate
-      if(NOT EXISTS "${_done_location}")
-        hunter_gate_download("${_archive_id_location}")
-      endif()
-
-      if(NOT EXISTS "${_done_location}")
-        hunter_gate_internal_error("hunter_gate_download failed")
-      endif()
-
-      if(NOT EXISTS "${_sha1_location}")
-        hunter_gate_internal_error("${_sha1_location} not found")
-      endif()
-      file(READ "${_sha1_location}" _sha1_value)
-      string(COMPARE EQUAL "${_sha1_value}" "${HUNTER_GATE_SHA1}" _is_equal)
-      if(NOT _is_equal)
-        hunter_gate_internal_error(
-            "Short SHA1 collision:"
-            "  ${_sha1_value} (from ${_sha1_location})"
-            "  ${HUNTER_GATE_SHA1} (HunterGate)"
-        )
-      endif()
-      if(NOT EXISTS "${_master_location}")
-        hunter_gate_user_error(
-            "Master file not found:"
-            "  ${_master_location}"
-            "try to update Hunter/HunterGate"
-        )
-      endif()
-    endif()
-    include("${_master_location}")
-    set_property(GLOBAL PROPERTY HUNTER_GATE_DONE YES)
-  endif()
-endmacro()
\ No newline at end of file
diff --git a/sensors/include/ADCSensor.hpp b/sensors/include/ADCSensor.hpp
deleted file mode 100644
index 59b4450..0000000
--- a/sensors/include/ADCSensor.hpp
+++ /dev/null
@@ -1,35 +0,0 @@
-#pragma once
-
-#include <Thresholds.hpp>
-#include <sdbusplus/asio/object_server.hpp>
-#include <sensor.hpp>
-
-class ADCSensor : public Sensor
-{
-  public:
-    std::string configuration;
-    ADCSensor(const std::string &path,
-              sdbusplus::asio::object_server &objectServer,
-              std::shared_ptr<sdbusplus::asio::connection> &conn,
-              boost::asio::io_service &io, const std::string &sensorName,
-              std::vector<thresholds::Threshold> &&thresholds,
-              const double scaleFactor, const std::string &sensorConfiguration);
-    ~ADCSensor();
-
-  private:
-    sdbusplus::asio::object_server &objServer;
-    boost::asio::posix::stream_descriptor inputDev;
-    boost::asio::deadline_timer waitTimer;
-    boost::asio::streambuf readBuf;
-    int errCount;
-    double maxValue;
-    double minValue;
-    double scaleFactor;
-    void setupRead(void);
-    void handleResponse(const boost::system::error_code &err);
-    void checkThresholds(void);
-    void updateValue(const double &newValue);
-
-    void setInitialProperties(
-        std::shared_ptr<sdbusplus::asio::connection> &conn);
-};
diff --git a/sensors/include/CPUSensor.hpp b/sensors/include/CPUSensor.hpp
deleted file mode 100644
index 41cc02f..0000000
--- a/sensors/include/CPUSensor.hpp
+++ /dev/null
@@ -1,38 +0,0 @@
-#pragma once
-
-#include <Thresholds.hpp>
-#include <sdbusplus/asio/object_server.hpp>
-#include <sensor.hpp>
-
-class CPUSensor : public Sensor
-{
-  public:
-    std::string configuration;
-    CPUSensor(const std::string &path, const std::string &objectType,
-              sdbusplus::asio::object_server &objectServer,
-              std::shared_ptr<sdbusplus::asio::connection> &conn,
-              boost::asio::io_service &io, const std::string &fanName,
-              std::vector<thresholds::Threshold> &&thresholds,
-              const std::string &configuration);
-    ~CPUSensor();
-    static constexpr unsigned int sensorScaleFactor = 1000;
-    static constexpr unsigned int sensorPollMs = 1000;
-
-  private:
-    std::string objectType;
-    sdbusplus::asio::object_server &objServer;
-    std::shared_ptr<sdbusplus::asio::connection> dbusConnection;
-    boost::asio::posix::stream_descriptor inputDev;
-    boost::asio::deadline_timer waitTimer;
-    boost::asio::streambuf readBuf;
-    int errCount;
-    double maxValue;
-    double minValue;
-    void setupRead(void);
-    void handleResponse(const boost::system::error_code &err);
-    void checkThresholds(void);
-    void updateValue(const double &newValue);
-
-    void setInitialProperties(
-        std::shared_ptr<sdbusplus::asio::connection> &conn);
-};
diff --git a/sensors/include/HwmonTempSensor.hpp b/sensors/include/HwmonTempSensor.hpp
deleted file mode 100644
index 117f286..0000000
--- a/sensors/include/HwmonTempSensor.hpp
+++ /dev/null
@@ -1,35 +0,0 @@
-#pragma once
-
-#include <Thresholds.hpp>
-#include <sdbusplus/asio/object_server.hpp>
-#include <sensor.hpp>
-
-class HwmonTempSensor : public Sensor
-{
-  public:
-    std::string configuration;
-    HwmonTempSensor(const std::string &path, const std::string &objectType,
-                    sdbusplus::asio::object_server &objectServer,
-                    std::shared_ptr<sdbusplus::asio::connection> &conn,
-                    boost::asio::io_service &io, const std::string &fanName,
-                    std::vector<thresholds::Threshold> &&thresholds,
-                    const std::string &sensorConfiguration);
-    ~HwmonTempSensor();
-
-  private:
-    std::string objectType;
-    sdbusplus::asio::object_server &objServer;
-    boost::asio::posix::stream_descriptor inputDev;
-    boost::asio::deadline_timer waitTimer;
-    boost::asio::streambuf readBuf;
-    int errCount;
-    double maxValue;
-    double minValue;
-    void setupRead(void);
-    void handleResponse(const boost::system::error_code &err);
-    void checkThresholds(void);
-    void updateValue(const double &newValue);
-
-    void setInitialProperties(
-        std::shared_ptr<sdbusplus::asio::connection> &conn);
-};
\ No newline at end of file
diff --git a/sensors/include/PwmSensor.hpp b/sensors/include/PwmSensor.hpp
deleted file mode 100644
index 0a712fb..0000000
--- a/sensors/include/PwmSensor.hpp
+++ /dev/null
@@ -1,20 +0,0 @@
-#pragma once
-
-#include <sdbusplus/asio/object_server.hpp>
-
-class PwmSensor
-{
-  public:
-    PwmSensor(const std::string& sysPath,
-              sdbusplus::asio::object_server& objectServer);
-    ~PwmSensor();
-
-  private:
-    std::string sysPath;
-    sdbusplus::asio::object_server& objectServer;
-    std::string name;
-    std::shared_ptr<sdbusplus::asio::dbus_interface> sensorInterface;
-    std::shared_ptr<sdbusplus::asio::dbus_interface> controlInterface;
-    void setValue(uint32_t value);
-    uint32_t getValue(bool errThrow = true);
-};
diff --git a/sensors/include/TachSensor.hpp b/sensors/include/TachSensor.hpp
deleted file mode 100644
index 36e3eaa..0000000
--- a/sensors/include/TachSensor.hpp
+++ /dev/null
@@ -1,77 +0,0 @@
-#pragma once
-
-#include <Thresholds.hpp>
-#include <boost/container/flat_map.hpp>
-#include <boost/container/flat_set.hpp>
-#include <sdbusplus/asio/object_server.hpp>
-#include <sensor.hpp>
-
-constexpr const char *gpioPath = "/sys/class/gpio/";
-class PresenceSensor
-{
-
-  public:
-    PresenceSensor(const size_t index, bool inverted,
-                   boost::asio::io_service &io);
-    ~PresenceSensor();
-
-    void monitorPresence(void);
-    void read(void);
-    bool getValue(void);
-
-  private:
-    bool status = true;
-    bool inverted;
-    boost::asio::ip::tcp::socket inputDev;
-    int fd;
-};
-
-class RedundancySensor
-{
-  public:
-    RedundancySensor(size_t count, const std::vector<std::string> &children,
-                     sdbusplus::asio::object_server &objectServer);
-    ~RedundancySensor();
-
-    void update(const std::string &name, bool failed);
-
-  private:
-    size_t count;
-    std::shared_ptr<sdbusplus::asio::dbus_interface> iface;
-    sdbusplus::asio::object_server &objectServer;
-    boost::container::flat_map<std::string, bool> statuses;
-};
-
-class TachSensor : public Sensor
-{
-  public:
-    std::string configuration;
-    TachSensor(const std::string &path,
-               sdbusplus::asio::object_server &objectServer,
-               std::shared_ptr<sdbusplus::asio::connection> &conn,
-               std::unique_ptr<PresenceSensor> &&presence,
-               std::unique_ptr<RedundancySensor> &redundancy,
-               boost::asio::io_service &io, const std::string &fanName,
-               std::vector<thresholds::Threshold> &&thresholds,
-               const std::string &sensorConfiguration);
-    ~TachSensor();
-
-  private:
-    sdbusplus::asio::object_server &objServer;
-    std::unique_ptr<RedundancySensor> &redundancy;
-    std::shared_ptr<sdbusplus::asio::connection> dbusConnection;
-    std::unique_ptr<PresenceSensor> presence;
-    boost::asio::posix::stream_descriptor inputDev;
-    boost::asio::deadline_timer waitTimer;
-    boost::asio::streambuf readBuf;
-    int errCount;
-    double maxValue;
-    double minValue;
-    void setupRead(void);
-    void handleResponse(const boost::system::error_code &err);
-    void checkThresholds(void);
-    void updateValue(const double &newValue);
-
-    void setInitialProperties(
-        std::shared_ptr<sdbusplus::asio::connection> &conn);
-};
diff --git a/sensors/include/Thresholds.hpp b/sensors/include/Thresholds.hpp
deleted file mode 100644
index 3f9aa79..0000000
--- a/sensors/include/Thresholds.hpp
+++ /dev/null
@@ -1,55 +0,0 @@
-#pragma once
-#include <Utils.hpp>
-#include <nlohmann/json.hpp>
-
-struct Sensor;
-namespace thresholds
-{
-enum Level
-{
-    WARNING,
-    CRITICAL
-};
-enum Direction
-{
-    HIGH,
-    LOW
-};
-struct Threshold
-{
-    Threshold(const Level &lev, const Direction &dir, const double &val,
-              bool write = true) :
-        level(lev),
-        direction(dir), value(val), writeable(write)
-    {
-    }
-    Level level;
-    Direction direction;
-    double value;
-    bool writeable;
-    bool asserted = false;
-};
-
-bool parseThresholdsFromConfig(
-    const SensorData &sensorData,
-    std::vector<thresholds::Threshold> &thresholdVector,
-    const std::string *matchLabel = nullptr);
-
-bool parseThresholdsFromAttr(std::vector<thresholds::Threshold> &thresholds,
-                             const std::string &inputPath,
-                             const double &scaleFactor);
-bool hasCriticalInterface(
-    const std::vector<thresholds::Threshold> &thresholdVector);
-
-bool hasWarningInterface(
-    const std::vector<thresholds::Threshold> &thresholdVector);
-
-void persistThreshold(const std::string &baseInterface, const std::string &path,
-                      const thresholds::Threshold &threshold,
-                      std::shared_ptr<sdbusplus::asio::connection> &conn);
-
-// returns false if a critical threshold has been crossed, true otherwise
-bool checkThresholds(Sensor *sensor);
-void assertThresholds(Sensor *sensor, thresholds::Level level,
-                      thresholds::Direction direction, bool assert);
-} // namespace thresholds
diff --git a/sensors/include/Utils.hpp b/sensors/include/Utils.hpp
deleted file mode 100644
index 8d9eac5..0000000
--- a/sensors/include/Utils.hpp
+++ /dev/null
@@ -1,34 +0,0 @@
-#pragma once
-#include <boost/container/flat_map.hpp>
-#include <experimental/filesystem>
-#include <iostream>
-#include <regex>
-#include <sdbusplus/asio/connection.hpp>
-#include <sdbusplus/message/types.hpp>
-
-const constexpr char* jsonStore = "/var/configuration/flattened.json";
-const constexpr char* inventoryPath = "/xyz/openbmc_project/inventory";
-const constexpr char* entityManagerName = "xyz.openbmc_project.EntityManager";
-const std::regex illegalDbusRegex("[^A-Za-z0-9_]");
-
-using BasicVariantType =
-    sdbusplus::message::variant<std::string, int64_t, uint64_t, double, int32_t,
-                                uint32_t, int16_t, uint16_t, uint8_t, bool>;
-
-using ManagedObjectType = boost::container::flat_map<
-    sdbusplus::message::object_path,
-    boost::container::flat_map<
-        std::string,
-        boost::container::flat_map<std::string, BasicVariantType>>>;
-using SensorData = boost::container::flat_map<
-    std::string, boost::container::flat_map<std::string, BasicVariantType>>;
-
-bool findFiles(const std::experimental::filesystem::path dirPath,
-               const std::string& matchString,
-               std::vector<std::experimental::filesystem::path>& foundPaths,
-               unsigned int symlinkDepth = 1);
-bool isPowerOn(const std::shared_ptr<sdbusplus::asio::connection>& conn);
-bool getSensorConfiguration(
-    const std::string& type,
-    const std::shared_ptr<sdbusplus::asio::connection>& dbusConnection,
-    ManagedObjectType& resp, bool useCache = false);
\ No newline at end of file
diff --git a/sensors/include/VariantVisitors.hpp b/sensors/include/VariantVisitors.hpp
deleted file mode 100644
index 8d4b004..0000000
--- a/sensors/include/VariantVisitors.hpp
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
-// Copyright (c) 2018 Intel Corporation
-//
-// 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.
-*/
-
-#pragma once
-#include <boost/variant.hpp>
-#include <string>
-
-struct VariantToFloatVisitor : public boost::static_visitor<float>
-{
-    template <typename T> float operator()(const T &t) const
-    {
-        return static_cast<float>(t);
-    }
-};
-template <>
-inline float VariantToFloatVisitor::
-    operator()<std::string>(const std::string &s) const
-{
-    throw std::invalid_argument("Cannot translate string to float");
-}
-
-struct VariantToIntVisitor : public boost::static_visitor<int>
-{
-    template <typename T> int operator()(const T &t) const
-    {
-        return static_cast<int>(t);
-    }
-};
-template <>
-inline int VariantToIntVisitor::
-    operator()<std::string>(const std::string &s) const
-{
-    throw std::invalid_argument("Cannot translate string to int");
-}
-
-struct VariantToUnsignedIntVisitor : public boost::static_visitor<unsigned int>
-{
-    template <typename T> unsigned int operator()(const T &t) const
-    {
-        return static_cast<int>(t);
-    }
-};
-template <>
-inline unsigned int VariantToUnsignedIntVisitor::
-    operator()<std::string>(const std::string &s) const
-{
-    throw std::invalid_argument("Cannot translate string to unsigned int");
-}
-
-struct VariantToStringVisitor : public boost::static_visitor<std::string>
-{
-    template <typename T> std::string operator()(const T &t) const
-    {
-        return std::to_string(t);
-    }
-};
-template <>
-inline std::string VariantToStringVisitor::
-    operator()<std::string>(const std::string &s) const
-{
-    return s;
-}
\ No newline at end of file
diff --git a/sensors/include/non-yocto/linux/peci-ioctl.h b/sensors/include/non-yocto/linux/peci-ioctl.h
deleted file mode 100644
index 9cddb8b..0000000
--- a/sensors/include/non-yocto/linux/peci-ioctl.h
+++ /dev/null
@@ -1,247 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/* Copyright (c) 2018 Intel Corporation */
-
-#ifndef __PECI_IOCTL_H
-#define __PECI_IOCTL_H
-
-#include <linux/ioctl.h>
-#include <linux/types.h>
-
-/* Base Address of 48d */
-#define PECI_BASE_ADDR  0x30  /* The PECI client's default address of 0x30 */
-#define PECI_OFFSET_MAX 8     /* Max numver of CPU clients */
-
-/* PCI Access */
-#define MAX_PCI_READ_LEN 24   /* Number of bytes of the PCI Space read */
-
-#define PCI_BUS0_CPU0      0x00
-#define PCI_BUS0_CPU1      0x80
-#define PCI_CPUBUSNO_BUS   0x00
-#define PCI_CPUBUSNO_DEV   0x08
-#define PCI_CPUBUSNO_FUNC  0x02
-#define PCI_CPUBUSNO       0xcc
-#define PCI_CPUBUSNO_1     0xd0
-#define PCI_CPUBUSNO_VALID 0xd4
-
-/* Package Identifier Read Parameter Value */
-#define PKG_ID_CPU_ID               0x0000  /* CPUID Info */
-#define PKG_ID_PLATFORM_ID          0x0001  /* Platform ID */
-#define PKG_ID_UNCORE_ID            0x0002  /* Uncore Device ID */
-#define PKG_ID_MAX_THREAD_ID        0x0003  /* Max Thread ID */
-#define PKG_ID_MICROCODE_REV        0x0004  /* CPU Microcode Update Revision */
-#define PKG_ID_MACHINE_CHECK_STATUS 0x0005  /* Machine Check Status */
-
-/* Crashdump Parameters */
-enum crashdump_agent {
-	CRASHDUMP_CORE = 0x00,
-	CRASHDUMP_TOR = 0x01,
-};
-enum crashdump_discovery_sub_opcode {
-	CRASHDUMP_ENABLED = 0x00,
-	CRASHDUMP_NUM_AGENTS = 0x01,
-	CRASHDUMP_AGENT_DATA = 0x02,
-};
-enum crashdump_agent_data_param {
-	CRASHDUMP_AGENT_ID = 0x00,
-	CRASHDUMP_AGENT_PARAM = 0x01,
-};
-enum crashdump_agent_param {
-	CRASHDUMP_PAYLOAD_SIZE = 0x00,
-};
-
-/* RdPkgConfig Index */
-#define MBX_INDEX_CPU_ID            0   /* Package Identifier Read */
-#define MBX_INDEX_VR_DEBUG          1   /* VR Debug */
-#define MBX_INDEX_PKG_TEMP_READ     2   /* Package Temperature Read */
-#define MBX_INDEX_ENERGY_COUNTER    3   /* Energy counter */
-#define MBX_INDEX_ENERGY_STATUS     4   /* DDR Energy Status */
-#define MBX_INDEX_WAKE_MODE_BIT     5   /* "Wake on PECI" Mode bit */
-#define MBX_INDEX_EPI               6   /* Efficient Performance Indication */
-#define MBX_INDEX_PKG_RAPL_PERF     8   /* Pkg RAPL Performance Status Read */
-#define MBX_INDEX_PER_CORE_DTS_TEMP 9   /* Per Core DTS Temperature Read */
-#define MBX_INDEX_DTS_MARGIN        10  /* DTS thermal margin */
-#define MBX_INDEX_SKT_PWR_THRTL_DUR 11  /* Socket Power Throttled Duration */
-#define MBX_INDEX_CFG_TDP_CONTROL   12  /* TDP Config Control */
-#define MBX_INDEX_CFG_TDP_LEVELS    13  /* TDP Config Levels */
-#define MBX_INDEX_DDR_DIMM_TEMP     14  /* DDR DIMM Temperature */
-#define MBX_INDEX_CFG_ICCMAX        15  /* Configurable ICCMAX */
-#define MBX_INDEX_TEMP_TARGET       16  /* Temperature Target Read */
-#define MBX_INDEX_CURR_CFG_LIMIT    17  /* Current Config Limit */
-#define MBX_INDEX_DIMM_TEMP_READ    20  /* Package Thermal Status Read */
-#define MBX_INDEX_DRAM_IMC_TMP_READ 22  /* DRAM IMC Temperature Read */
-#define MBX_INDEX_DDR_CH_THERM_STAT 23  /* DDR Channel Thermal Status */
-#define MBX_INDEX_PKG_POWER_LIMIT1  26  /* Package Power Limit1 */
-#define MBX_INDEX_PKG_POWER_LIMIT2  27  /* Package Power Limit2 */
-#define MBX_INDEX_TDP               28  /* Thermal design power minimum */
-#define MBX_INDEX_TDP_HIGH          29  /* Thermal design power maximum */
-#define MBX_INDEX_TDP_UNITS         30  /* Units for power/energy registers */
-#define MBX_INDEX_RUN_TIME          31  /* Accumulated Run Time */
-#define MBX_INDEX_CONSTRAINED_TIME  32  /* Thermally Constrained Time Read */
-#define MBX_INDEX_TURBO_RATIO       33  /* Turbo Activation Ratio */
-#define MBX_INDEX_DDR_RAPL_PL1      34  /* DDR RAPL PL1 */
-#define MBX_INDEX_DDR_PWR_INFO_HIGH 35  /* DRAM Power Info Read (high) */
-#define MBX_INDEX_DDR_PWR_INFO_LOW  36  /* DRAM Power Info Read (low) */
-#define MBX_INDEX_DDR_RAPL_PL2      37  /* DDR RAPL PL2 */
-#define MBX_INDEX_DDR_RAPL_STATUS   38  /* DDR RAPL Performance Status */
-#define MBX_INDEX_DDR_HOT_ABSOLUTE  43  /* DDR Hottest Dimm Absolute Temp */
-#define MBX_INDEX_DDR_HOT_RELATIVE  44  /* DDR Hottest Dimm Relative Temp */
-#define MBX_INDEX_DDR_THROTTLE_TIME 45  /* DDR Throttle Time */
-#define MBX_INDEX_DDR_THERM_STATUS  46  /* DDR Thermal Status */
-#define MBX_INDEX_TIME_AVG_TEMP     47  /* Package time-averaged temperature */
-#define MBX_INDEX_TURBO_RATIO_LIMIT 49  /* Turbo Ratio Limit Read */
-#define MBX_INDEX_HWP_AUTO_OOB      53  /* HWP Autonomous Out-of-band */
-#define MBX_INDEX_DDR_WARM_BUDGET   55  /* DDR Warm Power Budget */
-#define MBX_INDEX_DDR_HOT_BUDGET    56  /* DDR Hot Power Budget */
-#define MBX_INDEX_PKG_PSYS_PWR_LIM3 57  /* Package/Psys Power Limit3 */
-#define MBX_INDEX_PKG_PSYS_PWR_LIM1 58  /* Package/Psys Power Limit1 */
-#define MBX_INDEX_PKG_PSYS_PWR_LIM2 59  /* Package/Psys Power Limit2 */
-#define MBX_INDEX_PKG_PSYS_PWR_LIM4 60  /* Package/Psys Power Limit4 */
-#define MBX_INDEX_PERF_LIMIT_REASON 65  /* Performance Limit Reasons */
-
-/* WrPkgConfig Index */
-#define MBX_INDEX_DIMM_AMBIENT 19
-#define MBX_INDEX_DIMM_TEMP    24
-
-enum peci_cmd {
-	PECI_CMD_XFER = 0,
-	PECI_CMD_PING,
-	PECI_CMD_GET_DIB,
-	PECI_CMD_GET_TEMP,
-	PECI_CMD_RD_PKG_CFG,
-	PECI_CMD_WR_PKG_CFG,
-	PECI_CMD_RD_IA_MSR,
-	PECI_CMD_WR_IA_MSR,
-	PECI_CMD_RD_PCI_CFG,
-	PECI_CMD_WR_PCI_CFG,
-	PECI_CMD_RD_PCI_CFG_LOCAL,
-	PECI_CMD_WR_PCI_CFG_LOCAL,
-	PECI_CMD_CRASHDUMP_DISC,
-	PECI_CMD_CRASHDUMP_GET_FRAME,
-	PECI_CMD_MAX
-};
-
-struct peci_ping_msg {
-	__u8 addr;
-} __attribute__((__packed__));
-
-struct peci_get_dib_msg {
-	__u8  addr;
-	__u32 dib;
-} __attribute__((__packed__));
-
-struct peci_get_temp_msg {
-	__u8  addr;
-	__s16 temp_raw;
-} __attribute__((__packed__));
-
-struct peci_rd_pkg_cfg_msg {
-	__u8  addr;
-	__u8  index;
-	__u16 param;
-	__u8  rx_len;
-	__u8  pkg_config[4];
-} __attribute__((__packed__));
-
-struct peci_wr_pkg_cfg_msg {
-	__u8  addr;
-	__u8  index;
-	__u16 param;
-	__u8  tx_len;
-	__u32 value;
-} __attribute__((__packed__));
-
-struct peci_rd_ia_msr_msg {
-	__u8  addr;
-	__u8  thread_id;
-	__u16 address;
-	__u64 value;
-} __attribute__((__packed__));
-
-struct peci_rd_pci_cfg_msg {
-	__u8  addr;
-	__u8  bus;
-	__u8  device;
-	__u8  function;
-	__u16 reg;
-	__u8  pci_config[4];
-} __attribute__((__packed__));
-
-struct peci_rd_pci_cfg_local_msg {
-	__u8  addr;
-	__u8  bus;
-	__u8  device;
-	__u8  function;
-	__u16 reg;
-	__u8  rx_len;
-	__u8  pci_config[4];
-} __attribute__((__packed__));
-
-struct peci_wr_pci_cfg_local_msg {
-	__u8  addr;
-	__u8  bus;
-	__u8  device;
-	__u8  function;
-	__u16 reg;
-	__u8  tx_len;
-	__u32 value;
-} __attribute__((__packed__));
-
-struct peci_crashdump_disc_msg {
-	__u8  addr;
-	__u8  subopcode;
-	__u8  param0;
-	__u16 param1;
-	__u8  param2;
-	__u8  rx_len;
-	__u8  data[8];
-} __attribute__((__packed__));
-
-struct peci_crashdump_get_frame_msg {
-	__u8  addr;
-	__u16 param0;
-	__u16 param1;
-	__u16 param2;
-	__u8  rx_len;
-	__u8  data[16];
-} __attribute__((__packed__));
-
-#define PECI_IOC_BASE  0xb6
-
-#define PECI_IOC_PING \
-	_IOWR(PECI_IOC_BASE, PECI_CMD_PING, struct peci_ping_msg)
-
-#define PECI_IOC_GET_DIB \
-	_IOWR(PECI_IOC_BASE, PECI_CMD_GET_DIB, struct peci_get_dib_msg)
-
-#define PECI_IOC_GET_TEMP \
-	_IOWR(PECI_IOC_BASE, PECI_CMD_GET_TEMP, struct peci_get_temp_msg)
-
-#define PECI_IOC_RD_PKG_CFG \
-	_IOWR(PECI_IOC_BASE, PECI_CMD_RD_PKG_CFG, struct peci_rd_pkg_cfg_msg)
-
-#define PECI_IOC_WR_PKG_CFG \
-	_IOWR(PECI_IOC_BASE, PECI_CMD_WR_PKG_CFG, struct peci_wr_pkg_cfg_msg)
-
-#define PECI_IOC_RD_IA_MSR \
-	_IOWR(PECI_IOC_BASE, PECI_CMD_RD_IA_MSR, struct peci_rd_ia_msr_msg)
-
-#define PECI_IOC_RD_PCI_CFG \
-	_IOWR(PECI_IOC_BASE, PECI_CMD_RD_PCI_CFG, struct peci_rd_pci_cfg_msg)
-
-#define PECI_IOC_RD_PCI_CFG_LOCAL \
-	_IOWR(PECI_IOC_BASE, PECI_CMD_RD_PCI_CFG_LOCAL, \
-	      struct peci_rd_pci_cfg_local_msg)
-
-#define PECI_IOC_WR_PCI_CFG_LOCAL \
-	_IOWR(PECI_IOC_BASE, PECI_CMD_WR_PCI_CFG_LOCAL, \
-	      struct peci_wr_pci_cfg_local_msg)
-
-#define PECI_IOC_CRASHDUMP_DISC \
-	_IOWR(PECI_IOC_BASE, PECI_CMD_CRASHDUMP_DISC, \
-	      struct peci_crashdump_disc_msg)
-
-#define PECI_IOC_CRASHDUMP_GET_FRAME \
-	_IOWR(PECI_IOC_BASE, PECI_CMD_CRASHDUMP_GET_FRAME, \
-	      struct peci_crashdump_get_frame_msg)
-
-#endif /* __PECI_IOCTL_H */
diff --git a/sensors/include/sensor.hpp b/sensors/include/sensor.hpp
deleted file mode 100644
index 62eec62..0000000
--- a/sensors/include/sensor.hpp
+++ /dev/null
@@ -1,36 +0,0 @@
-#pragma once
-
-#include <Thresholds.hpp>
-#include <sdbusplus/asio/object_server.hpp>
-
-constexpr size_t sensorFailedPollTimeMs = 5000;
-struct Sensor
-{
-    Sensor(const std::string& name, const std::string& path,
-           std::vector<thresholds::Threshold>&& thresholdData) :
-        name(name),
-        path(path), thresholds(std::move(thresholdData))
-    {
-    }
-    virtual ~Sensor() = default;
-    std::string name;
-    std::string path;
-    std::vector<thresholds::Threshold> thresholds;
-    std::shared_ptr<sdbusplus::asio::dbus_interface> sensorInterface;
-    std::shared_ptr<sdbusplus::asio::dbus_interface> thresholdInterfaceWarning;
-    std::shared_ptr<sdbusplus::asio::dbus_interface> thresholdInterfaceCritical;
-    double value = std::numeric_limits<double>::quiet_NaN();
-    double overriddenValue = std::numeric_limits<double>::quiet_NaN();
-    bool internalSet = false;
-    int setSensorValue(const double& newValue, double& oldValue)
-    {
-        if (internalSet)
-        {
-            internalSet = false;
-            oldValue = newValue;
-            return 1;
-        }
-        overriddenValue = newValue;
-        return 1;
-    }
-};
\ No newline at end of file
diff --git a/sensors/src/ADCSensor.cpp b/sensors/src/ADCSensor.cpp
deleted file mode 100644
index 4ce6dda..0000000
--- a/sensors/src/ADCSensor.cpp
+++ /dev/null
@@ -1,249 +0,0 @@
-/*
-// Copyright (c) 2017 Intel Corporation
-//
-// 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.
-*/
-
-#include <unistd.h>
-
-#include <ADCSensor.hpp>
-#include <boost/algorithm/string/predicate.hpp>
-#include <boost/algorithm/string/replace.hpp>
-#include <boost/date_time/posix_time/posix_time.hpp>
-#include <iostream>
-#include <limits>
-#include <sdbusplus/asio/connection.hpp>
-#include <sdbusplus/asio/object_server.hpp>
-#include <string>
-
-static constexpr unsigned int sensorPollMs = 500;
-static constexpr size_t warnAfterErrorCount = 10;
-
-// scaling factor from hwmon
-static constexpr unsigned int sensorScaleFactor = 1000;
-
-ADCSensor::ADCSensor(const std::string &path,
-                     sdbusplus::asio::object_server &objectServer,
-                     std::shared_ptr<sdbusplus::asio::connection> &conn,
-                     boost::asio::io_service &io, const std::string &sensorName,
-                     std::vector<thresholds::Threshold> &&_thresholds,
-                     const double scaleFactor,
-                     const std::string &sensorConfiguration) :
-    Sensor(boost::replace_all_copy(sensorName, " ", "_"), path,
-           std::move(_thresholds)),
-    objServer(objectServer), configuration(sensorConfiguration),
-    scaleFactor(scaleFactor), inputDev(io, open(path.c_str(), O_RDONLY)),
-    waitTimer(io), errCount(0),
-    // todo, get these from config
-    maxValue(20), minValue(0)
-{
-    sensorInterface = objectServer.add_interface(
-        "/xyz/openbmc_project/sensors/voltage/" + name,
-        "xyz.openbmc_project.Sensor.Value");
-    if (thresholds::hasWarningInterface(thresholds))
-    {
-        thresholdInterfaceWarning = objectServer.add_interface(
-            "/xyz/openbmc_project/sensors/voltage/" + name,
-            "xyz.openbmc_project.Sensor.Threshold.Warning");
-    }
-    if (thresholds::hasCriticalInterface(thresholds))
-    {
-        thresholdInterfaceCritical = objectServer.add_interface(
-            "/xyz/openbmc_project/sensors/voltage/" + name,
-            "xyz.openbmc_project.Sensor.Threshold.Critical");
-    }
-    setInitialProperties(conn);
-    setupRead();
-}
-
-ADCSensor::~ADCSensor()
-{
-    // close the input dev to cancel async operations
-    inputDev.close();
-    waitTimer.cancel();
-    objServer.remove_interface(thresholdInterfaceWarning);
-    objServer.remove_interface(thresholdInterfaceCritical);
-    objServer.remove_interface(sensorInterface);
-}
-
-void ADCSensor::setupRead(void)
-{
-    boost::asio::async_read_until(
-        inputDev, readBuf, '\n',
-        [&](const boost::system::error_code &ec,
-            std::size_t /*bytes_transfered*/) { handleResponse(ec); });
-}
-
-void ADCSensor::handleResponse(const boost::system::error_code &err)
-{
-    if (err == boost::system::errc::bad_file_descriptor)
-    {
-        return; // we're being destroyed
-    }
-    std::istream responseStream(&readBuf);
-
-    if (!err)
-    {
-        std::string response;
-        std::getline(responseStream, response);
-
-        // todo read scaling factors from configuration
-        try
-        {
-            float nvalue = std::stof(response);
-            nvalue = (nvalue / sensorScaleFactor) / scaleFactor;
-            if (!isnan(overriddenValue))
-            {
-                nvalue = overriddenValue;
-            }
-            if (nvalue != value)
-            {
-                updateValue(nvalue);
-            }
-            errCount = 0;
-        }
-        catch (std::invalid_argument)
-        {
-            errCount++;
-        }
-    }
-    else
-    {
-
-        errCount++;
-    }
-    // only print once
-    if (errCount == warnAfterErrorCount)
-    {
-        std::cerr << "Failure to read sensor " << name << " at " << path
-                  << " ec:" << err << "\n";
-    }
-
-    if (errCount >= warnAfterErrorCount)
-    {
-        updateValue(0);
-    }
-
-    responseStream.clear();
-    inputDev.close();
-    int fd = open(path.c_str(), O_RDONLY);
-    if (fd <= 0)
-    {
-        return; // we're no longer valid
-    }
-    inputDev.assign(fd);
-    waitTimer.expires_from_now(boost::posix_time::milliseconds(sensorPollMs));
-    waitTimer.async_wait([&](const boost::system::error_code &ec) {
-        if (ec == boost::asio::error::operation_aborted)
-        {
-            return; // we're being canceled
-        }
-        setupRead();
-    });
-}
-
-void ADCSensor::checkThresholds(void)
-{
-    thresholds::checkThresholds(this);
-}
-
-void ADCSensor::updateValue(const double &newValue)
-{
-    // Indicate that it is internal set call
-    internalSet = true;
-    bool ret = sensorInterface->set_property("Value", newValue);
-    internalSet = false;
-    value = newValue;
-    checkThresholds();
-}
-
-void ADCSensor::setInitialProperties(
-    std::shared_ptr<sdbusplus::asio::connection> &conn)
-{
-    // todo, get max and min from configuration
-    sensorInterface->register_property("MaxValue", maxValue);
-    sensorInterface->register_property("MinValue", minValue);
-    sensorInterface->register_property(
-        "Value", value, [&](const double &newValue, double &oldValue) {
-            return setSensorValue(newValue, oldValue);
-        });
-
-    for (auto &threshold : thresholds)
-    {
-        std::shared_ptr<sdbusplus::asio::dbus_interface> iface;
-        std::string level;
-        std::string alarm;
-        if (threshold.level == thresholds::Level::CRITICAL)
-        {
-            iface = thresholdInterfaceCritical;
-            if (threshold.direction == thresholds::Direction::HIGH)
-            {
-                level = "CriticalHigh";
-                alarm = "CriticalAlarmHigh";
-            }
-            else
-            {
-                level = "CriticalLow";
-                alarm = "CriticalAlarmLow";
-            }
-        }
-        else if (threshold.level == thresholds::Level::WARNING)
-        {
-            iface = thresholdInterfaceWarning;
-            if (threshold.direction == thresholds::Direction::HIGH)
-            {
-                level = "WarningHigh";
-                alarm = "WarningAlarmHigh";
-            }
-            else
-            {
-                level = "WarningLow";
-                alarm = "WarningAlarmLow";
-            }
-        }
-        else
-        {
-            std::cerr << "Unknown threshold level" << threshold.level << "\n";
-            continue;
-        }
-        if (!iface)
-        {
-            std::cout << "trying to set uninitialized interface\n";
-            continue;
-        }
-        iface->register_property(
-            level, threshold.value,
-            [&](const double &request, double &oldValue) {
-                oldValue = request; // todo, just let the config do this?
-                threshold.value = request;
-                thresholds::persistThreshold(
-                    configuration, "xyz.openbmc_project.Configuration.ADC",
-                    threshold, conn);
-                return 1;
-            });
-        iface->register_property(alarm, false);
-    }
-    if (!sensorInterface->initialize())
-    {
-        std::cerr << "error initializing value interface\n";
-    }
-    if (thresholdInterfaceWarning && !thresholdInterfaceWarning->initialize())
-    {
-        std::cerr << "error initializing warning threshold interface\n";
-    }
-
-    if (thresholdInterfaceCritical && !thresholdInterfaceCritical->initialize())
-    {
-        std::cerr << "error initializing critical threshold interface\n";
-    }
-}
diff --git a/sensors/src/ADCSensorMain.cpp b/sensors/src/ADCSensorMain.cpp
deleted file mode 100644
index 4fff81a..0000000
--- a/sensors/src/ADCSensorMain.cpp
+++ /dev/null
@@ -1,246 +0,0 @@
-/*
-// Copyright (c) 2017 Intel Corporation
-//
-// 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.
-*/
-
-#include <ADCSensor.hpp>
-#include <Utils.hpp>
-#include <VariantVisitors.hpp>
-#include <boost/algorithm/string/predicate.hpp>
-#include <boost/algorithm/string/replace.hpp>
-#include <boost/container/flat_set.hpp>
-#include <experimental/filesystem>
-#include <fstream>
-#include <regex>
-#include <sdbusplus/asio/connection.hpp>
-#include <sdbusplus/asio/object_server.hpp>
-
-static constexpr bool DEBUG = false;
-
-namespace fs = std::experimental::filesystem;
-namespace variant_ns = sdbusplus::message::variant_ns;
-static constexpr std::array<const char*, 1> sensorTypes = {
-    "xyz.openbmc_project.Configuration.ADC"};
-static std::regex inputRegex(R"(in(\d+)_input)");
-
-void createSensors(
-    boost::asio::io_service& io, sdbusplus::asio::object_server& objectServer,
-    boost::container::flat_map<std::string, std::unique_ptr<ADCSensor>>&
-        sensors,
-    std::shared_ptr<sdbusplus::asio::connection>& dbusConnection,
-    const std::unique_ptr<boost::container::flat_set<std::string>>&
-        sensorsChanged)
-{
-    bool firstScan = sensorsChanged == nullptr;
-    // use new data the first time, then refresh
-    ManagedObjectType sensorConfigurations;
-    bool useCache = false;
-    for (const char* type : sensorTypes)
-    {
-        if (!getSensorConfiguration(type, dbusConnection, sensorConfigurations,
-                                    useCache))
-        {
-            std::cerr << "error communicating to entity manager\n";
-            return;
-        }
-        useCache = true;
-    }
-    std::vector<fs::path> paths;
-    if (!findFiles(fs::path("/sys/class/hwmon"), R"(in\d+_input)", paths))
-    {
-        std::cerr << "No temperature sensors in system\n";
-        return;
-    }
-
-    // iterate through all found adc sensors, and try to match them with
-    // configuration
-    for (auto& path : paths)
-    {
-        std::smatch match;
-        std::string pathStr = path.string();
-
-        std::regex_search(pathStr, match, inputRegex);
-        std::string indexStr = *(match.begin() + 1);
-
-        auto directory = path.parent_path();
-        // convert to 0 based
-        size_t index = std::stoul(indexStr) - 1;
-        auto oemNamePath =
-            directory.string() + R"(/of_node/oemname)" + std::to_string(index);
-
-        if (DEBUG)
-        {
-            std::cout << "Checking path " << oemNamePath << "\n";
-        }
-        std::ifstream nameFile(oemNamePath);
-        if (!nameFile.good())
-        {
-            std::cerr << "Failure reading " << oemNamePath << "\n";
-            continue;
-        }
-        std::string oemName;
-        std::getline(nameFile, oemName);
-        nameFile.close();
-        if (!oemName.size())
-        {
-            // shouldn't have an empty name file
-            continue;
-        }
-        oemName.pop_back(); // remove trailing null
-
-        const SensorData* sensorData = nullptr;
-        const std::string* interfacePath = nullptr;
-        for (const std::pair<sdbusplus::message::object_path, SensorData>&
-                 sensor : sensorConfigurations)
-        {
-            if (!boost::ends_with(sensor.first.str, oemName))
-            {
-                continue;
-            }
-            sensorData = &(sensor.second);
-            interfacePath = &(sensor.first.str);
-            break;
-        }
-        if (sensorData == nullptr)
-        {
-            std::cerr << "failed to find match for " << oemName << "\n";
-            continue;
-        }
-        const std::pair<std::string, boost::container::flat_map<
-                                         std::string, BasicVariantType>>*
-            baseConfiguration = nullptr;
-        for (const char* type : sensorTypes)
-        {
-            auto sensorBase = sensorData->find(type);
-            if (sensorBase != sensorData->end())
-            {
-                baseConfiguration = &(*sensorBase);
-                break;
-            }
-        }
-
-        if (baseConfiguration == nullptr)
-        {
-            std::cerr << "error finding base configuration for" << oemName
-                      << "\n";
-            continue;
-        }
-
-        auto findSensorName = baseConfiguration->second.find("Name");
-        if (findSensorName == baseConfiguration->second.end())
-        {
-            std::cerr << "could not determine configuration name for "
-                      << oemName << "\n";
-            continue;
-        }
-        std::string sensorName =
-            sdbusplus::message::variant_ns::get<std::string>(
-                findSensorName->second);
-
-        // on rescans, only update sensors we were signaled by
-        auto findSensor = sensors.find(sensorName);
-        if (!firstScan && findSensor != sensors.end())
-        {
-            bool found = false;
-            for (auto it = sensorsChanged->begin(); it != sensorsChanged->end();
-                 it++)
-            {
-                if (boost::ends_with(*it, findSensor->second->name))
-                {
-                    sensorsChanged->erase(it);
-                    findSensor->second = nullptr;
-                    found = true;
-                    break;
-                }
-            }
-            if (!found)
-            {
-                continue;
-            }
-        }
-        std::vector<thresholds::Threshold> sensorThresholds;
-        if (!parseThresholdsFromConfig(*sensorData, sensorThresholds))
-        {
-            std::cerr << "error populating thresholds for " << sensorName
-                      << "\n";
-        }
-
-        auto findScaleFactor = baseConfiguration->second.find("ScaleFactor");
-        float scaleFactor = 1.0;
-        if (findScaleFactor != baseConfiguration->second.end())
-        {
-            scaleFactor = variant_ns::visit(VariantToFloatVisitor(),
-                                            findScaleFactor->second);
-        }
-        sensors[sensorName] = std::make_unique<ADCSensor>(
-            path.string(), objectServer, dbusConnection, io, sensorName,
-            std::move(sensorThresholds), scaleFactor, *interfacePath);
-    }
-}
-
-int main(int argc, char** argv)
-{
-    boost::asio::io_service io;
-    auto systemBus = std::make_shared<sdbusplus::asio::connection>(io);
-    systemBus->request_name("xyz.openbmc_project.ADCSensor");
-    sdbusplus::asio::object_server objectServer(systemBus);
-    boost::container::flat_map<std::string, std::unique_ptr<ADCSensor>> sensors;
-    std::vector<std::unique_ptr<sdbusplus::bus::match::match>> matches;
-    std::unique_ptr<boost::container::flat_set<std::string>> sensorsChanged =
-        std::make_unique<boost::container::flat_set<std::string>>();
-
-    io.post([&]() {
-        createSensors(io, objectServer, sensors, systemBus, nullptr);
-    });
-
-    boost::asio::deadline_timer filterTimer(io);
-    std::function<void(sdbusplus::message::message&)> eventHandler =
-        [&](sdbusplus::message::message& message) {
-            if (message.is_method_error())
-            {
-                std::cerr << "callback method error\n";
-                return;
-            }
-            sensorsChanged->insert(message.get_path());
-            // this implicitly cancels the timer
-            filterTimer.expires_from_now(boost::posix_time::seconds(1));
-
-            filterTimer.async_wait([&](const boost::system::error_code& ec) {
-                if (ec == boost::asio::error::operation_aborted)
-                {
-                    /* we were canceled*/
-                    return;
-                }
-                else if (ec)
-                {
-                    std::cerr << "timer error\n";
-                    return;
-                }
-                createSensors(io, objectServer, sensors, systemBus,
-                              sensorsChanged);
-            });
-        };
-
-    for (const char* type : sensorTypes)
-    {
-        auto match = std::make_unique<sdbusplus::bus::match::match>(
-            static_cast<sdbusplus::bus::bus&>(*systemBus),
-            "type='signal',member='PropertiesChanged',path_namespace='" +
-                std::string(inventoryPath) + "',arg0namespace='" + type + "'",
-            eventHandler);
-        matches.emplace_back(std::move(match));
-    }
-
-    io.run();
-}
diff --git a/sensors/src/CPUSensor.cpp b/sensors/src/CPUSensor.cpp
deleted file mode 100644
index 24e30c8..0000000
--- a/sensors/src/CPUSensor.cpp
+++ /dev/null
@@ -1,262 +0,0 @@
-/*
-// Copyright (c) 2018 Intel Corporation
-//
-// 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.
-*/
-
-#include <unistd.h>
-
-#include <CPUSensor.hpp>
-#include <Utils.hpp>
-#include <boost/algorithm/string/predicate.hpp>
-#include <boost/algorithm/string/replace.hpp>
-#include <boost/date_time/posix_time/posix_time.hpp>
-#include <iostream>
-#include <limits>
-#include <sdbusplus/asio/connection.hpp>
-#include <sdbusplus/asio/object_server.hpp>
-#include <string>
-
-static constexpr size_t warnAfterErrorCount = 10;
-
-CPUSensor::CPUSensor(const std::string &path, const std::string &objectType,
-                     sdbusplus::asio::object_server &objectServer,
-                     std::shared_ptr<sdbusplus::asio::connection> &conn,
-                     boost::asio::io_service &io, const std::string &sensorName,
-                     std::vector<thresholds::Threshold> &&_thresholds,
-                     const std::string &sensorConfiguration) :
-    Sensor(boost::replace_all_copy(sensorName, " ", "_"), path,
-           std::move(_thresholds)),
-    objectType(objectType), objServer(objectServer), dbusConnection(conn),
-    configuration(sensorConfiguration),
-
-    inputDev(io, open(path.c_str(), O_RDONLY)), waitTimer(io), errCount(0),
-    // todo, get these from config
-    maxValue(127), minValue(-128)
-{
-    sensorInterface = objectServer.add_interface(
-        "/xyz/openbmc_project/sensors/temperature/" + name,
-        "xyz.openbmc_project.Sensor.Value");
-    if (thresholds::hasWarningInterface(thresholds))
-    {
-        thresholdInterfaceWarning = objectServer.add_interface(
-            "/xyz/openbmc_project/sensors/temperature/" + name,
-            "xyz.openbmc_project.Sensor.Threshold.Warning");
-    }
-    if (thresholds::hasCriticalInterface(thresholds))
-    {
-        thresholdInterfaceCritical = objectServer.add_interface(
-            "/xyz/openbmc_project/sensors/temperature/" + name,
-            "xyz.openbmc_project.Sensor.Threshold.Critical");
-    }
-    setInitialProperties(conn);
-    isPowerOn(dbusConnection); // first call initializes
-    setupRead();
-}
-
-CPUSensor::~CPUSensor()
-{
-    // close the input dev to cancel async operations
-    inputDev.close();
-    waitTimer.cancel();
-    objServer.remove_interface(thresholdInterfaceWarning);
-    objServer.remove_interface(thresholdInterfaceCritical);
-    objServer.remove_interface(sensorInterface);
-}
-
-void CPUSensor::setupRead(void)
-{
-    boost::asio::async_read_until(
-        inputDev, readBuf, '\n',
-        [&](const boost::system::error_code &ec,
-            std::size_t /*bytes_transfered*/) { handleResponse(ec); });
-}
-
-void CPUSensor::handleResponse(const boost::system::error_code &err)
-{
-    if (err == boost::system::errc::bad_file_descriptor)
-    {
-        return; // we're being destroyed
-    }
-    size_t pollTime = CPUSensor::sensorPollMs;
-    std::istream responseStream(&readBuf);
-    if (!err)
-    {
-        std::string response;
-        try
-        {
-            std::getline(responseStream, response);
-            float nvalue = std::stof(response);
-            responseStream.clear();
-            nvalue /= CPUSensor::sensorScaleFactor;
-            if (!isnan(overriddenValue))
-            {
-                nvalue = overriddenValue;
-            }
-            if (nvalue != value)
-            {
-                updateValue(nvalue);
-            }
-            errCount = 0;
-        }
-        catch (const std::invalid_argument &)
-        {
-            errCount++;
-        }
-    }
-    else
-    {
-        pollTime = sensorFailedPollTimeMs;
-        errCount++;
-    }
-
-    if (errCount >= warnAfterErrorCount)
-    {
-        // only an error if power is on
-        if (isPowerOn(dbusConnection))
-        {
-            // only print once
-            if (errCount == warnAfterErrorCount)
-            {
-                std::cerr << "Failure to read sensor " << name << " at " << path
-                          << "\n";
-            }
-            updateValue(0);
-            errCount++;
-        }
-        else
-        {
-            errCount = 0; // check power again in 10 cycles
-            updateValue(std::numeric_limits<double>::quiet_NaN());
-        }
-    }
-
-    responseStream.clear();
-    inputDev.close();
-    int fd = open(path.c_str(), O_RDONLY);
-    if (fd <= 0)
-    {
-        return; // we're no longer valid
-    }
-    inputDev.assign(fd);
-    waitTimer.expires_from_now(boost::posix_time::milliseconds(pollTime));
-    waitTimer.async_wait([&](const boost::system::error_code &ec) {
-        if (ec == boost::asio::error::operation_aborted)
-        {
-            return; // we're being canceled
-        }
-        setupRead();
-    });
-}
-
-void CPUSensor::checkThresholds(void)
-{
-    thresholds::checkThresholds(this);
-}
-
-void CPUSensor::updateValue(const double &newValue)
-{
-    // Indicate that it is internal set call
-    internalSet = true;
-    sensorInterface->set_property("Value", newValue);
-    internalSet = false;
-    value = newValue;
-    checkThresholds();
-}
-
-void CPUSensor::setInitialProperties(
-    std::shared_ptr<sdbusplus::asio::connection> &conn)
-{
-    // todo, get max and min from configuration
-    sensorInterface->register_property("MaxValue", maxValue);
-    sensorInterface->register_property("MinValue", minValue);
-    sensorInterface->register_property(
-        "Value", value, [&](const double &newValue, double &oldValue) {
-            return setSensorValue(newValue, oldValue);
-        });
-
-    for (auto &threshold : thresholds)
-    {
-        std::shared_ptr<sdbusplus::asio::dbus_interface> iface;
-        std::string level;
-        std::string alarm;
-        if (threshold.level == thresholds::Level::CRITICAL)
-        {
-            iface = thresholdInterfaceCritical;
-            if (threshold.direction == thresholds::Direction::HIGH)
-            {
-                level = "CriticalHigh";
-                alarm = "CriticalAlarmHigh";
-            }
-            else
-            {
-                level = "CriticalLow";
-                alarm = "CriticalAlarmLow";
-            }
-        }
-        else if (threshold.level == thresholds::Level::WARNING)
-        {
-            iface = thresholdInterfaceWarning;
-            if (threshold.direction == thresholds::Direction::HIGH)
-            {
-                level = "WarningHigh";
-                alarm = "WarningAlarmHigh";
-            }
-            else
-            {
-                level = "WarningLow";
-                alarm = "WarningAlarmLow";
-            }
-        }
-        else
-        {
-            std::cerr << "Unknown threshold level" << threshold.level << "\n";
-            continue;
-        }
-        if (!iface)
-        {
-            std::cout << "trying to set uninitialized interface\n";
-            continue;
-        }
-        if (threshold.writeable)
-        {
-            iface->register_property(
-                level, threshold.value,
-                [&](const double &request, double &oldValue) {
-                    oldValue = request; // todo, just let the config do this?
-                    threshold.value = request;
-                    thresholds::persistThreshold(configuration, objectType,
-                                                 threshold, conn);
-                    return 1;
-                });
-        }
-        else
-        {
-            iface->register_property(level, threshold.value);
-        }
-        iface->register_property(alarm, false);
-    }
-    if (!sensorInterface->initialize())
-    {
-        std::cerr << "error initializing value interface\n";
-    }
-    if (thresholdInterfaceWarning && !thresholdInterfaceWarning->initialize())
-    {
-        std::cerr << "error initializing warning threshold interface\n";
-    }
-
-    if (thresholdInterfaceCritical && !thresholdInterfaceCritical->initialize())
-    {
-        std::cerr << "error initializing critical threshold interface\n";
-    }
-}
diff --git a/sensors/src/CPUSensorMain.cpp b/sensors/src/CPUSensorMain.cpp
deleted file mode 100644
index a356d5c..0000000
--- a/sensors/src/CPUSensorMain.cpp
+++ /dev/null
@@ -1,667 +0,0 @@
-/*
-// Copyright (c) 2018 Intel Corporation
-//
-// 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.
-*/
-
-#include <fcntl.h>
-#include <linux/peci-ioctl.h>
-
-#include <CPUSensor.hpp>
-#include <Utils.hpp>
-#include <VariantVisitors.hpp>
-#include <boost/algorithm/string/predicate.hpp>
-#include <boost/algorithm/string/replace.hpp>
-#include <boost/container/flat_set.hpp>
-#include <boost/date_time/posix_time/posix_time.hpp>
-#include <boost/process/child.hpp>
-#include <experimental/filesystem>
-#include <fstream>
-#include <regex>
-#include <sdbusplus/asio/connection.hpp>
-#include <sdbusplus/asio/object_server.hpp>
-
-static constexpr bool DEBUG = false;
-
-enum State
-{
-    OFF,  // host powered down
-    ON,   // host powered on
-    READY // host powered on and mem test passed - fully ready
-};
-
-struct CPUConfig
-{
-    CPUConfig(const uint64_t& bus, const uint64_t& addr,
-              const std::string& name, const State& state) :
-        bus(bus),
-        addr(addr), name(name), state(state)
-    {
-    }
-    int bus;
-    int addr;
-    std::string name;
-    State state;
-
-    bool operator<(const CPUConfig& rhs) const
-    {
-        return (name < rhs.name);
-    }
-};
-
-static constexpr const char* peciDev = "/dev/peci-";
-static constexpr const unsigned int rankNumMax = 8;
-
-namespace fs = std::experimental::filesystem;
-namespace variant_ns = sdbusplus::message::variant_ns;
-static constexpr const char* configPrefix =
-    "xyz.openbmc_project.Configuration.";
-static constexpr std::array<const char*, 3> sensorTypes = {
-    "SkylakeCPU", "BroadwellCPU", "HaswellCPU"};
-
-void detectCpuAsync(
-    boost::asio::deadline_timer& pingTimer,
-    boost::asio::deadline_timer& creationTimer, boost::asio::io_service& io,
-    sdbusplus::asio::object_server& objectServer,
-    boost::container::flat_map<std::string, std::unique_ptr<CPUSensor>>&
-        sensors,
-    boost::container::flat_set<CPUConfig>& configs,
-    std::shared_ptr<sdbusplus::asio::connection>& dbusConnection);
-
-bool createSensors(
-    boost::asio::io_service& io, sdbusplus::asio::object_server& objectServer,
-    boost::container::flat_map<std::string, std::unique_ptr<CPUSensor>>&
-        sensors,
-    boost::container::flat_set<CPUConfig>& configs,
-    std::shared_ptr<sdbusplus::asio::connection>& dbusConnection)
-{
-    bool available = false;
-    for (CPUConfig cpu : configs)
-    {
-        if (cpu.state != State::OFF)
-        {
-            available = true;
-            break;
-        }
-    }
-    if (!available)
-    {
-        return false;
-    }
-
-    // use new data the first time, then refresh
-    ManagedObjectType sensorConfigurations;
-    bool useCache = false;
-    for (const char* type : sensorTypes)
-    {
-        if (!getSensorConfiguration(configPrefix + std::string(type),
-                                    dbusConnection, sensorConfigurations,
-                                    useCache))
-        {
-            return false;
-        }
-        useCache = true;
-    }
-
-    std::vector<fs::path> hwmonNamePaths;
-    if (!findFiles(fs::path(R"(/sys/bus/peci/devices)"),
-                   R"(peci-\d+/\d+-.+/peci-.+/hwmon/hwmon\d+/name$)",
-                   hwmonNamePaths, 1))
-    {
-        std::cerr << "No CPU sensors in system\n";
-        return true;
-    }
-
-    boost::container::flat_set<std::string> scannedDirectories;
-    boost::container::flat_set<std::string> createdSensors;
-
-    for (fs::path& hwmonNamePath : hwmonNamePaths)
-    {
-        const std::string& pathStr = hwmonNamePath.string();
-        auto hwmonDirectory = hwmonNamePath.parent_path();
-
-        auto ret = scannedDirectories.insert(hwmonDirectory.string());
-        if (!ret.second)
-        {
-            continue; // already searched this path
-        }
-
-        fs::path::iterator it = hwmonNamePath.begin();
-        std::advance(it, 6); // pick the 6th part for a PECI client device name
-        std::string deviceName = *it;
-        auto findHyphen = deviceName.find("-");
-        if (findHyphen == std::string::npos)
-        {
-            std::cerr << "found bad device " << deviceName << "\n";
-            continue;
-        }
-        std::string busStr = deviceName.substr(0, findHyphen);
-        std::string addrStr = deviceName.substr(findHyphen + 1);
-
-        size_t bus = 0;
-        size_t addr = 0;
-        try
-        {
-            bus = std::stoi(busStr);
-            addr = std::stoi(addrStr, 0, 16);
-        }
-        catch (std::invalid_argument)
-        {
-            continue;
-        }
-
-        std::ifstream nameFile(hwmonNamePath);
-        if (!nameFile.good())
-        {
-            std::cerr << "Failure reading " << hwmonNamePath << "\n";
-            continue;
-        }
-        std::string hwmonName;
-        std::getline(nameFile, hwmonName);
-        nameFile.close();
-        if (!hwmonName.size())
-        {
-            // shouldn't have an empty name file
-            continue;
-        }
-        if (DEBUG)
-        {
-            std::cout << "Checking: " << hwmonNamePath << ": " << hwmonName
-                      << "\n";
-        }
-
-        std::string sensorType;
-        const SensorData* sensorData = nullptr;
-        const std::string* interfacePath = nullptr;
-        const std::pair<std::string, boost::container::flat_map<
-                                         std::string, BasicVariantType>>*
-            baseConfiguration = nullptr;
-
-        for (const std::pair<sdbusplus::message::object_path, SensorData>&
-                 sensor : sensorConfigurations)
-        {
-            sensorData = &(sensor.second);
-            for (const char* type : sensorTypes)
-            {
-                sensorType = configPrefix + std::string(type);
-                auto sensorBase = sensorData->find(sensorType);
-                if (sensorBase != sensorData->end())
-                {
-                    baseConfiguration = &(*sensorBase);
-                    break;
-                }
-            }
-            if (baseConfiguration == nullptr)
-            {
-                std::cerr << "error finding base configuration for" << hwmonName
-                          << "\n";
-                continue;
-            }
-            auto configurationBus = baseConfiguration->second.find("Bus");
-            auto configurationAddress =
-                baseConfiguration->second.find("Address");
-
-            if (configurationBus == baseConfiguration->second.end() ||
-                configurationAddress == baseConfiguration->second.end())
-            {
-                std::cerr << "error finding bus or address in configuration";
-                continue;
-            }
-
-            if (sdbusplus::message::variant_ns::get<uint64_t>(
-                    configurationBus->second) != bus ||
-                sdbusplus::message::variant_ns::get<uint64_t>(
-                    configurationAddress->second) != addr)
-            {
-                continue;
-            }
-
-            interfacePath = &(sensor.first.str);
-            break;
-        }
-        if (interfacePath == nullptr)
-        {
-            std::cerr << "failed to find match for " << hwmonName << "\n";
-            continue;
-        }
-
-        auto findCpuId = baseConfiguration->second.find("CpuID");
-        if (findCpuId == baseConfiguration->second.end())
-        {
-            std::cerr << "could not determine CPU ID for " << hwmonName << "\n";
-            continue;
-        }
-        int cpuId =
-            variant_ns::visit(VariantToUnsignedIntVisitor(), findCpuId->second);
-
-        auto directory = hwmonNamePath.parent_path();
-        std::vector<fs::path> inputPaths;
-        if (!findFiles(fs::path(directory), R"(temp\d+_input$)", inputPaths, 0))
-        {
-            std::cerr << "No temperature sensors in system\n";
-            continue;
-        }
-
-        // iterate through all found temp sensors
-        for (auto& inputPath : inputPaths)
-        {
-            auto inputPathStr = inputPath.string();
-            auto labelPath =
-                boost::replace_all_copy(inputPathStr, "input", "label");
-            std::ifstream labelFile(labelPath);
-            if (!labelFile.good())
-            {
-                std::cerr << "Failure reading " << labelPath << "\n";
-                continue;
-            }
-            std::string label;
-            std::getline(labelFile, label);
-            labelFile.close();
-            std::string sensorName = label + " CPU" + std::to_string(cpuId);
-
-            auto findSensor = sensors.find(sensorName);
-            if (findSensor != sensors.end())
-            {
-                if (DEBUG)
-                {
-                    std::cout << "Skipped: " << inputPath << ": " << sensorName
-                              << " is already created\n";
-                }
-                continue;
-            }
-
-            std::vector<thresholds::Threshold> sensorThresholds;
-            std::string labelHead = label.substr(0, label.find(" "));
-            parseThresholdsFromConfig(*sensorData, sensorThresholds,
-                                      &labelHead);
-            if (!sensorThresholds.size())
-            {
-                if (!parseThresholdsFromAttr(sensorThresholds, inputPathStr,
-                                             CPUSensor::sensorScaleFactor))
-                {
-                    std::cerr << "error populating thresholds for "
-                              << sensorName << "\n";
-                }
-            }
-            sensors[sensorName] = std::make_unique<CPUSensor>(
-                inputPathStr, sensorType, objectServer, dbusConnection, io,
-                sensorName, std::move(sensorThresholds), *interfacePath);
-            createdSensors.insert(sensorName);
-            if (DEBUG)
-            {
-                std::cout << "Mapped: " << inputPath << " to " << sensorName
-                          << "\n";
-            }
-        }
-    }
-
-    if (createdSensors.size())
-    {
-        std::cout << "Sensor" << (createdSensors.size() == 1 ? " is" : "s are")
-                  << " created\n";
-    }
-
-    return true;
-}
-
-void exportDevice(const CPUConfig& config)
-{
-    std::ostringstream hex;
-    hex << std::hex << config.addr;
-    const std::string& addrHexStr = hex.str();
-    std::string busStr = std::to_string(config.bus);
-
-    std::string parameters = "peci-client 0x" + addrHexStr;
-    std::string device = "/sys/bus/peci/devices/peci-" + busStr + "/new_device";
-
-    std::experimental::filesystem::path devicePath(device);
-    const std::string& dir = devicePath.parent_path().string();
-    for (const auto& path :
-         std::experimental::filesystem::directory_iterator(dir))
-    {
-        if (!std::experimental::filesystem::is_directory(path))
-        {
-            continue;
-        }
-
-        const std::string& directoryName = path.path().filename();
-        if (boost::starts_with(directoryName, busStr) &&
-            boost::ends_with(directoryName, addrHexStr))
-        {
-            if (DEBUG)
-            {
-                std::cout << parameters << " on bus " << busStr
-                          << " is already exported\n";
-            }
-            return;
-        }
-    }
-
-    std::ofstream deviceFile(device);
-    if (!deviceFile.good())
-    {
-        std::cerr << "Error writing " << device << "\n";
-        return;
-    }
-    deviceFile << parameters;
-    deviceFile.close();
-
-    std::cout << parameters << " on bus " << busStr << " is exported\n";
-}
-
-void detectCpu(boost::asio::deadline_timer& pingTimer,
-               boost::asio::deadline_timer& creationTimer,
-               boost::asio::io_service& io,
-               sdbusplus::asio::object_server& objectServer,
-               boost::container::flat_map<std::string,
-                                          std::unique_ptr<CPUSensor>>& sensors,
-               boost::container::flat_set<CPUConfig>& configs,
-               std::shared_ptr<sdbusplus::asio::connection>& dbusConnection)
-{
-    size_t rescanDelaySeconds = 0;
-    bool keepPinging = false;
-
-    for (CPUConfig& config : configs)
-    {
-        std::string peciDevPath = peciDev + std::to_string(config.bus);
-        auto file = open(peciDevPath.c_str(), O_RDWR | O_CLOEXEC);
-        if (file < 0)
-        {
-            std::cerr << "unable to open " << peciDevPath << "\n";
-            std::exit(EXIT_FAILURE);
-        }
-
-        State state;
-        struct peci_ping_msg msg;
-        msg.addr = config.addr;
-        if (!ioctl(file, PECI_IOC_PING, &msg))
-        {
-            bool dimmReady = false;
-            for (unsigned int rank = 0; rank < rankNumMax; rank++)
-            {
-                struct peci_rd_pkg_cfg_msg msg;
-                msg.addr = config.addr;
-                msg.index = MBX_INDEX_DDR_DIMM_TEMP;
-                msg.param = rank;
-                msg.rx_len = 4;
-                if (!ioctl(file, PECI_IOC_RD_PKG_CFG, &msg))
-                {
-                    if (msg.pkg_config[0] || msg.pkg_config[1] ||
-                        msg.pkg_config[2])
-                    {
-                        dimmReady = true;
-                        break;
-                    }
-                }
-                else
-                {
-                    break;
-                }
-            }
-
-            if (dimmReady)
-            {
-                state = State::READY;
-            }
-            else
-            {
-                state = State::ON;
-            }
-        }
-        else
-        {
-            state = State::OFF;
-        }
-
-        close(file);
-
-        if (config.state != state)
-        {
-            if (config.state == State::OFF)
-            {
-                std::cout << config.name << " is detected\n";
-                exportDevice(config);
-            }
-            if (state == State::READY)
-            {
-                std::cout << "DIMM(s) on " << config.name
-                          << " is/are detected\n";
-            }
-            config.state = state;
-        }
-
-        if (config.state != State::OFF)
-        {
-            if (config.state == State::ON)
-            {
-                rescanDelaySeconds = 1;
-            }
-            else
-            {
-                rescanDelaySeconds = 5;
-            }
-        }
-
-        if (config.state != State::READY)
-        {
-            keepPinging = true;
-        }
-
-        if (DEBUG)
-        {
-            std::cout << config.name << ", state: " << config.state << "\n";
-        }
-    }
-
-    if (rescanDelaySeconds)
-    {
-        creationTimer.expires_from_now(
-            boost::posix_time::seconds(rescanDelaySeconds));
-        creationTimer.async_wait([&](const boost::system::error_code& ec) {
-            if (ec == boost::asio::error::operation_aborted)
-            {
-                return; // we're being canceled
-            }
-
-            if (!createSensors(io, objectServer, sensors, configs,
-                               dbusConnection))
-            {
-                detectCpuAsync(pingTimer, creationTimer, io, objectServer,
-                               sensors, configs, dbusConnection);
-            }
-        });
-    }
-
-    if (keepPinging)
-    {
-        detectCpuAsync(pingTimer, creationTimer, io, objectServer, sensors,
-                       configs, dbusConnection);
-    }
-}
-
-void detectCpuAsync(
-    boost::asio::deadline_timer& pingTimer,
-    boost::asio::deadline_timer& creationTimer, boost::asio::io_service& io,
-    sdbusplus::asio::object_server& objectServer,
-    boost::container::flat_map<std::string, std::unique_ptr<CPUSensor>>&
-        sensors,
-    boost::container::flat_set<CPUConfig>& configs,
-    std::shared_ptr<sdbusplus::asio::connection>& dbusConnection)
-{
-    pingTimer.expires_from_now(boost::posix_time::seconds(1));
-    pingTimer.async_wait([&](const boost::system::error_code& ec) {
-        if (ec == boost::asio::error::operation_aborted)
-        {
-            return; // we're being canceled
-        }
-
-        detectCpu(pingTimer, creationTimer, io, objectServer, sensors, configs,
-                  dbusConnection);
-    });
-}
-
-bool getCpuConfig(const std::shared_ptr<sdbusplus::asio::connection>& systemBus,
-                  boost::container::flat_set<CPUConfig>& configs)
-{
-    ManagedObjectType sensorConfigurations;
-    bool useCache = false;
-    // use new data the first time, then refresh
-    for (const char* type : sensorTypes)
-    {
-        if (!getSensorConfiguration(configPrefix + std::string(type), systemBus,
-                                    sensorConfigurations, useCache))
-        {
-            return false;
-        }
-        useCache = true;
-    }
-
-    // check PECI client addresses and DT overlay names from CPU configuration
-    // before starting ping operation
-    for (const char* type : sensorTypes)
-    {
-        for (const std::pair<sdbusplus::message::object_path, SensorData>&
-                 sensor : sensorConfigurations)
-        {
-            for (const std::pair<
-                     std::string,
-                     boost::container::flat_map<std::string, BasicVariantType>>&
-                     config : sensor.second)
-            {
-                if ((configPrefix + std::string(type)) != config.first)
-                {
-                    continue;
-                }
-
-                auto findName = config.second.find("Name");
-                if (findName == config.second.end())
-                {
-                    continue;
-                }
-                std::string nameRaw = variant_ns::visit(
-                    VariantToStringVisitor(), findName->second);
-                std::string name =
-                    std::regex_replace(nameRaw, illegalDbusRegex, "_");
-
-                auto findBus = config.second.find("Bus");
-                if (findBus == config.second.end())
-                {
-                    std::cerr << "Can't find 'Bus' setting in " << name << "\n";
-                    continue;
-                }
-                uint64_t bus = variant_ns::visit(VariantToUnsignedIntVisitor(),
-                                                 findBus->second);
-
-                auto findAddress = config.second.find("Address");
-                if (findAddress == config.second.end())
-                {
-                    std::cerr << "Can't find 'Address' setting in " << name
-                              << "\n";
-                    continue;
-                }
-                uint64_t addr = variant_ns::visit(VariantToUnsignedIntVisitor(),
-                                                  findAddress->second);
-
-                if (DEBUG)
-                {
-                    std::cout << "bus: " << bus << "\n";
-                    std::cout << "addr: " << addr << "\n";
-                    std::cout << "name: " << name << "\n";
-                    std::cout << "type: " << type << "\n";
-                }
-
-                configs.emplace(bus, addr, name, State::OFF);
-            }
-        }
-    }
-
-    if (configs.size())
-    {
-        std::cout << "CPU config" << (configs.size() == 1 ? " is" : "s are")
-                  << " parsed\n";
-        return true;
-    }
-
-    return false;
-}
-
-int main(int argc, char** argv)
-{
-    boost::asio::io_service io;
-    auto systemBus = std::make_shared<sdbusplus::asio::connection>(io);
-    boost::container::flat_set<CPUConfig> configs;
-
-    systemBus->request_name("xyz.openbmc_project.CPUSensor");
-    sdbusplus::asio::object_server objectServer(systemBus);
-    boost::container::flat_map<std::string, std::unique_ptr<CPUSensor>> sensors;
-    std::vector<std::unique_ptr<sdbusplus::bus::match::match>> matches;
-    boost::asio::deadline_timer pingTimer(io);
-    boost::asio::deadline_timer creationTimer(io);
-    boost::asio::deadline_timer filterTimer(io);
-
-    filterTimer.expires_from_now(boost::posix_time::seconds(1));
-    filterTimer.async_wait([&](const boost::system::error_code& ec) {
-        if (ec == boost::asio::error::operation_aborted)
-        {
-            return; // we're being canceled
-        }
-
-        if (getCpuConfig(systemBus, configs))
-        {
-            detectCpuAsync(pingTimer, creationTimer, io, objectServer, sensors,
-                           configs, systemBus);
-        }
-    });
-
-    std::function<void(sdbusplus::message::message&)> eventHandler =
-        [&](sdbusplus::message::message& message) {
-            if (message.is_method_error())
-            {
-                std::cerr << "callback method error\n";
-                return;
-            }
-
-            if (DEBUG)
-            {
-                std::cout << message.get_path() << " is changed\n";
-            }
-
-            // this implicitly cancels the timer
-            filterTimer.expires_from_now(boost::posix_time::seconds(1));
-            filterTimer.async_wait([&](const boost::system::error_code& ec) {
-                if (ec == boost::asio::error::operation_aborted)
-                {
-                    return; // we're being canceled
-                }
-
-                if (getCpuConfig(systemBus, configs))
-                {
-                    detectCpuAsync(pingTimer, creationTimer, io, objectServer,
-                                   sensors, configs, systemBus);
-                }
-            });
-        };
-
-    for (const char* type : sensorTypes)
-    {
-        auto match = std::make_unique<sdbusplus::bus::match::match>(
-            static_cast<sdbusplus::bus::bus&>(*systemBus),
-            "type='signal',member='PropertiesChanged',path_namespace='" +
-                std::string(inventoryPath) + "',arg0namespace='" +
-                configPrefix + type + "'",
-            eventHandler);
-        matches.emplace_back(std::move(match));
-    }
-
-    io.run();
-}
diff --git a/sensors/src/FanMain.cpp b/sensors/src/FanMain.cpp
deleted file mode 100644
index 8401343..0000000
--- a/sensors/src/FanMain.cpp
+++ /dev/null
@@ -1,390 +0,0 @@
-/*
-// Copyright (c) 2017 Intel Corporation
-//
-// 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.
-*/
-
-#include <PwmSensor.hpp>
-#include <TachSensor.hpp>
-#include <Utils.hpp>
-#include <VariantVisitors.hpp>
-#include <boost/algorithm/string/predicate.hpp>
-#include <boost/algorithm/string/replace.hpp>
-#include <boost/container/flat_set.hpp>
-#include <boost/lexical_cast.hpp>
-#include <experimental/filesystem>
-#include <fstream>
-#include <regex>
-#include <sdbusplus/asio/connection.hpp>
-#include <sdbusplus/asio/object_server.hpp>
-
-static constexpr bool DEBUG = false;
-
-namespace fs = std::experimental::filesystem;
-namespace variant_ns = sdbusplus::message::variant_ns;
-static constexpr std::array<const char*, 1> sensorTypes = {
-    "xyz.openbmc_project.Configuration.AspeedFan"};
-constexpr const char* redundancyConfiguration =
-    "xyz.openbmc_project.Configuration.FanRedundancy";
-static std::regex inputRegex(R"(fan(\d+)_input)");
-
-// todo: power supply fan redundancy
-std::unique_ptr<RedundancySensor> systemRedundancy = nullptr;
-
-void createSensors(
-    boost::asio::io_service& io, sdbusplus::asio::object_server& objectServer,
-    boost::container::flat_map<std::string, std::unique_ptr<TachSensor>>&
-        tachSensors,
-    boost::container::flat_map<std::string, std::unique_ptr<PwmSensor>>&
-        pwmSensors,
-    std::shared_ptr<sdbusplus::asio::connection>& dbusConnection,
-    const std::unique_ptr<boost::container::flat_set<std::string>>&
-        sensorsChanged)
-{
-    bool firstScan = sensorsChanged == nullptr;
-    // use new data the first time, then refresh
-    ManagedObjectType sensorConfigurations;
-    bool useCache = false;
-    for (const char* type : sensorTypes)
-    {
-        if (!getSensorConfiguration(type, dbusConnection, sensorConfigurations,
-                                    useCache))
-        {
-            std::cerr << "error communicating to entity manager\n";
-            return;
-        }
-        useCache = true;
-    }
-    std::vector<fs::path> paths;
-    if (!findFiles(fs::path("/sys/class/hwmon"), R"(fan\d+_input)", paths))
-    {
-        std::cerr << "No temperature sensors in system\n";
-        return;
-    }
-
-    // iterate through all found fan sensors, and try to match them with
-    // configuration
-    for (auto& path : paths)
-    {
-        std::smatch match;
-        std::string pathStr = path.string();
-
-        std::regex_search(pathStr, match, inputRegex);
-        std::string indexStr = *(match.begin() + 1);
-
-        auto directory = path.parent_path();
-        // convert to 0 based
-        size_t index = std::stoul(indexStr) - 1;
-
-        const char* baseType;
-        const SensorData* sensorData = nullptr;
-        const std::string* interfacePath = nullptr;
-        const std::pair<std::string, boost::container::flat_map<
-                                         std::string, BasicVariantType>>*
-            baseConfiguration = nullptr;
-        for (const std::pair<sdbusplus::message::object_path, SensorData>&
-                 sensor : sensorConfigurations)
-        {
-            // find the base of the configuration to see if indexes match
-            for (const char* type : sensorTypes)
-            {
-                auto sensorBaseFind = sensor.second.find(type);
-                if (sensorBaseFind != sensor.second.end())
-                {
-                    baseConfiguration = &(*sensorBaseFind);
-                    interfacePath = &(sensor.first.str);
-                    baseType = type;
-                    break;
-                }
-            }
-            if (baseConfiguration == nullptr)
-            {
-                continue;
-            }
-            auto connector =
-                sensor.second.find(baseType + std::string(".Connector"));
-            if (connector == sensor.second.end())
-            {
-                std::cerr << baseConfiguration->first << " missing connector\n";
-                continue;
-            }
-            auto findPwmIndex = connector->second.find("Pwm");
-            if (findPwmIndex == connector->second.end())
-            {
-                continue;
-            }
-            uint16_t pwmIndex = variant_ns::visit(VariantToUnsignedIntVisitor(),
-                                                  findPwmIndex->second);
-            auto oemNamePath = directory.string() + R"(/of_node/oemname)" +
-                               std::to_string(pwmIndex);
-
-            if (DEBUG)
-            {
-                std::cout << "Checking path " << oemNamePath << "\n";
-            }
-            std::ifstream nameFile(oemNamePath);
-            if (!nameFile.good())
-            {
-                continue;
-            }
-            std::string oemName;
-            std::getline(nameFile, oemName);
-            nameFile.close();
-            if (!oemName.size())
-            {
-                // shouldn't have an empty name file
-                continue;
-            }
-            oemName.pop_back(); // remove trailing null
-            auto findIndex = baseConfiguration->second.find("Index");
-            if (findIndex == baseConfiguration->second.end())
-            {
-                std::cerr << baseConfiguration->first << " missing index\n";
-                continue;
-            }
-            unsigned int configIndex = variant_ns::visit(
-                VariantToUnsignedIntVisitor(), findIndex->second);
-
-            if (configIndex != index)
-            {
-                continue;
-            }
-            // now that the indexes match, verify the connector
-            auto findConnectorName = connector->second.find("Name");
-            if (findConnectorName == connector->second.end())
-            {
-                continue;
-            }
-            std::string connectorName = variant_ns::visit(
-                VariantToStringVisitor(), findConnectorName->second);
-            boost::replace_all(connectorName, " ", "_");
-            if (connectorName == oemName)
-            {
-                sensorData = &(sensor.second);
-                break;
-            }
-        }
-        if (sensorData == nullptr)
-        {
-            std::cerr << "failed to find match for " << path.string() << "\n";
-            continue;
-        }
-
-        auto findSensorName = baseConfiguration->second.find("Name");
-        if (findSensorName == baseConfiguration->second.end())
-        {
-            std::cerr << "could not determine configuration name for "
-                      << path.string() << "\n";
-            continue;
-        }
-        std::string sensorName =
-            sdbusplus::message::variant_ns::get<std::string>(
-                findSensorName->second);
-        // on rescans, only update sensors we were signaled by
-        auto findSensor = tachSensors.find(sensorName);
-        if (!firstScan && findSensor != tachSensors.end())
-        {
-            bool found = false;
-            for (auto it = sensorsChanged->begin(); it != sensorsChanged->end();
-                 it++)
-            {
-                if (boost::ends_with(*it, findSensor->second->name))
-                {
-                    sensorsChanged->erase(it);
-                    findSensor->second = nullptr;
-                    found = true;
-                    break;
-                }
-            }
-            if (!found)
-            {
-                continue;
-            }
-        }
-        std::vector<thresholds::Threshold> sensorThresholds;
-        if (!parseThresholdsFromConfig(*sensorData, sensorThresholds))
-        {
-            std::cerr << "error populating thresholds for " << sensorName
-                      << "\n";
-        }
-
-        auto presenceConfig =
-            sensorData->find(baseType + std::string(".Presence"));
-
-        std::unique_ptr<PresenceSensor> presenceSensor(nullptr);
-
-        // presence sensors are optional
-        if (presenceConfig != sensorData->end())
-        {
-            auto findIndex = presenceConfig->second.find("Index");
-            auto findPolarity = presenceConfig->second.find("Polarity");
-
-            if (findIndex == presenceConfig->second.end() ||
-                findPolarity == presenceConfig->second.end())
-            {
-                std::cerr << "Malformed Presence Configuration\n";
-            }
-            else
-            {
-                size_t index = variant_ns::get<uint64_t>(findIndex->second);
-                bool inverted =
-                    variant_ns::get<std::string>(findPolarity->second) == "Low";
-                presenceSensor =
-                    std::make_unique<PresenceSensor>(index, inverted, io);
-            }
-        }
-
-        tachSensors[sensorName] = std::make_unique<TachSensor>(
-            path.string(), objectServer, dbusConnection,
-            std::move(presenceSensor), systemRedundancy, io, sensorName,
-            std::move(sensorThresholds), *interfacePath);
-    }
-    std::vector<fs::path> pwms;
-    if (!findFiles(fs::path("/sys/class/hwmon"), R"(pwm\d+)", pwms))
-    {
-        std::cerr << "No pwm in system\n";
-        return;
-    }
-    for (const fs::path& pwm : pwms)
-    {
-        // only add new elements
-        pwmSensors.insert(std::pair<std::string, std::unique_ptr<PwmSensor>>(
-            pwm.string(),
-            std::make_unique<PwmSensor>(pwm.string(), objectServer)));
-    }
-}
-
-void createRedundancySensor(
-    const boost::container::flat_map<std::string, std::unique_ptr<TachSensor>>&
-        sensors,
-    std::shared_ptr<sdbusplus::asio::connection> conn,
-    sdbusplus::asio::object_server& objectServer)
-{
-
-    conn->async_method_call(
-        [&objectServer, &sensors](boost::system::error_code& ec,
-                                  const ManagedObjectType managedObj) {
-            if (ec)
-            {
-                std::cerr << "Error calling entity manager \n";
-                return;
-            }
-            for (const auto& pathPair : managedObj)
-            {
-                for (const auto& interfacePair : pathPair.second)
-                {
-                    if (interfacePair.first == redundancyConfiguration)
-                    {
-                        // currently only support one
-                        auto findCount =
-                            interfacePair.second.find("AllowedFailures");
-                        if (findCount == interfacePair.second.end())
-                        {
-                            std::cerr << "Malformed redundancy record \n";
-                            return;
-                        }
-                        std::vector<std::string> sensorList;
-
-                        for (const auto& sensor : sensors)
-                        {
-                            sensorList.push_back(
-                                "/xyz/openbmc_project/sensors/fan_tach/" +
-                                sensor.second->name);
-                        }
-                        systemRedundancy = std::make_unique<RedundancySensor>(
-                            variant_ns::get<uint64_t>(findCount->second),
-                            sensorList, objectServer);
-
-                        return;
-                    }
-                }
-            }
-        },
-        "xyz.openbmc_project.EntityManager", "/",
-        "org.freedesktop.DBus.ObjectManager", "GetManagedObjects");
-}
-
-int main(int argc, char** argv)
-{
-    boost::asio::io_service io;
-    auto systemBus = std::make_shared<sdbusplus::asio::connection>(io);
-    systemBus->request_name("xyz.openbmc_project.FanSensor");
-    sdbusplus::asio::object_server objectServer(systemBus);
-    boost::container::flat_map<std::string, std::unique_ptr<TachSensor>>
-        tachSensors;
-    boost::container::flat_map<std::string, std::unique_ptr<PwmSensor>>
-        pwmSensors;
-    std::vector<std::unique_ptr<sdbusplus::bus::match::match>> matches;
-    std::unique_ptr<boost::container::flat_set<std::string>> sensorsChanged =
-        std::make_unique<boost::container::flat_set<std::string>>();
-
-    io.post([&]() {
-        createSensors(io, objectServer, tachSensors, pwmSensors, systemBus,
-                      nullptr);
-        createRedundancySensor(tachSensors, systemBus, objectServer);
-    });
-
-    boost::asio::deadline_timer filterTimer(io);
-    std::function<void(sdbusplus::message::message&)> eventHandler =
-        [&](sdbusplus::message::message& message) {
-            if (message.is_method_error())
-            {
-                std::cerr << "callback method error\n";
-                return;
-            }
-            sensorsChanged->insert(message.get_path());
-            // this implicitly cancels the timer
-            filterTimer.expires_from_now(boost::posix_time::seconds(1));
-
-            filterTimer.async_wait([&](const boost::system::error_code& ec) {
-                if (ec == boost::asio::error::operation_aborted)
-                {
-                    /* we were canceled*/
-                    return;
-                }
-                else if (ec)
-                {
-                    std::cerr << "timer error\n";
-                    return;
-                }
-                createSensors(io, objectServer, tachSensors, pwmSensors,
-                              systemBus, sensorsChanged);
-            });
-        };
-
-    for (const char* type : sensorTypes)
-    {
-        auto match = std::make_unique<sdbusplus::bus::match::match>(
-            static_cast<sdbusplus::bus::bus&>(*systemBus),
-            "type='signal',member='PropertiesChanged',path_namespace='" +
-                std::string(inventoryPath) + "',arg0namespace='" + type + "'",
-            eventHandler);
-        matches.emplace_back(std::move(match));
-    }
-
-    // redundancy sensor
-    std::function<void(sdbusplus::message::message&)> redundancyHandler =
-        [&tachSensors, &systemBus,
-         &objectServer](sdbusplus::message::message& message) {
-            createRedundancySensor(tachSensors, systemBus, objectServer);
-        };
-    auto match = std::make_unique<sdbusplus::bus::match::match>(
-        static_cast<sdbusplus::bus::bus&>(*systemBus),
-        "type='signal',member='PropertiesChanged',path_namespace='" +
-            std::string(inventoryPath) + "',arg0namespace='" +
-            redundancyConfiguration + "'",
-        redundancyHandler);
-    matches.emplace_back(std::move(match));
-
-    io.run();
-}
diff --git a/sensors/src/HwmonTempMain.cpp b/sensors/src/HwmonTempMain.cpp
deleted file mode 100644
index 70fbb75..0000000
--- a/sensors/src/HwmonTempMain.cpp
+++ /dev/null
@@ -1,269 +0,0 @@
-/*
-// Copyright (c) 2017 Intel Corporation
-//
-// 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.
-*/
-
-#include <HwmonTempSensor.hpp>
-#include <Utils.hpp>
-#include <boost/algorithm/string/predicate.hpp>
-#include <boost/algorithm/string/replace.hpp>
-#include <boost/container/flat_set.hpp>
-#include <experimental/filesystem>
-#include <fstream>
-#include <regex>
-#include <sdbusplus/asio/connection.hpp>
-#include <sdbusplus/asio/object_server.hpp>
-
-static constexpr bool DEBUG = false;
-
-namespace fs = std::experimental::filesystem;
-static constexpr std::array<const char*, 2> sensorTypes = {
-    "xyz.openbmc_project.Configuration.TMP75",
-    "xyz.openbmc_project.Configuration.TMP421"};
-
-void createSensors(
-    boost::asio::io_service& io, sdbusplus::asio::object_server& objectServer,
-    boost::container::flat_map<std::string, std::unique_ptr<HwmonTempSensor>>&
-        sensors,
-    std::shared_ptr<sdbusplus::asio::connection>& dbusConnection,
-    const std::unique_ptr<boost::container::flat_set<std::string>>&
-        sensorsChanged)
-{
-    bool firstScan = sensorsChanged == nullptr;
-    // use new data the first time, then refresh
-    ManagedObjectType sensorConfigurations;
-    bool useCache = false;
-    for (const char* type : sensorTypes)
-    {
-        if (!getSensorConfiguration(type, dbusConnection, sensorConfigurations,
-                                    useCache))
-        {
-            std::cerr << "error communicating to entity manager\n";
-            return;
-        }
-        useCache = true;
-    }
-    std::vector<fs::path> paths;
-    if (!findFiles(fs::path("/sys/class/hwmon"), R"(temp\d+_input)", paths))
-    {
-        std::cerr << "No temperature sensors in system\n";
-        return;
-    }
-
-    boost::container::flat_set<std::string> directories;
-
-    // iterate through all found temp sensors, and try to match them with
-    // configuration
-    for (auto& path : paths)
-    {
-        std::smatch match;
-        const std::string& pathStr = path.string();
-        auto directory = path.parent_path();
-
-        auto ret = directories.insert(directory.string());
-        if (!ret.second)
-        {
-            continue; // already searched this path
-        }
-
-        auto device = fs::path(directory / "device");
-        std::string deviceName = fs::canonical(device).stem();
-        auto findHyphen = deviceName.find("-");
-        if (findHyphen == std::string::npos)
-        {
-            std::cerr << "found bad device " << deviceName << "\n";
-            continue;
-        }
-        std::string busStr = deviceName.substr(0, findHyphen);
-        std::string addrStr = deviceName.substr(findHyphen + 1);
-
-        size_t bus = 0;
-        size_t addr = 0;
-        try
-        {
-            bus = std::stoi(busStr);
-            addr = std::stoi(addrStr, 0, 16);
-        }
-        catch (std::invalid_argument)
-        {
-            continue;
-        }
-        const SensorData* sensorData = nullptr;
-        const std::string* interfacePath = nullptr;
-        const char* sensorType = nullptr;
-        const std::pair<std::string, boost::container::flat_map<
-                                         std::string, BasicVariantType>>*
-            baseConfiguration = nullptr;
-
-        for (const std::pair<sdbusplus::message::object_path, SensorData>&
-                 sensor : sensorConfigurations)
-        {
-            sensorData = &(sensor.second);
-            for (const char* type : sensorTypes)
-            {
-                auto sensorBase = sensorData->find(type);
-                if (sensorBase != sensorData->end())
-                {
-                    baseConfiguration = &(*sensorBase);
-                    sensorType = type;
-                    break;
-                }
-            }
-            if (baseConfiguration == nullptr)
-            {
-                std::cerr << "error finding base configuration for "
-                          << deviceName << "\n";
-                continue;
-            }
-            auto configurationBus = baseConfiguration->second.find("Bus");
-            auto configurationAddress =
-                baseConfiguration->second.find("Address");
-
-            if (configurationBus == baseConfiguration->second.end() ||
-                configurationAddress == baseConfiguration->second.end())
-            {
-                std::cerr << "error finding bus or address in configuration";
-                continue;
-            }
-
-            if (sdbusplus::message::variant_ns::get<uint64_t>(
-                    configurationBus->second) != bus ||
-                sdbusplus::message::variant_ns::get<uint64_t>(
-                    configurationAddress->second) != addr)
-            {
-                continue;
-            }
-
-            interfacePath = &(sensor.first.str);
-            break;
-        }
-        if (interfacePath == nullptr)
-        {
-            std::cerr << "failed to find match for " << deviceName << "\n";
-            continue;
-        }
-
-        auto findSensorName = baseConfiguration->second.find("Name");
-        if (findSensorName == baseConfiguration->second.end())
-        {
-            std::cerr << "could not determine configuration name for "
-                      << deviceName << "\n";
-            continue;
-        }
-        std::string sensorName =
-            sdbusplus::message::variant_ns::get<std::string>(
-                findSensorName->second);
-        // on rescans, only update sensors we were signaled by
-        auto findSensor = sensors.find(sensorName);
-        if (!firstScan && findSensor != sensors.end())
-        {
-            bool found = false;
-            for (auto it = sensorsChanged->begin(); it != sensorsChanged->end();
-                 it++)
-            {
-                if (boost::ends_with(*it, findSensor->second->name))
-                {
-                    sensorsChanged->erase(it);
-                    findSensor->second = nullptr;
-                    found = true;
-                    break;
-                }
-            }
-            if (!found)
-            {
-                continue;
-            }
-        }
-        std::vector<thresholds::Threshold> sensorThresholds;
-        if (!parseThresholdsFromConfig(*sensorData, sensorThresholds))
-        {
-            std::cerr << "error populating thresholds for " << sensorName
-                      << "\n";
-        }
-
-        sensors[sensorName] = std::make_unique<HwmonTempSensor>(
-            directory.string() + "/temp1_input", sensorType, objectServer,
-            dbusConnection, io, sensorName, std::move(sensorThresholds),
-            *interfacePath);
-        auto findSecondName = baseConfiguration->second.find("Name1");
-        if (findSecondName == baseConfiguration->second.end())
-        {
-            continue;
-        }
-
-        sensorName = sdbusplus::message::variant_ns::get<std::string>(
-            findSecondName->second);
-        sensors[sensorName] = std::make_unique<HwmonTempSensor>(
-            directory.string() + "/temp2_input", sensorType, objectServer,
-            dbusConnection, io, sensorName,
-            std::vector<thresholds::Threshold>(), *interfacePath);
-    }
-}
-
-int main(int argc, char** argv)
-{
-    boost::asio::io_service io;
-    auto systemBus = std::make_shared<sdbusplus::asio::connection>(io);
-    systemBus->request_name("xyz.openbmc_project.HwmonTempSensor");
-    sdbusplus::asio::object_server objectServer(systemBus);
-    boost::container::flat_map<std::string, std::unique_ptr<HwmonTempSensor>>
-        sensors;
-    std::vector<std::unique_ptr<sdbusplus::bus::match::match>> matches;
-    std::unique_ptr<boost::container::flat_set<std::string>> sensorsChanged =
-        std::make_unique<boost::container::flat_set<std::string>>();
-
-    io.post([&]() {
-        createSensors(io, objectServer, sensors, systemBus, nullptr);
-    });
-
-    boost::asio::deadline_timer filterTimer(io);
-    std::function<void(sdbusplus::message::message&)> eventHandler =
-        [&](sdbusplus::message::message& message) {
-            if (message.is_method_error())
-            {
-                std::cerr << "callback method error\n";
-                return;
-            }
-            sensorsChanged->insert(message.get_path());
-            // this implicitly cancels the timer
-            filterTimer.expires_from_now(boost::posix_time::seconds(1));
-
-            filterTimer.async_wait([&](const boost::system::error_code& ec) {
-                if (ec == boost::asio::error::operation_aborted)
-                {
-                    /* we were canceled*/
-                    return;
-                }
-                else if (ec)
-                {
-                    std::cerr << "timer error\n";
-                    return;
-                }
-                createSensors(io, objectServer, sensors, systemBus,
-                              sensorsChanged);
-            });
-        };
-
-    for (const char* type : sensorTypes)
-    {
-        auto match = std::make_unique<sdbusplus::bus::match::match>(
-            static_cast<sdbusplus::bus::bus&>(*systemBus),
-            "type='signal',member='PropertiesChanged',path_namespace='" +
-                std::string(inventoryPath) + "',arg0namespace='" + type + "'",
-            eventHandler);
-        matches.emplace_back(std::move(match));
-    }
-
-    io.run();
-}
diff --git a/sensors/src/HwmonTempSensor.cpp b/sensors/src/HwmonTempSensor.cpp
deleted file mode 100644
index 48e3fa6..0000000
--- a/sensors/src/HwmonTempSensor.cpp
+++ /dev/null
@@ -1,243 +0,0 @@
-/*
-// Copyright (c) 2017 Intel Corporation
-//
-// 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.
-*/
-
-#include <unistd.h>
-
-#include <HwmonTempSensor.hpp>
-#include <boost/algorithm/string/predicate.hpp>
-#include <boost/algorithm/string/replace.hpp>
-#include <boost/date_time/posix_time/posix_time.hpp>
-#include <iostream>
-#include <limits>
-#include <sdbusplus/asio/connection.hpp>
-#include <sdbusplus/asio/object_server.hpp>
-#include <string>
-
-static constexpr unsigned int sensorPollMs = 500;
-static constexpr unsigned int sensorScaleFactor = 1000;
-static constexpr size_t warnAfterErrorCount = 10;
-
-HwmonTempSensor::HwmonTempSensor(
-    const std::string &path, const std::string &objectType,
-    sdbusplus::asio::object_server &objectServer,
-    std::shared_ptr<sdbusplus::asio::connection> &conn,
-    boost::asio::io_service &io, const std::string &sensorName,
-    std::vector<thresholds::Threshold> &&_thresholds,
-    const std::string &sensorConfiguration) :
-    Sensor(boost::replace_all_copy(sensorName, " ", "_"), path,
-           std::move(_thresholds)),
-    objectType(objectType), configuration(sensorConfiguration),
-    objServer(objectServer), inputDev(io, open(path.c_str(), O_RDONLY)),
-    waitTimer(io), errCount(0),
-    // todo, get these from config
-    maxValue(127), minValue(-128)
-{
-    sensorInterface = objectServer.add_interface(
-        "/xyz/openbmc_project/sensors/temperature/" + name,
-        "xyz.openbmc_project.Sensor.Value");
-
-    if (thresholds::hasWarningInterface(thresholds))
-    {
-        thresholdInterfaceWarning = objectServer.add_interface(
-            "/xyz/openbmc_project/sensors/temperature/" + name,
-            "xyz.openbmc_project.Sensor.Threshold.Warning");
-    }
-    if (thresholds::hasCriticalInterface(thresholds))
-    {
-        thresholdInterfaceCritical = objectServer.add_interface(
-            "/xyz/openbmc_project/sensors/temperature/" + name,
-            "xyz.openbmc_project.Sensor.Threshold.Critical");
-    }
-    setInitialProperties(conn);
-    setupRead();
-}
-
-HwmonTempSensor::~HwmonTempSensor()
-{
-    // close the input dev to cancel async operations
-    inputDev.close();
-    waitTimer.cancel();
-    objServer.remove_interface(thresholdInterfaceWarning);
-    objServer.remove_interface(thresholdInterfaceCritical);
-    objServer.remove_interface(sensorInterface);
-}
-
-void HwmonTempSensor::setupRead(void)
-{
-    boost::asio::async_read_until(
-        inputDev, readBuf, '\n',
-        [&](const boost::system::error_code &ec,
-            std::size_t /*bytes_transfered*/) { handleResponse(ec); });
-}
-
-void HwmonTempSensor::handleResponse(const boost::system::error_code &err)
-{
-    if (err == boost::system::errc::bad_file_descriptor)
-    {
-        return; // we're being destroyed
-    }
-    std::istream responseStream(&readBuf);
-    if (!err)
-    {
-        std::string response;
-        std::getline(responseStream, response);
-        try
-        {
-            float nvalue = std::stof(response);
-            nvalue /= sensorScaleFactor;
-            if (!isnan(overriddenValue))
-            {
-                nvalue = overriddenValue;
-            }
-            if (nvalue != value)
-            {
-                updateValue(nvalue);
-            }
-            errCount = 0;
-        }
-        catch (const std::invalid_argument &)
-        {
-            errCount++;
-        }
-    }
-    else
-    {
-        errCount++;
-    }
-
-    // only print once
-    if (errCount == warnAfterErrorCount)
-    {
-        std::cerr << "Failure to read sensor " << name << " at " << path
-                  << " ec:" << err << "\n";
-    }
-
-    if (errCount >= warnAfterErrorCount)
-    {
-        updateValue(0);
-    }
-    responseStream.clear();
-    inputDev.close();
-    int fd = open(path.c_str(), O_RDONLY);
-    if (fd <= 0)
-    {
-        return; // we're no longer valid
-    }
-    inputDev.assign(fd);
-    waitTimer.expires_from_now(boost::posix_time::milliseconds(sensorPollMs));
-    waitTimer.async_wait([&](const boost::system::error_code &ec) {
-        if (ec == boost::asio::error::operation_aborted)
-        {
-            return; // we're being canceled
-        }
-        setupRead();
-    });
-}
-
-void HwmonTempSensor::checkThresholds(void)
-{
-    thresholds::checkThresholds(this);
-}
-
-void HwmonTempSensor::updateValue(const double &newValue)
-{
-    // Indicate that it is internal set call
-    internalSet = true;
-    sensorInterface->set_property("Value", newValue);
-    internalSet = false;
-    value = newValue;
-    checkThresholds();
-}
-
-void HwmonTempSensor::setInitialProperties(
-    std::shared_ptr<sdbusplus::asio::connection> &conn)
-{
-    // todo, get max and min from configuration
-    sensorInterface->register_property("MaxValue", maxValue);
-    sensorInterface->register_property("MinValue", minValue);
-    sensorInterface->register_property(
-        "Value", value, [&](const double &newValue, double &oldValue) {
-            return setSensorValue(newValue, oldValue);
-        });
-
-    for (auto &threshold : thresholds)
-    {
-        std::shared_ptr<sdbusplus::asio::dbus_interface> iface;
-        std::string level;
-        std::string alarm;
-        if (threshold.level == thresholds::Level::CRITICAL)
-        {
-            iface = thresholdInterfaceCritical;
-            if (threshold.direction == thresholds::Direction::HIGH)
-            {
-                level = "CriticalHigh";
-                alarm = "CriticalAlarmHigh";
-            }
-            else
-            {
-                level = "CriticalLow";
-                alarm = "CriticalAlarmLow";
-            }
-        }
-        else if (threshold.level == thresholds::Level::WARNING)
-        {
-            iface = thresholdInterfaceWarning;
-            if (threshold.direction == thresholds::Direction::HIGH)
-            {
-                level = "WarningHigh";
-                alarm = "WarningAlarmHigh";
-            }
-            else
-            {
-                level = "WarningLow";
-                alarm = "WarningAlarmLow";
-            }
-        }
-        else
-        {
-            std::cerr << "Unknown threshold level" << threshold.level << "\n";
-            continue;
-        }
-        if (!iface)
-        {
-            std::cout << "trying to set uninitialized interface\n";
-            continue;
-        }
-        iface->register_property(
-            level, threshold.value,
-            [&](const double &request, double &oldValue) {
-                oldValue = request; // todo, just let the config do this?
-                threshold.value = request;
-                thresholds::persistThreshold(configuration, objectType,
-                                             threshold, conn);
-                return 1;
-            });
-        iface->register_property(alarm, false);
-    }
-    if (!sensorInterface->initialize())
-    {
-        std::cerr << "error initializing value interface\n";
-    }
-    if (thresholdInterfaceWarning && !thresholdInterfaceWarning->initialize())
-    {
-        std::cerr << "error initializing warning threshold interface\n";
-    }
-
-    if (thresholdInterfaceCritical && !thresholdInterfaceCritical->initialize())
-    {
-        std::cerr << "error initializing critical threshold interface\n";
-    }
-}
diff --git a/sensors/src/PwmSensor.cpp b/sensors/src/PwmSensor.cpp
deleted file mode 100644
index dabc2f8..0000000
--- a/sensors/src/PwmSensor.cpp
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
-// Copyright (c) 2018 Intel Corporation
-//
-// 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.
-*/
-#include <PwmSensor.hpp>
-#include <fstream>
-#include <iostream>
-#include <sdbusplus/asio/object_server.hpp>
-
-static constexpr size_t pwmMax = 255;
-static constexpr size_t pwmMin = 0;
-
-PwmSensor::PwmSensor(const std::string& sysPath,
-                     sdbusplus::asio::object_server& objectServer) :
-    sysPath(sysPath),
-    objectServer(objectServer)
-{
-    // strip off index from path
-    name = "Pwm_" + sysPath.substr(sysPath.find_last_of("pwm") + 1);
-
-    // add interface under sensor and Control.FanPwm as Control is used
-    // in obmc project, also add sensor so it can be viewed as a sensor
-    sensorInterface = objectServer.add_interface(
-        "/xyz/openbmc_project/sensors/fan_pwm/" + name,
-        "xyz.openbmc_project.Sensor.Value");
-    uint32_t pwmValue = getValue(false);
-    double fValue = 100.0 * (static_cast<float>(pwmValue) / pwmMax);
-    sensorInterface->register_property(
-        "Value", fValue,
-        [this](const double& req, double& resp) {
-            if (req > 100 || req < 0)
-            {
-                throw std::runtime_error("Value out of range");
-                return -1;
-            }
-            double value = (req / 100) * pwmMax;
-            setValue(static_cast<int>(value));
-            resp = req;
-            return 1;
-        },
-        [this](double& curVal) {
-            float value = 100.0 * (static_cast<float>(getValue()) / pwmMax);
-            curVal = value;
-            return curVal;
-        });
-    // pwm sensor interface is in percent
-    sensorInterface->register_property("MaxValue", static_cast<int64_t>(100));
-    sensorInterface->register_property("MinValue", static_cast<int64_t>(0));
-
-    controlInterface = objectServer.add_interface(
-        "/xyz/openbmc_project/control/fanpwm/" + name,
-        "xyz.openbmc_project.Control.FanPwm");
-    controlInterface->register_property(
-        "Target", static_cast<uint64_t>(pwmValue),
-        [this](const uint64_t& req, uint64_t& resp) {
-            if (req > pwmMax || req < pwmMin)
-            {
-                throw std::runtime_error("Value out of range");
-                return -1;
-            }
-            setValue(req);
-            resp = req;
-            return 1;
-        },
-        [this](uint64_t& curVal) {
-            curVal = getValue();
-            return curVal;
-        });
-    sensorInterface->initialize();
-    controlInterface->initialize();
-}
-PwmSensor::~PwmSensor()
-{
-    objectServer.remove_interface(sensorInterface);
-    objectServer.remove_interface(controlInterface);
-}
-
-void PwmSensor::setValue(uint32_t value)
-{
-    std::ofstream ref(sysPath);
-    if (!ref.good())
-    {
-        throw std::runtime_error("Bad Write File");
-        return;
-    }
-    ref << value;
-}
-
-// on success returns pwm, on failure throws except on initialization, where it
-// prints an error and returns 0
-uint32_t PwmSensor::getValue(bool errThrow)
-{
-    std::ifstream ref(sysPath);
-    if (!ref.good())
-    {
-        return -1;
-    }
-    std::string line;
-    if (!std::getline(ref, line))
-    {
-        return -1;
-    }
-    try
-    {
-        uint32_t value = std::stoi(line);
-        return value;
-    }
-    catch (std::invalid_argument)
-    {
-        std::cerr << "Error reading pwm at " << sysPath << "\n";
-        // throw if not initial read to be caught by dbus bindings
-        if (errThrow)
-        {
-            throw std::runtime_error("Bad Read");
-        }
-    }
-    return 0;
-}
diff --git a/sensors/src/TachSensor.cpp b/sensors/src/TachSensor.cpp
deleted file mode 100644
index a68c894..0000000
--- a/sensors/src/TachSensor.cpp
+++ /dev/null
@@ -1,401 +0,0 @@
-/*
-// Copyright (c) 2018 Intel Corporation
-//
-// 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.
-*/
-
-#include <unistd.h>
-
-#include <TachSensor.hpp>
-#include <Utils.hpp>
-#include <boost/algorithm/string/predicate.hpp>
-#include <boost/algorithm/string/replace.hpp>
-#include <boost/date_time/posix_time/posix_time.hpp>
-#include <fstream>
-#include <iostream>
-#include <limits>
-#include <sdbusplus/asio/connection.hpp>
-#include <sdbusplus/asio/object_server.hpp>
-#include <string>
-
-static constexpr unsigned int pwmPollMs = 500;
-static constexpr size_t warnAfterErrorCount = 10;
-
-TachSensor::TachSensor(const std::string &path,
-                       sdbusplus::asio::object_server &objectServer,
-                       std::shared_ptr<sdbusplus::asio::connection> &conn,
-                       std::unique_ptr<PresenceSensor> &&presence,
-                       std::unique_ptr<RedundancySensor> &redundancy,
-                       boost::asio::io_service &io, const std::string &fanName,
-                       std::vector<thresholds::Threshold> &&_thresholds,
-                       const std::string &sensorConfiguration) :
-    Sensor(boost::replace_all_copy(fanName, " ", "_"), path,
-           std::move(_thresholds)),
-    objServer(objectServer), dbusConnection(conn),
-    presence(std::move(presence)), redundancy(redundancy),
-    configuration(sensorConfiguration),
-    inputDev(io, open(path.c_str(), O_RDONLY)), waitTimer(io), errCount(0),
-    // todo, get these from config
-    maxValue(25000), minValue(0)
-{
-    sensorInterface = objectServer.add_interface(
-        "/xyz/openbmc_project/sensors/fan_tach/" + name,
-        "xyz.openbmc_project.Sensor.Value");
-
-    if (thresholds::hasWarningInterface(thresholds))
-    {
-        thresholdInterfaceWarning = objectServer.add_interface(
-            "/xyz/openbmc_project/sensors/fan_tach/" + name,
-            "xyz.openbmc_project.Sensor.Threshold.Warning");
-    }
-    if (thresholds::hasCriticalInterface(thresholds))
-    {
-        thresholdInterfaceCritical = objectServer.add_interface(
-            "/xyz/openbmc_project/sensors/fan_tach/" + name,
-            "xyz.openbmc_project.Sensor.Threshold.Critical");
-    }
-    setInitialProperties(conn);
-    isPowerOn(dbusConnection); // first call initializes
-    setupRead();
-}
-
-TachSensor::~TachSensor()
-{
-    // close the input dev to cancel async operations
-    inputDev.close();
-    waitTimer.cancel();
-    objServer.remove_interface(thresholdInterfaceWarning);
-    objServer.remove_interface(thresholdInterfaceCritical);
-    objServer.remove_interface(sensorInterface);
-}
-
-void TachSensor::setupRead(void)
-{
-    boost::asio::async_read_until(
-        inputDev, readBuf, '\n',
-        [&](const boost::system::error_code &ec,
-            std::size_t /*bytes_transfered*/) { handleResponse(ec); });
-}
-
-void TachSensor::handleResponse(const boost::system::error_code &err)
-{
-    if (err == boost::system::errc::bad_file_descriptor)
-    {
-        return; // we're being destroyed
-    }
-    bool missing = false;
-    size_t pollTime = pwmPollMs;
-    if (presence)
-    {
-        if (!presence->getValue())
-        {
-            updateValue(std::numeric_limits<double>::quiet_NaN());
-            missing = true;
-            pollTime = sensorFailedPollTimeMs;
-        }
-    }
-    std::istream responseStream(&readBuf);
-    if (!missing)
-    {
-        if (!err)
-        {
-            std::string response;
-            try
-            {
-                std::getline(responseStream, response);
-                float nvalue = std::stof(response);
-                responseStream.clear();
-                if (!isnan(overriddenValue))
-                {
-                    nvalue = overriddenValue;
-                }
-                if (nvalue != value)
-                {
-                    updateValue(nvalue);
-                }
-                errCount = 0;
-            }
-            catch (const std::invalid_argument &)
-            {
-                errCount++;
-            }
-        }
-        else
-        {
-            pollTime = sensorFailedPollTimeMs;
-            errCount++;
-        }
-        if (errCount >= warnAfterErrorCount)
-        {
-            // only an error if power is on
-            if (isPowerOn(dbusConnection))
-            {
-                // only print once
-                if (errCount == warnAfterErrorCount)
-                {
-                    std::cerr << "Failure to read sensor " << name << " at "
-                              << path << " ec:" << err << "\n";
-                }
-                updateValue(0);
-            }
-            else
-            {
-                errCount = 0; // check power again in 10 cycles
-                updateValue(std::numeric_limits<double>::quiet_NaN());
-            }
-        }
-    }
-    responseStream.clear();
-    inputDev.close();
-    int fd = open(path.c_str(), O_RDONLY);
-    if (fd <= 0)
-    {
-        return; // we're no longer valid
-    }
-    inputDev.assign(fd);
-    waitTimer.expires_from_now(boost::posix_time::milliseconds(pollTime));
-    waitTimer.async_wait([&](const boost::system::error_code &ec) {
-        if (ec == boost::asio::error::operation_aborted)
-        {
-            return; // we're being canceled
-        }
-        setupRead();
-    });
-}
-
-void TachSensor::checkThresholds(void)
-{
-    bool status = thresholds::checkThresholds(this);
-    if (redundancy)
-    {
-        redundancy->update("/xyz/openbmc_project/sensors/fan_tach/" + name,
-                           !status);
-    }
-}
-
-void TachSensor::updateValue(const double &newValue)
-{
-    // Indicate that it is internal set call
-    internalSet = true;
-    sensorInterface->set_property("Value", newValue);
-    internalSet = false;
-    value = newValue;
-    checkThresholds();
-}
-
-void TachSensor::setInitialProperties(
-    std::shared_ptr<sdbusplus::asio::connection> &conn)
-{
-    // todo, get max and min from configuration
-    sensorInterface->register_property("MaxValue", maxValue);
-    sensorInterface->register_property("MinValue", minValue);
-    sensorInterface->register_property(
-        "Value", value, [&](const double &newValue, double &oldValue) {
-            return setSensorValue(newValue, oldValue);
-        });
-
-    for (auto &threshold : thresholds)
-    {
-        std::shared_ptr<sdbusplus::asio::dbus_interface> iface;
-        std::string level;
-        std::string alarm;
-        if (threshold.level == thresholds::Level::CRITICAL)
-        {
-            iface = thresholdInterfaceCritical;
-            if (threshold.direction == thresholds::Direction::HIGH)
-            {
-                level = "CriticalHigh";
-                alarm = "CriticalAlarmHigh";
-            }
-            else
-            {
-                level = "CriticalLow";
-                alarm = "CriticalAlarmLow";
-            }
-        }
-        else if (threshold.level == thresholds::Level::WARNING)
-        {
-            iface = thresholdInterfaceWarning;
-            if (threshold.direction == thresholds::Direction::HIGH)
-            {
-                level = "WarningHigh";
-                alarm = "WarningAlarmHigh";
-            }
-            else
-            {
-                level = "WarningLow";
-                alarm = "WarningAlarmLow";
-            }
-        }
-        else
-        {
-            std::cerr << "Unknown threshold level" << threshold.level << "\n";
-            continue;
-        }
-        if (!iface)
-        {
-            std::cout << "trying to set uninitialized interface\n";
-            continue;
-        }
-        iface->register_property(
-            level, threshold.value,
-            [&](const double &request, double &oldValue) {
-                oldValue = request; // todo, just let the config do this?
-                threshold.value = request;
-                thresholds::persistThreshold(
-                    configuration,
-                    "xyz.openbmc_project.Configuration.AspeedFan", threshold,
-                    conn);
-                return 1;
-            });
-        iface->register_property(alarm, false);
-    }
-    if (!sensorInterface->initialize())
-    {
-        std::cerr << "error initializing value interface\n";
-    }
-    if (thresholdInterfaceWarning && !thresholdInterfaceWarning->initialize())
-    {
-        std::cerr << "error initializing warning threshold interface\n";
-    }
-
-    if (thresholdInterfaceCritical && !thresholdInterfaceCritical->initialize())
-    {
-        std::cerr << "error initializing critical threshold interface\n";
-    }
-}
-
-PresenceSensor::PresenceSensor(const size_t index, bool inverted,
-                               boost::asio::io_service &io) :
-    inverted(inverted),
-    inputDev(io)
-{
-    // todo: use gpiodaemon
-    std::string device = gpioPath + std::string("gpio") + std::to_string(index);
-    fd = open((device + "/value").c_str(), O_RDONLY);
-    if (fd < 0)
-    {
-        std::cerr << "Error opening gpio " << index << "\n";
-        return;
-    }
-
-    std::ofstream deviceFile(device + "/edge");
-    if (!deviceFile.good())
-    {
-        std::cerr << "Error setting edge " << device << "\n";
-        return;
-    }
-    deviceFile << "both";
-    deviceFile.close();
-
-    inputDev.assign(boost::asio::ip::tcp::v4(), fd);
-    monitorPresence();
-    read();
-}
-
-PresenceSensor::~PresenceSensor()
-{
-    inputDev.close();
-    close(fd);
-}
-
-void PresenceSensor::monitorPresence(void)
-{
-    inputDev.async_wait(boost::asio::ip::tcp::socket::wait_error,
-                        [this](const boost::system::error_code &ec) {
-                            if (ec == boost::system::errc::bad_file_descriptor)
-                            {
-                                return; // we're being destroyed
-                            }
-                            else if (ec)
-                            {
-                                std::cerr
-                                    << "Error on presence sensor socket\n";
-                            }
-                            else
-                            {
-                                read();
-                            }
-                            monitorPresence();
-                        });
-}
-
-void PresenceSensor::read(void)
-{
-    constexpr size_t readSize = sizeof("0");
-    std::string readBuf;
-    readBuf.resize(readSize);
-    lseek(fd, 0, SEEK_SET);
-    size_t r = ::read(fd, readBuf.data(), readSize);
-    if (r != 1)
-    {
-        std::cerr << "Error reading gpio\n";
-    }
-    else
-    {
-        bool value = std::stoi(readBuf);
-        if (inverted)
-        {
-            value = !value;
-        }
-        status = value;
-    }
-}
-
-bool PresenceSensor::getValue(void)
-{
-    return status;
-}
-
-RedundancySensor::RedundancySensor(
-    size_t count, const std::vector<std::string> &children,
-    sdbusplus::asio::object_server &objectServer) :
-    count(count),
-    iface(objectServer.add_interface(
-        "/xyz/openbmc_project/control/FanRedundancy/Tach",
-        "xyz.openbmc_project.control.FanRedundancy")),
-    objectServer(objectServer)
-{
-    iface->register_property("Collection", children);
-    iface->register_property("Status", std::string("Full"));
-    iface->register_property("AllowedFailures", static_cast<uint8_t>(count));
-    iface->initialize();
-}
-RedundancySensor::~RedundancySensor()
-{
-    objectServer.remove_interface(iface);
-}
-void RedundancySensor::update(const std::string &name, bool failed)
-{
-    statuses[name] = failed;
-    size_t failedCount = 0;
-
-    std::string state = "Full";
-    for (const auto &status : statuses)
-    {
-        if (status.second)
-        {
-            failedCount++;
-        }
-        if (failedCount > count)
-        {
-            state = "Failed";
-            break;
-        }
-        else if (failedCount)
-        {
-            state = "Degraded";
-        }
-    }
-    iface->set_property("Status", state);
-}
diff --git a/sensors/src/Thresholds.cpp b/sensors/src/Thresholds.cpp
deleted file mode 100644
index 10b1674..0000000
--- a/sensors/src/Thresholds.cpp
+++ /dev/null
@@ -1,338 +0,0 @@
-#include <Thresholds.hpp>
-#include <VariantVisitors.hpp>
-#include <boost/algorithm/string/replace.hpp>
-#include <boost/lexical_cast.hpp>
-#include <cmath>
-#include <fstream>
-#include <iostream>
-#include <sensor.hpp>
-
-static constexpr bool DEBUG = false;
-static constexpr size_t maxThresholds = 4;
-
-namespace variant_ns = sdbusplus::message::variant_ns;
-namespace thresholds
-{
-unsigned int toBusValue(const Level &level)
-{
-    switch (level)
-    {
-        case (Level::WARNING):
-        {
-            return 0;
-        }
-        case (Level::CRITICAL):
-        {
-            return 1;
-        }
-        default:
-        {
-            return -1;
-        }
-    }
-}
-
-std::string toBusValue(const Direction &direction)
-{
-    switch (direction)
-    {
-        case (Direction::LOW):
-        {
-            return "less than";
-        }
-        case (Direction::HIGH):
-        {
-            return "greater than";
-        }
-        default:
-        {
-            return "err";
-        }
-    }
-}
-
-bool parseThresholdsFromConfig(
-    const SensorData &sensorData,
-    std::vector<thresholds::Threshold> &thresholdVector,
-    const std::string *matchLabel)
-{
-    for (const auto &item : sensorData)
-    {
-        if (item.first.find("Thresholds") == std::string::npos)
-        {
-            continue;
-        }
-        if (matchLabel != nullptr)
-        {
-            auto labelFind = item.second.find("Label");
-            if (labelFind == item.second.end())
-                continue;
-            if (variant_ns::visit(VariantToStringVisitor(),
-                                  labelFind->second) != *matchLabel)
-                continue;
-        }
-        auto directionFind = item.second.find("Direction");
-        auto severityFind = item.second.find("Severity");
-        auto valueFind = item.second.find("Value");
-        if (valueFind == item.second.end() ||
-            severityFind == item.second.end() ||
-            directionFind == item.second.end())
-        {
-            std::cerr << "Malformed threshold in configuration\n";
-            return false;
-        }
-        Level level;
-        Direction direction;
-        if (variant_ns::visit(VariantToUnsignedIntVisitor(),
-                              severityFind->second) == 0)
-        {
-            level = Level::WARNING;
-        }
-        else
-        {
-            level = Level::CRITICAL;
-        }
-        if (variant_ns::visit(VariantToStringVisitor(),
-                              directionFind->second) == "less than")
-        {
-            direction = Direction::LOW;
-        }
-        else
-        {
-            direction = Direction::HIGH;
-        }
-        float val =
-            variant_ns::visit(VariantToFloatVisitor(), valueFind->second);
-
-        thresholdVector.emplace_back(level, direction, val);
-    }
-    return true;
-}
-
-void persistThreshold(const std::string &path, const std::string &baseInterface,
-                      const thresholds::Threshold &threshold,
-                      std::shared_ptr<sdbusplus::asio::connection> &conn)
-{
-    for (int ii = 0; ii < maxThresholds; ii++)
-    {
-        std::string thresholdInterface =
-            baseInterface + ".Thresholds" + std::to_string(ii);
-        conn->async_method_call(
-            [&, path, threshold, thresholdInterface](
-                const boost::system::error_code &ec,
-                const boost::container::flat_map<std::string, BasicVariantType>
-                    &result) {
-                if (ec)
-                {
-                    return; // threshold not supported
-                }
-
-                auto directionFind = result.find("Direction");
-                auto severityFind = result.find("Severity");
-                auto valueFind = result.find("Value");
-                if (valueFind == result.end() || severityFind == result.end() ||
-                    directionFind == result.end())
-                {
-                    std::cerr << "Malformed threshold in configuration\n";
-                    return;
-                }
-                unsigned int level = variant_ns::visit(
-                    VariantToUnsignedIntVisitor(), severityFind->second);
-
-                std::string dir = variant_ns::visit(VariantToStringVisitor(),
-                                                    directionFind->second);
-                if ((toBusValue(threshold.level) != level) ||
-                    (toBusValue(threshold.direction) != dir))
-                {
-                    return; // not the droid we're looking for
-                }
-
-                sdbusplus::message::variant<double> value(threshold.value);
-                conn->async_method_call(
-                    [](const boost::system::error_code &ec) {
-                        if (ec)
-                        {
-                            std::cerr << "Error setting threshold " << ec
-                                      << "\n";
-                        }
-                    },
-                    entityManagerName, path, "org.freedesktop.DBus.Properties",
-                    "Set", thresholdInterface, "Value", value);
-            },
-            entityManagerName, path, "org.freedesktop.DBus.Properties",
-            "GetAll", thresholdInterface);
-    }
-}
-
-bool checkThresholds(Sensor *sensor)
-{
-    bool status = true;
-
-    if (sensor->thresholds.empty())
-    {
-        return true;
-    }
-    for (auto &threshold : sensor->thresholds)
-    {
-        if (std::isnan(sensor->value))
-        {
-            threshold.asserted = false;
-        }
-        else if (threshold.direction == thresholds::Direction::HIGH)
-        {
-            if (sensor->value > threshold.value && !threshold.asserted)
-            {
-                assertThresholds(sensor, threshold.level, threshold.direction,
-                                 true);
-                threshold.asserted = true;
-            }
-            else if (sensor->value <= threshold.value && threshold.asserted)
-            {
-                assertThresholds(sensor, threshold.level, threshold.direction,
-                                 false);
-                threshold.asserted = false;
-            }
-        }
-        else
-        {
-            if (sensor->value < threshold.value && !threshold.asserted)
-            {
-                assertThresholds(sensor, threshold.level, threshold.direction,
-                                 true);
-                threshold.asserted = true;
-            }
-            else if (sensor->value >= threshold.value && threshold.asserted)
-            {
-                assertThresholds(sensor, threshold.level, threshold.direction,
-                                 false);
-                threshold.asserted = false;
-            }
-        }
-        if (threshold.level == thresholds::Level::CRITICAL &&
-            threshold.asserted)
-        {
-            status = false;
-        }
-    }
-    return status;
-}
-
-void assertThresholds(Sensor *sensor, thresholds::Level level,
-                      thresholds::Direction direction, bool assert)
-{
-    std::string property;
-    std::shared_ptr<sdbusplus::asio::dbus_interface> interface;
-    if (level == thresholds::Level::WARNING &&
-        direction == thresholds::Direction::HIGH)
-    {
-        property = "WarningAlarmHigh";
-        interface = sensor->thresholdInterfaceWarning;
-    }
-    else if (level == thresholds::Level::WARNING &&
-             direction == thresholds::Direction::LOW)
-    {
-        property = "WarningAlarmLow";
-        interface = sensor->thresholdInterfaceWarning;
-    }
-    else if (level == thresholds::Level::CRITICAL &&
-             direction == thresholds::Direction::HIGH)
-    {
-        property = "CriticalAlarmHigh";
-        interface = sensor->thresholdInterfaceCritical;
-    }
-    else if (level == thresholds::Level::CRITICAL &&
-             direction == thresholds::Direction::LOW)
-    {
-        property = "CriticalAlarmLow";
-        interface = sensor->thresholdInterfaceCritical;
-    }
-    else
-    {
-        std::cerr << "Unknown threshold, level " << level << "direction "
-                  << direction << "\n";
-        return;
-    }
-    if (!interface)
-    {
-        std::cout << "trying to set uninitialized interface\n";
-        return;
-    }
-    interface->set_property(property, assert);
-}
-
-static constexpr std::array<const char *, 4> attrTypes = {"lcrit", "min", "max",
-                                                          "crit"};
-
-bool parseThresholdsFromAttr(
-    std::vector<thresholds::Threshold> &thresholdVector,
-    const std::string &inputPath, const double &scaleFactor)
-{
-    for (auto &type : attrTypes)
-    {
-        auto attrPath = boost::replace_all_copy(inputPath, "input", type);
-        std::ifstream attrFile(attrPath);
-        if (!attrFile.good())
-        {
-            continue;
-        }
-        std::string attr;
-        std::getline(attrFile, attr);
-        attrFile.close();
-
-        Level level;
-        Direction direction;
-        double val = std::stod(attr) / scaleFactor;
-        if (type == "min" || type == "max")
-        {
-            level = Level::WARNING;
-        }
-        else
-        {
-            level = Level::CRITICAL;
-        }
-        if (type == "min" || type == "lcrit")
-        {
-            direction = Direction::LOW;
-        }
-        else
-        {
-            direction = Direction::HIGH;
-        }
-
-        if (DEBUG)
-        {
-            std::cout << "Threshold: " << attrPath << ": " << val << "\n";
-        }
-
-        thresholdVector.emplace_back(level, direction, val);
-    }
-    // no thresholds is allowed, not an error so return true always
-    return true;
-}
-
-bool hasCriticalInterface(
-    const std::vector<thresholds::Threshold> &thresholdVector)
-{
-    for (auto &threshold : thresholdVector)
-    {
-        if (threshold.level == Level::CRITICAL)
-        {
-            return true;
-        }
-    }
-    return false;
-}
-
-bool hasWarningInterface(
-    const std::vector<thresholds::Threshold> &thresholdVector)
-{
-    for (auto &threshold : thresholdVector)
-    {
-        if (threshold.level == Level::WARNING)
-        {
-            return true;
-        }
-    }
-    return false;
-}
-} // namespace thresholds
diff --git a/sensors/src/Utils.cpp b/sensors/src/Utils.cpp
deleted file mode 100644
index a5685d5..0000000
--- a/sensors/src/Utils.cpp
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
-// Copyright (c) 2017 Intel Corporation
-//
-// 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.
-*/
-
-#include <Utils.hpp>
-#include <boost/algorithm/string/predicate.hpp>
-#include <experimental/filesystem>
-#include <fstream>
-#include <regex>
-#include <sdbusplus/asio/connection.hpp>
-#include <sdbusplus/bus/match.hpp>
-
-namespace fs = std::experimental::filesystem;
-const static constexpr char* powerInterfaceName =
-    "xyz.openbmc_project.Chassis.Control.Power";
-const static constexpr char* powerObjectName =
-    "/xyz/openbmc_project/Chassis/Control/Power0";
-
-bool getSensorConfiguration(
-    const std::string& type,
-    const std::shared_ptr<sdbusplus::asio::connection>& dbusConnection,
-    ManagedObjectType& resp, bool useCache)
-{
-    static ManagedObjectType managedObj;
-
-    if (!useCache)
-    {
-        managedObj.clear();
-        sdbusplus::message::message getManagedObjects =
-            dbusConnection->new_method_call(
-                entityManagerName, "/", "org.freedesktop.DBus.ObjectManager",
-                "GetManagedObjects");
-        bool err = false;
-        try
-        {
-            sdbusplus::message::message reply =
-                dbusConnection->call(getManagedObjects);
-            reply.read(managedObj);
-        }
-        catch (const sdbusplus::exception::exception&)
-        {
-            err = true;
-        }
-
-        if (err)
-        {
-            std::cerr << "Error communicating to entity manager\n";
-            return false;
-        }
-    }
-    for (const auto& pathPair : managedObj)
-    {
-        std::vector<boost::container::flat_map<std::string, BasicVariantType>>
-            sensorData;
-        bool correctType = false;
-        for (const auto& entry : pathPair.second)
-        {
-            if (boost::starts_with(entry.first, type))
-            {
-                correctType = true;
-                break;
-            }
-        }
-        if (correctType)
-        {
-            resp.emplace(pathPair);
-        }
-    }
-    return true;
-}
-
-bool findFiles(const fs::path dirPath, const std::string& matchString,
-               std::vector<fs::path>& foundPaths, unsigned int symlinkDepth)
-{
-    if (!fs::exists(dirPath))
-        return false;
-
-    std::regex search(matchString);
-    std::smatch match;
-    for (auto& p : fs::recursive_directory_iterator(dirPath))
-    {
-        std::string path = p.path().string();
-        if (!is_directory(p))
-        {
-            if (std::regex_search(path, match, search))
-                foundPaths.emplace_back(p.path());
-        }
-        else if (is_symlink(p) && symlinkDepth)
-        {
-            findFiles(p.path(), matchString, foundPaths, symlinkDepth - 1);
-        }
-    }
-    return true;
-}
-
-// initially returns false, then sets up matches and returns status
-// should be called once first to initialize
-bool isPowerOn(const std::shared_ptr<sdbusplus::asio::connection>& conn)
-{
-    static std::unique_ptr<sdbusplus::bus::match::match> powerMatch = nullptr;
-    static bool powerStatusOn = false;
-
-    if (powerMatch != nullptr)
-    {
-        return powerStatusOn;
-    }
-
-    // create a match for powergood changes, first time do a method call to
-    // return the correct value
-    std::function<void(sdbusplus::message::message & message)> eventHandler =
-        [&powerStatusOn](sdbusplus::message::message& message) {
-            std::string objectName;
-            boost::container::flat_map<std::string,
-                                       sdbusplus::message::variant<int32_t>>
-                values;
-            message.read(objectName, values);
-            auto findPgood = values.find("pgood");
-            if (findPgood != values.end())
-            {
-                powerStatusOn = sdbusplus::message::variant_ns::get<int32_t>(
-                    findPgood->second);
-            }
-        };
-
-    powerMatch = std::make_unique<sdbusplus::bus::match::match>(
-        static_cast<sdbusplus::bus::bus&>(*conn),
-        "type='signal',interface='org.freedesktop.DBus.Properties',path_"
-        "namespace='/xyz/openbmc_project/Chassis/Control/"
-        "power0',arg0='xyz.openbmc_project.Chassis.Control.Power'",
-        eventHandler);
-
-    conn->async_method_call(
-        [&powerStatusOn](boost::system::error_code ec,
-                         const sdbusplus::message::variant<int32_t>& pgood) {
-            if (ec)
-            {
-                std::cerr << "Error getting initial power status\n";
-                return;
-            }
-            powerStatusOn = sdbusplus::message::variant_ns::get<int32_t>(pgood);
-        },
-        powerInterfaceName, powerObjectName, "org.freedesktop.DBus.Properties",
-        "Get", powerInterfaceName, "pgood");
-
-    return powerStatusOn;
-}
\ No newline at end of file
diff --git a/sensors/tests/test_HwmonTempSensor.cpp b/sensors/tests/test_HwmonTempSensor.cpp
deleted file mode 100644
index a618720..0000000
--- a/sensors/tests/test_HwmonTempSensor.cpp
+++ /dev/null
@@ -1,51 +0,0 @@
-#include <HwmonTempSensor.hpp>
-#include <dbus/connection.hpp>
-#include <nlohmann/json.hpp>
-#include <fstream>
-#include "gtest/gtest.h"
-
-TEST(HwmonTempSensor, TestTMP75)
-{
-    boost::asio::io_service io;
-    auto system_bus =
-        std::make_shared<dbus::connection>(io, dbus::bus::session);
-    dbus::DbusObjectServer object_server(system_bus);
-
-    std::vector<thresholds::Threshold> sensor_thresholds;
-    auto t = thresholds::Threshold(thresholds::Level::CRITICAL,
-                                   thresholds::Direction::LOW, 80);
-    sensor_thresholds.emplace_back(t);
-
-    std::ofstream test_file("test0.txt");
-    test_file << "28\n";
-    test_file.close();
-    auto filename = std::string("test0.txt");
-    auto tempsensname = std::string("test sensor");
-    HwmonTempSensor test(filename, object_server, io, tempsensname,
-                         std::move(sensor_thresholds));
-
-    std::remove("test0.txt");
-}
-
-TEST(HwmonTempSensor, TestTMP421)
-{
-    boost::asio::io_service io;
-    auto system_bus =
-        std::make_shared<dbus::connection>(io, dbus::bus::session);
-    dbus::DbusObjectServer object_server(system_bus);
-
-    std::vector<thresholds::Threshold> sensor_thresholds;
-    auto t = thresholds::Threshold(thresholds::Level::WARNING,
-                                   thresholds::Direction::HIGH, 80);
-    sensor_thresholds.emplace_back(t);
-
-    std::ofstream test_file("test1.txt");
-    test_file << "28\n";
-    test_file.close();
-    auto filename = std::string("test1.txt");
-    auto tempsensname = std::string("test sensor");
-    HwmonTempSensor test(filename, object_server, io, tempsensname,
-                         std::move(sensor_thresholds));
-
-    std::remove("test1.txt");
-}
diff --git a/sensors/tests/test_TachSensor.cpp b/sensors/tests/test_TachSensor.cpp
deleted file mode 100644
index 059b18b..0000000
--- a/sensors/tests/test_TachSensor.cpp
+++ /dev/null
@@ -1,28 +0,0 @@
-#include <TachSensor.hpp>
-#include <Thresholds.hpp>
-#include <dbus/connection.hpp>
-#include <nlohmann/json.hpp>
-#include <fstream>
-#include "gtest/gtest.h"
-
-TEST(TachSensor, TestTachSensor)
-{
-    boost::asio::io_service io;
-    auto system_bus =
-        std::make_shared<dbus::connection>(io, dbus::bus::session);
-    dbus::DbusObjectServer object_server(system_bus);
-
-    std::vector<thresholds::Threshold> sensor_thresholds;
-    auto t = thresholds::Threshold(thresholds::Level::CRITICAL,
-                                   thresholds::Direction::LOW, 1000);
-    sensor_thresholds.emplace_back(t);
-
-    std::ofstream test_file("test.txt");
-    test_file << "10000\n";
-    test_file.close();
-    auto filename = std::string("test.txt");
-    auto fanname = std::string("test fan");
-    TachSensor test(filename, object_server, system_bus, io, fanname,
-                    std::move(sensor_thresholds));
-    std::remove("test.txt");
-}
