diff --git a/sensordatahandler.hpp b/sensordatahandler.hpp
new file mode 100644
index 0000000..fa74235
--- /dev/null
+++ b/sensordatahandler.hpp
@@ -0,0 +1,150 @@
+#include "types.hpp"
+#include "host-ipmid/ipmid-api.h"
+
+namespace ipmi
+{
+namespace sensor
+{
+
+using Assertion = uint16_t;
+using Deassertion = uint16_t;
+using AssertionSet = std::pair<Assertion, Deassertion>;
+
+using Service = std::string;
+using Path = std::string;
+using Interface = std::string;
+
+using ServicePath = std::pair<Path, Service>;
+
+using Interfaces = std::vector<Interface>;
+
+using MapperResponseType = std::map<Path, std::map<Service, Interfaces>>;
+
+/** @brief get the D-Bus service and service path
+ *  @param[in] bus - The Dbus bus object
+ *  @param[in] interface - interface to the service
+ *  @param[in] path - interested path in the list of objects
+ *  @return pair of service path and service
+ */
+ServicePath getServiceAndPath(sdbusplus::bus::bus& bus,
+                              const std::string& interface,
+                              const std::string& path = std::string());
+
+/** @brief Make assertion set from input data
+ *  @param[in] cmdData - Input sensor data
+ *  @return pair of assertion and deassertion set
+ */
+AssertionSet getAssertionSet(const SetSensorReadingReq& cmdData);
+
+/** @brief send the message to DBus
+ *  @param[in] msg - message to send
+ *  @return failure status in IPMI error code
+ */
+ipmi_ret_t updateToDbus(const IpmiUpdateData& msg);
+
+namespace set
+{
+
+/** @brief Make a DBus message for a Dbus call
+ *  @param[in] updateInterface - Interface name
+ *  @param[in] sensorPath - Path of the sensor
+ *  @param[in] command - command to be executed
+ *  @param[in] sensorInterface - DBus interface of sensor
+ *  @return a dbus message
+ */
+IpmiUpdateData makeDbusMsg(const std::string& updateInterface,
+                           const std::string& sensorPath,
+                           const std::string& command,
+                           const std::string& sensorInterface);
+
+/** @brief Create a message for IPMI assertion
+ *  @param[in] msg - Message to add the values
+ *  @param[in] interface - sensor interface
+ *  @param[in] sensorPath - Path of the sensor
+ *  @param[in] cmdData - input sensor data
+ *  @return a IPMI error code
+ */
+ipmi_ret_t appendAssertion(IpmiUpdateData& msg,
+                           const DbusInterfaceMap& interfaceMap,
+                           const std::string& sensorPath,
+                           const SetSensorReadingReq& cmdData);
+
+/** @brief Create a message for discrete signal
+ *  @param[in] msg - Message to add the values
+ *  @param[in] interface - sensor interface
+ *  @param[in] data - input discrete sensor data
+ *  @return a IPMI error code
+ */
+ipmi_ret_t appendDiscreteSignalData(IpmiUpdateData& msg,
+                                    const DbusInterfaceMap& interfaceMap,
+                                    uint8_t data);
+
+/** @brief Create a message for reading data
+ *  @param[in] msg - Message to add the values
+ *  @param[in] interface - sensor interface
+ *  @param[in] data - input sensor data
+ *  @return a IPMI error code
+ */
+ipmi_ret_t appendReadingData(IpmiUpdateData& msg,
+                             const DbusInterfaceMap& interfaceMap,
+                             const Value& data);
+
+}//namespace set
+
+namespace notify
+{
+
+/** @brief Make a DBus message for a Dbus call
+ *  @param[in] updateInterface - Interface name
+ *  @param[in] sensorPath - Path of the sensor
+ *  @param[in] command - command to be executed
+ *  @param[in] sensorInterface - DBus interface of sensor
+ *  @return a dbus message
+ */
+IpmiUpdateData makeDbusMsg(const std::string& updateInterface,
+                           const std::string& sensorPath,
+                           const std::string& command,
+                           const std::string& sensorInterface);
+
+/** @brief Create a message for IPMI discrete signal
+ *  @param[in] msg - Message to add the values
+ *  @param[in] interfaceMap - sensor interface
+ *  @param[in] sensorPath - Path of the sensor
+ *  @param[in] cmdData - input sensor data
+ *  @return a IPMI error code
+ */
+inline ipmi_ret_t appendDiscreteSignalData(IpmiUpdateData& msg,
+        const DbusInterfaceMap& interfaceMap,
+        uint8_t data)
+{
+    return IPMI_CC_OK;
+}
+
+/** @brief Create a message for reading data
+ *  @param[in] msg - Message to add the values
+ *  @param[in] interfaceMap - sensor interface
+ *  @param[in] data - input sensor data
+ *  @return a IPMI error code
+ */
+inline ipmi_ret_t appendReadingData(IpmiUpdateData& msg,
+                                    const DbusInterfaceMap& interfaceMap,
+                                    const Value &data)
+{
+    return IPMI_CC_OK;
+}
+
+/** @brief Create a message for IPMI asserting
+ *  @param[in] msg - Message to add the values
+ *  @param[in] interfaceMap - sensor interface
+ *  @param[in] sensorPath - Path of the sensor
+ *  @param[in] cmdData - input sensor data
+ *  @return a IPMI error code
+ */
+ipmi_ret_t appendAssertion(IpmiUpdateData& msg,
+                           const DbusInterfaceMap& interfaceMap,
+                           const std::string& sensorPath,
+                           const SetSensorReadingReq& cmdData);
+
+}//namespace notify
+}//namespace sensor
+}//namespace ipmi
