diff --git a/src/sdeventplus/event.hpp b/src/sdeventplus/event.hpp
index b8ffb97..2a24161 100644
--- a/src/sdeventplus/event.hpp
+++ b/src/sdeventplus/event.hpp
@@ -9,34 +9,140 @@
 namespace sdeventplus
 {
 
+/** @class Event
+ *  @brief C++ Wrapper around sd_event objects
+ */
 class Event
 {
   public:
+    /** @brief Duration type used for specifying timeouts
+     */
     using Timeout = SdEventDuration;
     using MaybeTimeout = std::experimental::optional<Timeout>;
 
+    /** @brief Constructs a new event from sd_event
+     *         Takes a reference on the passed in sd_event
+     *
+     *  @param[in] event   - The sd_event to wrap
+     *  @param[in] sdevent - Optional underlying sd_event implementation
+     *  @throws SdEventError for underlying sd_event errors
+     */
     Event(sd_event* event,
           const internal::SdEvent* sdevent = &internal::sdevent_impl);
+
+    /** @brief Constructs a new event from sd_event
+     *         Does not take a reference on the passed in sd_event
+     *         NOTE: This will still take a reference during future copies
+     *         Useful for first creation of an sd_event
+     *
+     *  @param[in] event   - The sd_event to wrap
+     *  @param[in]         - Denotes no reference taken during construction
+     *  @param[in] sdevent - Optional underlying sd_event implementation
+     *  @throws SdEventError for underlying sd_event errors
+     */
     Event(sd_event* event, std::false_type,
           const internal::SdEvent* sdevent = &internal::sdevent_impl);
 
+    /** @brief Create a wrapped event around sd_event_new()
+     *
+     *  @param[in] sdevent - Optional underlying sd_event implementation
+     *  @throws SdEventError for underlying sd_event errors
+     *  @return A new Event
+     */
     static Event
         get_new(const internal::SdEvent* sdevent = &internal::sdevent_impl);
+
+    /** @brief Create a wrapped event around sd_event_default()
+     *
+     *  @param[in] sdevent - Optional underlying sd_event implementation
+     *  @throws SdEventError for underlying sd_event errors
+     *  @return A new default Event
+     */
     static Event
         get_default(const internal::SdEvent* sdevent = &internal::sdevent_impl);
 
+    /** @brief Get the underlying sd_event
+     *
+     *  @return The sd_event
+     */
     sd_event* get() const;
+
+    /** @brief Get the sd_event interface in use
+     *
+     *  @return The sd_event interface
+     */
     const internal::SdEvent* getSdEvent() const;
 
+    /** @brief Check for pending events and arm timers
+     *
+     * @throws SdEventError for underlying sd_event errors
+     * @return Positive value if events are pending, 0 otherwise
+     */
     int prepare() const;
-    int wait(MaybeTimeout timeout) const;
-    int dispatch() const;
-    int run(MaybeTimeout timeout) const;
-    int loop() const;
-    int exit(int code) const;
 
+    /** @brief Waits for new events to process
+     *
+     * @param[in] timeout - nullopt for no timeout or a finite timeout
+     * @throws SdEventError for underlying sd_event errors
+     * @return Positive value if events are pending, 0 otherwise
+     *         Only returns 0 a finite timeout is reached
+     */
+    int wait(MaybeTimeout timeout) const;
+
+    /** @brief Executes the highest priority event
+     *
+     * @throws SdEventError for underlying sd_event errors
+     * @return Positive value if the event loop should continue
+     *         0 value if the event loop should exit
+     */
+    int dispatch() const;
+
+    /** @brief Runs a single iteration of the event loop
+     *
+     * @param[in] timeout - nullopt for no timeout or a finite timeout
+     * @throws SdEventError for underlying sd_event errors
+     * @return Positive value if an event was dispatched
+     *         Only returns 0 a finite timeout is reached
+     */
+    int run(MaybeTimeout timeout) const;
+
+    /** @brief Run the event loop to completion
+     *
+     * @throws SdEventError for underlying sd_event errors
+     * @return Exit status of the event loop from exit()
+     */
+    int loop() const;
+
+    /** @brief Sets the exit code for the loop and notifies
+     *         the event loop it should terminate
+     *
+     * @param[in] code - The exit code
+     * @throws SdEventError for underlying sd_event errors
+     */
+    void exit(int code) const;
+
+    /** @brief Gets the exit code for the event loop
+     *
+     * @throws SdEventError for underlying sd_event errors
+     * @return The exit code specified by a previous exit()
+     */
     int get_exit_code() const;
+
+    /** @brief Get the status of the event loop watchdog
+     *
+     * @throws SdEventError for underlying sd_event errors
+     * @return 'true' if the watchdog is supported and enabled
+     *         'false' otherwise
+     */
     int get_watchdog() const;
+
+    /** @brief Sets the state of the event loop watchdog
+     *
+     * @param[in] b - Should the event loop attempt to enable the watchdog
+     * @throws SdEventError for underlying sd_event errors
+     * @return 'true' if the watchdog is supported and enabled
+     *         'false' otherwise
+     */
     int set_watchdog(int b) const;
 
   private:
