diff --git a/src/monitor.hpp b/src/monitor.hpp
index 5256582..63afebe 100644
--- a/src/monitor.hpp
+++ b/src/monitor.hpp
@@ -11,6 +11,12 @@
 namespace monitoring
 {
 
+/**
+ * @class Monitor
+ * @brief OpenBMC DBus Monitoring application
+ * @details A configurable application to perform a set of actions based on one
+ * or more conditions for items within a group
+ */
 class Monitor
 {
     public:
@@ -21,15 +27,33 @@
         Monitor& operator=(Monitor&&) = default;
         ~Monitor() = default;
 
+        /**
+         * @brief Constructs monitor object
+         *
+         * @param[in] bus - Dbus bus object
+         */
         explicit Monitor(sdbusplus::bus::bus& bus);
 
+        /**
+         * @brief Process events triggered by the application starting
+         */
         void processStart() noexcept;
 
+        /**
+         * @brief Handle an event being processed
+         *
+         * @param[in] msg - Dbus msg
+         * @param[in] event - Event to be handled
+         * @param[in] eventDef - The event's full definition
+         */
         void handleEvent(sdbusplus::message::message& msg,
                          const Event& event,
                          const std::tuple<std::vector<std::shared_ptr<Event>>,
                                     std::vector<Action>>& eventDef);
 
+        /**
+         * @brief An event's set of arguments
+         */
         using eventArg = std::tuple<Monitor*,
                                     const SignalEvent*,
                                     const std::tuple<
@@ -37,16 +61,26 @@
                                         std::vector<Action>>*>;
 
     private:
+        /** @brief Connection for sdbusplus bus */
         sdbusplus::bus::bus& bus;
-
+        /** @brief List of events to process */
         static const std::vector<
             std::tuple<std::vector<std::shared_ptr<Event>>,
                        std::vector<Action>>> events;
-
+        /** @brief List of event arguments */
         std::vector<std::unique_ptr<eventArg>> eventArgs;
-
+        /** @brief list of Dbus matches for callbacks */
         std::vector<sdbusplus::server::match::match> matches;
 
+        /**
+         * @brief Handle an event signal
+         *
+         * @param[in] msg - Data associated with the subscribed signal
+         * @param[in] data - Pointer to the event items's data
+         * @param[in] err - Contains any sdbus error reference if occurred
+         *
+         * @return 0
+         */
         static int handleSignal(sd_bus_message* msg,
                                 void* data,
                                 sd_bus_error* err);
