diff --git a/extensions/openpower-pels/pel_entry.hpp b/extensions/openpower-pels/pel_entry.hpp
index 7decb42..5b36d29 100644
--- a/extensions/openpower-pels/pel_entry.hpp
+++ b/extensions/openpower-pels/pel_entry.hpp
@@ -1,68 +1,68 @@
-#pragma once
-
-#include "manager.hpp"
-namespace openpower
-{
-namespace pels
-{
-
-using PELEntryIface = sdbusplus::org::open_power::Logging::PEL::server::Entry;
-using PropertiesVariant = PELEntryIface::PropertiesVariant;
-
-class PELEntry : public PELEntryIface
-{
-
-  public:
-    PELEntry() = delete;
-    PELEntry(const PELEntry&) = delete;
-    PELEntry& operator=(const PELEntry&) = delete;
-    PELEntry(PELEntry&&) = delete;
-    PELEntry& operator=(PELEntry&&) = delete;
-    virtual ~PELEntry() = default;
-
-    /** @brief Constructor to put an object onto the bus at a dbus path.
-     *  @param[in] bus - Bus to attach to.
-     *  @param[in] path - Path to attach at.
-     *  @param[in] prop - Default property values to be set when this interface
-     * is added to the bus.
-     *  @param[in] id - obmc id for this instance.
-     *  @param[in] repo - Repository pointer to lookup PEL to set appropriate
-     * attributes.
-     */
-
-    PELEntry(sdbusplus::bus::bus& bus, const std::string& path,
-             const std::map<std::string, PropertiesVariant>& prop, uint32_t id,
-             Repository* repo) :
-        PELEntryIface(bus, path.c_str(), prop),
-        _obmcId(id), _repo(repo)
-    {
-    }
-
-    /** @brief Update managementSystemAck flag.
-     *  @param[in] value - A true value says HMC acknowledged the PEL.
-     *  @returns New property value
-     */
-    bool managementSystemAck(bool value) override;
-
-    /**
-     * @brief Returns OpenBMC event log ID associated with this interface.
-     */
-    uint32_t getMyId(void) const
-    {
-        return _obmcId;
-    }
-
-  private:
-    /**
-     * @brief Corresponding OpenBMC event log id of this interface.
-     */
-    uint32_t _obmcId;
-
-    /**
-     * @brief Repository pointer to look for updating PEL fields.
-     */
-    Repository* _repo;
-};
-
-} // namespace pels
+#pragma once
+
+#include "manager.hpp"
+namespace openpower
+{
+namespace pels
+{
+
+using PELEntryIface = sdbusplus::org::open_power::Logging::PEL::server::Entry;
+using PropertiesVariant = PELEntryIface::PropertiesVariant;
+
+class PELEntry : public PELEntryIface
+{
+
+  public:
+    PELEntry() = delete;
+    PELEntry(const PELEntry&) = delete;
+    PELEntry& operator=(const PELEntry&) = delete;
+    PELEntry(PELEntry&&) = delete;
+    PELEntry& operator=(PELEntry&&) = delete;
+    virtual ~PELEntry() = default;
+
+    /** @brief Constructor to put an object onto the bus at a dbus path.
+     *  @param[in] bus - Bus to attach to.
+     *  @param[in] path - Path to attach at.
+     *  @param[in] prop - Default property values to be set when this interface
+     * is added to the bus.
+     *  @param[in] id - obmc id for this instance.
+     *  @param[in] repo - Repository pointer to lookup PEL to set appropriate
+     * attributes.
+     */
+
+    PELEntry(sdbusplus::bus::bus& bus, const std::string& path,
+             const std::map<std::string, PropertiesVariant>& prop, uint32_t id,
+             Repository* repo) :
+        PELEntryIface(bus, path.c_str(), prop),
+        _obmcId(id), _repo(repo)
+    {
+    }
+
+    /** @brief Update managementSystemAck flag.
+     *  @param[in] value - A true value says HMC acknowledged the PEL.
+     *  @returns New property value
+     */
+    bool managementSystemAck(bool value) override;
+
+    /**
+     * @brief Returns OpenBMC event log ID associated with this interface.
+     */
+    uint32_t getMyId(void) const
+    {
+        return _obmcId;
+    }
+
+  private:
+    /**
+     * @brief Corresponding OpenBMC event log id of this interface.
+     */
+    uint32_t _obmcId;
+
+    /**
+     * @brief Repository pointer to look for updating PEL fields.
+     */
+    Repository* _repo;
+};
+
+} // namespace pels
 } // namespace openpower
\ No newline at end of file
