diff --git a/extensions/openpower-pels/pel_entry.cpp b/extensions/openpower-pels/pel_entry.cpp
index 403befd..7fc9f72 100644
--- a/extensions/openpower-pels/pel_entry.cpp
+++ b/extensions/openpower-pels/pel_entry.cpp
@@ -1,39 +1,39 @@
-#include "pel_entry.hpp"
-
-#include <iostream>
-#include <xyz/openbmc_project/Common/error.hpp>
-
-namespace openpower
-{
-namespace pels
-{
-
-namespace common_error = sdbusplus::xyz::openbmc_project::Common::Error;
-
-bool PELEntry::managementSystemAck(bool value)
-{
-    auto current = sdbusplus::org::open_power::Logging::PEL::server::Entry::
-        managementSystemAck();
-    if (value != current)
-    {
-        current = sdbusplus::org::open_power::Logging::PEL::server::Entry::
-            managementSystemAck(value);
-
-        Repository::LogID id{Repository::LogID::Obmc(getMyId())};
-        if (auto logId = _repo->getLogID(id); logId.has_value())
-        {
-            // Update HMC acknowledge bit in PEL
-            _repo->setPELHMCTransState(
-                logId->pelID.id,
-                (value ? TransmissionState::acked : TransmissionState::newPEL));
-        }
-        else
-        {
-            throw common_error::InvalidArgument();
-        }
-    }
-    return current;
-}
-
-} // namespace pels
-} // namespace openpower
+#include "pel_entry.hpp"
+
+#include <iostream>
+#include <xyz/openbmc_project/Common/error.hpp>
+
+namespace openpower
+{
+namespace pels
+{
+
+namespace common_error = sdbusplus::xyz::openbmc_project::Common::Error;
+
+bool PELEntry::managementSystemAck(bool value)
+{
+    auto current = sdbusplus::org::open_power::Logging::PEL::server::Entry::
+        managementSystemAck();
+    if (value != current)
+    {
+        current = sdbusplus::org::open_power::Logging::PEL::server::Entry::
+            managementSystemAck(value);
+
+        Repository::LogID id{Repository::LogID::Obmc(getMyId())};
+        if (auto logId = _repo->getLogID(id); logId.has_value())
+        {
+            // Update HMC acknowledge bit in PEL
+            _repo->setPELHMCTransState(
+                logId->pelID.id,
+                (value ? TransmissionState::acked : TransmissionState::newPEL));
+        }
+        else
+        {
+            throw common_error::InvalidArgument();
+        }
+    }
+    return current;
+}
+
+} // namespace pels
+} // namespace openpower
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
