diff --git a/manager.hpp b/manager.hpp
index 60b3d75..55d6f5c 100644
--- a/manager.hpp
+++ b/manager.hpp
@@ -16,7 +16,6 @@
 namespace logging
 {
 
-
 /**
  * @class Manager
  *
@@ -28,120 +27,115 @@
  */
 class Manager
 {
-    public:
+  public:
+    Manager() = delete;
+    ~Manager() = default;
+    Manager(const Manager&) = delete;
+    Manager& operator=(const Manager&) = delete;
+    Manager(Manager&&) = delete;
+    Manager& operator=(Manager&&) = delete;
 
-        Manager() = delete;
-        ~Manager() = default;
-        Manager(const Manager&) = delete;
-        Manager& operator=(const Manager&) = delete;
-        Manager(Manager&&) = delete;
-        Manager& operator=(Manager&&) = delete;
+    /**
+     * Constructor
+     *
+     * @param[in] bus - the D-Bus bus object
+     */
+    explicit Manager(sdbusplus::bus::bus& bus);
 
-        /**
-         * Constructor
-         *
-         * @param[in] bus - the D-Bus bus object
-         */
-        explicit Manager(sdbusplus::bus::bus& bus);
+  private:
+    /**
+     * The callback for an interfaces added signal
+     *
+     * Creates the IBM interfaces for the log entry
+     * that was just created.
+     *
+     * @param[in] msg - the sdbusplus message
+     */
+    void interfaceAdded(sdbusplus::message::message& msg);
 
-    private:
+    /**
+     * The callback for an interfaces removed signal
+     *
+     * Removes the IBM interfaces for the log entry
+     * that was just removed.
+     *
+     * @param[in] msg - the sdbusplus message
+     */
+    void interfaceRemoved(sdbusplus::message::message& msg);
 
-        /**
-         * The callback for an interfaces added signal
-         *
-         * Creates the IBM interfaces for the log entry
-         * that was just created.
-         *
-         * @param[in] msg - the sdbusplus message
-         */
-        void interfaceAdded(sdbusplus::message::message& msg);
+    /**
+     * Creates the IBM interfaces for all existing error log
+     * entries.
+     */
+    void createAll();
 
-        /**
-         * The callback for an interfaces removed signal
-         *
-         * Removes the IBM interfaces for the log entry
-         * that was just removed.
-         *
-         * @param[in] msg - the sdbusplus message
-         */
-        void interfaceRemoved(sdbusplus::message::message& msg);
-
-        /**
-         * Creates the IBM interfaces for all existing error log
-         * entries.
-         */
-        void createAll();
-
-        /**
-         * Creates the IBM interface(s) for a single error log.
-         *
-         * @param[in] objectPath - object path of the error log
-         * @param[in] properties - the xyz.openbmc_project.Logging.Entry
-         *                         properties
-         */
-        void create(
-                const std::string& objectPath,
+    /**
+     * Creates the IBM interface(s) for a single error log.
+     *
+     * @param[in] objectPath - object path of the error log
+     * @param[in] properties - the xyz.openbmc_project.Logging.Entry
+     *                         properties
+     */
+    void create(const std::string& objectPath,
                 const DbusPropertyMap& properties);
 
-        /**
-         * Creates the IBM policy interface for a single error log
-         * and saves it in the list of interfaces.
-         *
-         * @param[in] objectPath - object path of the error log
-         * @param[in] properties - the xyz.openbmc_project.Logging.Entry
-         *                         properties
-         */
+    /**
+     * Creates the IBM policy interface for a single error log
+     * and saves it in the list of interfaces.
+     *
+     * @param[in] objectPath - object path of the error log
+     * @param[in] properties - the xyz.openbmc_project.Logging.Entry
+     *                         properties
+     */
 #ifdef USE_POLICY_INTERFACE
-        void createPolicyInterface(
-                const std::string& objectPath,
-                const DbusPropertyMap& properties);
+    void createPolicyInterface(const std::string& objectPath,
+                               const DbusPropertyMap& properties);
 #endif
 
-        /**
-         * Returns the entry ID for a log
-         *
-         * @param[in] objectPath - the object path of the log
-         *
-         * @return uint32_t - the ID
-         */
-        inline uint32_t getEntryID(const std::string& objectPath)
-        {
-            std::experimental::filesystem::path path(objectPath);
-            return std::stoul(path.filename());
-        }
+    /**
+     * Returns the entry ID for a log
+     *
+     * @param[in] objectPath - the object path of the log
+     *
+     * @return uint32_t - the ID
+     */
+    inline uint32_t getEntryID(const std::string& objectPath)
+    {
+        std::experimental::filesystem::path path(objectPath);
+        return std::stoul(path.filename());
+    }
 
-        /**
-         * The sdbusplus bus object
-         */
-        sdbusplus::bus::bus& bus;
+    /**
+     * The sdbusplus bus object
+     */
+    sdbusplus::bus::bus& bus;
 
-        /**
-         * The match object for interfacesAdded
-         */
-        sdbusplus::bus::match_t addMatch;
+    /**
+     * The match object for interfacesAdded
+     */
+    sdbusplus::bus::match_t addMatch;
 
-        /**
-         * The match object for interfacesRemoved
-         */
-        sdbusplus::bus::match_t removeMatch;
+    /**
+     * The match object for interfacesRemoved
+     */
+    sdbusplus::bus::match_t removeMatch;
 
-        using EntryID = uint32_t;
-        using InterfaceMap = std::map<InterfaceType, std::experimental::any>;
-        using EntryMap = std::map<EntryID, InterfaceMap>;
+    using EntryID = uint32_t;
+    using InterfaceMap = std::map<InterfaceType, std::experimental::any>;
+    using EntryMap = std::map<EntryID, InterfaceMap>;
 
-        /**
-         * A map of the error log IDs to their IBM interface objects.
-         * There may be multiple interfaces per ID.
-         */
-        EntryMap entries;
+    /**
+     * A map of the error log IDs to their IBM interface objects.
+     * There may be multiple interfaces per ID.
+     */
+    EntryMap entries;
 
 #ifdef USE_POLICY_INTERFACE
-        /**
-         * The class the wraps the IBM error logging policy table.
-         */
-        policy::Table policies;
+    /**
+     * The class the wraps the IBM error logging policy table.
+     */
+    policy::Table policies;
 #endif
 };
-
 }
 }
