diff --git a/inc/post_code.hpp b/inc/post_code.hpp
index f146008..26b5c48 100644
--- a/inc/post_code.hpp
+++ b/inc/post_code.hpp
@@ -65,8 +65,8 @@
 {
     PostCode(sdbusplus::bus_t& bus, const char* path, EventPtr& event,
              int nodeIndex) :
-        sdbusplus::server::object_t<post_code, delete_all>(bus, path),
-        bus(bus), event(event), node(nodeIndex),
+        sdbusplus::server::object_t<post_code, delete_all>(bus, path), bus(bus),
+        event(event), node(nodeIndex),
         postCodeListPath(PostCodeListPathPrefix + std::to_string(node)),
         propertiesChangedSignalRaw(
             bus,
@@ -74,47 +74,49 @@
                 PostCodePath + std::to_string(node),
                 "xyz.openbmc_project.State.Boot.Raw"),
             [this](sdbusplus::message_t& msg) {
-        std::string intfName;
-        std::map<std::string, std::variant<postcode_t>> msgData;
-        msg.read(intfName, msgData);
-        // Check if it was the Value property that changed.
-        auto valPropMap = msgData.find("Value");
-        if (valPropMap != msgData.end())
-        {
-            this->savePostCodes(std::get<postcode_t>(valPropMap->second));
-        }
-    }),
+                std::string intfName;
+                std::map<std::string, std::variant<postcode_t>> msgData;
+                msg.read(intfName, msgData);
+                // Check if it was the Value property that changed.
+                auto valPropMap = msgData.find("Value");
+                if (valPropMap != msgData.end())
+                {
+                    this->savePostCodes(
+                        std::get<postcode_t>(valPropMap->second));
+                }
+            }),
         propertiesChangedSignalCurrentHostState(
             bus,
             sdbusplus::bus::match::rules::propertiesChanged(
                 HostStatePathPrefix + std::to_string(node),
                 "xyz.openbmc_project.State.Host"),
             [this](sdbusplus::message_t& msg) {
-        std::string intfName;
-        std::map<std::string, std::variant<std::string>> msgData;
-        msg.read(intfName, msgData);
-        // Check if it was the Value property that changed.
-        auto valPropMap = msgData.find("CurrentHostState");
-        if (valPropMap != msgData.end())
-        {
-            StateServer::Host::HostState currentHostState =
-                StateServer::Host::convertHostStateFromString(
-                    std::get<std::string>(valPropMap->second));
-            if (currentHostState == StateServer::Host::HostState::Off)
-            {
-                if (this->postCodes.empty())
+                std::string intfName;
+                std::map<std::string, std::variant<std::string>> msgData;
+                msg.read(intfName, msgData);
+                // Check if it was the Value property that changed.
+                auto valPropMap = msgData.find("CurrentHostState");
+                if (valPropMap != msgData.end())
                 {
-                    std::cerr << "HostState changed to OFF. Empty "
-                                 "postcode log, keep boot cycle at "
-                              << this->currentBootCycleIndex << std::endl;
+                    StateServer::Host::HostState currentHostState =
+                        StateServer::Host::convertHostStateFromString(
+                            std::get<std::string>(valPropMap->second));
+                    if (currentHostState == StateServer::Host::HostState::Off)
+                    {
+                        if (this->postCodes.empty())
+                        {
+                            std::cerr
+                                << "HostState changed to OFF. Empty "
+                                   "postcode log, keep boot cycle at "
+                                << this->currentBootCycleIndex << std::endl;
+                        }
+                        else
+                        {
+                            this->postCodes.clear();
+                        }
+                    }
                 }
-                else
-                {
-                    this->postCodes.clear();
-                }
-            }
-        }
-    })
+            })
     {
         phosphor::logging::log<phosphor::logging::level::INFO>(
             "PostCode is created");
