diff --git a/.clang-format b/.clang-format
index 945adae..d92a3f1 100644
--- a/.clang-format
+++ b/.clang-format
@@ -6,12 +6,14 @@
 AlignConsecutiveAssignments: false
 AlignConsecutiveDeclarations: false
 AlignEscapedNewlines: Right
-AlignOperands:   true
-AlignTrailingComments: true
+AlignOperands:  Align
+AlignTrailingComments:
+  Kind: Always
+  OverEmptyLines: 1
 AllowAllParametersOfDeclarationOnNextLine: true
-AllowShortBlocksOnASingleLine: false
+AllowShortBlocksOnASingleLine: Empty
 AllowShortCaseLabelsOnASingleLine: false
-AllowShortFunctionsOnASingleLine: None
+AllowShortFunctionsOnASingleLine: Empty
 AllowShortIfStatementsOnASingleLine: false
 AllowShortLoopsOnASingleLine: false
 AlwaysBreakAfterReturnType: None
@@ -36,6 +38,7 @@
   SplitEmptyFunction:   false
   SplitEmptyRecord:     false
   SplitEmptyNamespace:  false
+BreakAfterAttributes: Never
 BreakBeforeBinaryOperators: None
 BreakBeforeBraces: Custom
 BreakBeforeTernaryOperators: true
@@ -75,9 +78,13 @@
   - Regex:           '.*'
     Priority:        6
 IndentCaseLabels: true
+IndentRequiresClause: true
 IndentWidth:     4
 IndentWrappedFunctionNames: true
-KeepEmptyLinesAtTheStartOfBlocks: true
+InsertNewlineAtEOF: true
+KeepEmptyLinesAtTheStartOfBlocks: false
+LambdaBodyIndentation: OuterScope
+LineEnding: LF
 MacroBlockBegin: ''
 MacroBlockEnd:   ''
 MaxEmptyLinesToKeep: 1
@@ -85,13 +92,19 @@
 ObjCBlockIndentWidth: 2
 ObjCSpaceAfterProperty: false
 ObjCSpaceBeforeProtocolList: true
+PenaltyBreakAssignment: 25
 PenaltyBreakBeforeFirstCallParameter: 19
 PenaltyBreakComment: 300
 PenaltyBreakFirstLessLess: 120
 PenaltyBreakString: 1000
 PenaltyExcessCharacter: 1000000
 PenaltyReturnTypeOnItsOwnLine: 60
+PenaltyIndentedWhitespace: 0
+QualifierAlignment: Left
+ReferenceAlignment: Left
 ReflowComments:  true
+RequiresClausePosition: OwnLine
+RequiresExpressionIndentation: Keyword
 SortIncludes:    true
 SortUsingDeclarations: true
 SpaceAfterCStyleCast: false
@@ -111,7 +124,6 @@
 SpacesInSquareBrackets: false
 Standard:        Latest
 TabWidth:        4
-UseCRLF: false
 UseTab:          Never
 ...
 
diff --git a/src/main.cpp b/src/main.cpp
index d04ea99..42a4246 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -89,8 +89,8 @@
         auto instancePos = fullUnitName.rfind("@");
         if (instancePos != std::string::npos)
         {
-            instanceName =
-                fullUnitName.substr(instancePos + 1, typePos - instancePos - 1);
+            instanceName = fullUnitName.substr(instancePos + 1,
+                                               typePos - instancePos - 1);
             unitName = fullUnitName.substr(0, instancePos);
         }
         else
@@ -120,8 +120,8 @@
 
         const auto& fullUnitName =
             std::get<static_cast<int>(ListUnitElements::name)>(unit);
-        auto [unitName, type, instanceName] =
-            getUnitNameTypeAndInstance(fullUnitName);
+        auto [unitName, type,
+              instanceName] = getUnitNameTypeAndInstance(fullUnitName);
         if (managedServices.count(unitName))
         {
             // For socket-activated units, ignore all its instances
@@ -261,13 +261,13 @@
     conn->async_method_call(
         [&server, &conn](boost::system::error_code ec,
                          const std::vector<ListUnitsType>& listUnits) {
-            if (ec)
-            {
-                lg2::error("async_method_call error: ListUnits failed: {EC}",
-                           "EC", ec.value());
-                return;
-            }
-            handleListUnitsResponse(server, conn, ec, listUnits);
+        if (ec)
+        {
+            lg2::error("async_method_call error: ListUnits failed: {EC}", "EC",
+                       ec.value());
+            return;
+        }
+        handleListUnitsResponse(server, conn, ec, listUnits);
         },
         sysdService, sysdObjPath, sysdMgrIntf, "ListUnits");
 }
@@ -279,45 +279,45 @@
     conn->async_method_call(
         [&server, &conn](boost::system::error_code ec,
                          const std::variant<uint64_t>& value) {
-            if (ec)
+        if (ec)
+        {
+            lg2::error("async_method_call error: ListUnits failed: {EC}", "EC",
+                       ec.value());
+            return;
+        }
+        if (std::get<uint64_t>(value))
+        {
+            if (!unitQueryStarted)
             {
-                lg2::error("async_method_call error: ListUnits failed: {EC}",
-                           "EC", ec.value());
-                return;
+                unitQueryStarted = true;
+                init(server, conn);
             }
-            if (std::get<uint64_t>(value))
-            {
-                if (!unitQueryStarted)
+        }
+        else
+        {
+            // FIX-ME: Latest up-stream sync caused issue in receiving
+            // StartupFinished signal. Unable to get StartupFinished signal
+            // from systemd1 hence using poll method too, to trigger it
+            // properly.
+            constexpr size_t pollTimeout = 10; // seconds
+            initTimer->expires_after(std::chrono::seconds(pollTimeout));
+            initTimer->async_wait(
+                [&server, &conn](const boost::system::error_code& ec) {
+                if (ec == boost::asio::error::operation_aborted)
                 {
-                    unitQueryStarted = true;
-                    init(server, conn);
+                    // Timer reset.
+                    return;
                 }
-            }
-            else
-            {
-                // FIX-ME: Latest up-stream sync caused issue in receiving
-                // StartupFinished signal. Unable to get StartupFinished signal
-                // from systemd1 hence using poll method too, to trigger it
-                // properly.
-                constexpr size_t pollTimeout = 10; // seconds
-                initTimer->expires_after(std::chrono::seconds(pollTimeout));
-                initTimer->async_wait([&server, &conn](
-                                          const boost::system::error_code& ec) {
-                    if (ec == boost::asio::error::operation_aborted)
-                    {
-                        // Timer reset.
-                        return;
-                    }
-                    if (ec)
-                    {
-                        lg2::error(
-                            "service config mgr - init - async wait error: {EC}",
-                            "EC", ec.value());
-                        return;
-                    }
-                    checkAndInit(server, conn);
-                });
-            }
+                if (ec)
+                {
+                    lg2::error(
+                        "service config mgr - init - async wait error: {EC}",
+                        "EC", ec.value());
+                    return;
+                }
+                checkAndInit(server, conn);
+            });
+        }
         },
         sysdService, sysdObjPath, dBusPropIntf, dBusGetMethod, sysdMgrIntf,
         "FinishTimestamp");
@@ -339,11 +339,11 @@
         "member='StartupFinished',path='/org/freedesktop/systemd1',"
         "interface='org.freedesktop.systemd1.Manager'",
         [&server, &conn](sdbusplus::message_t& /*msg*/) {
-            if (!unitQueryStarted)
-            {
-                unitQueryStarted = true;
-                init(server, conn);
-            }
+        if (!unitQueryStarted)
+        {
+            unitQueryStarted = true;
+            init(server, conn);
+        }
         });
     // this will make sure to initialize the objects, when daemon is
     // restarted.
diff --git a/src/srvcfg_manager.cpp b/src/srvcfg_manager.cpp
index cbe1afc..47c70a7 100644
--- a/src/srvcfg_manager.cpp
+++ b/src/srvcfg_manager.cpp
@@ -224,8 +224,8 @@
 
 void ServiceConfig::queryAndUpdateProperties()
 {
-    std::string objectPath =
-        isSocketActivatedService ? socketObjectPath : serviceObjectPath;
+    std::string objectPath = isSocketActivatedService ? socketObjectPath
+                                                      : serviceObjectPath;
     if (objectPath.empty())
     {
         return;
@@ -235,59 +235,59 @@
         [this](boost::system::error_code ec,
                const boost::container::flat_map<std::string, VariantType>&
                    propertyMap) {
-            if (ec)
+        if (ec)
+        {
+            lg2::error(
+                "async_method_call error: Failed to service unit properties: {EC}",
+                "EC", ec.value());
+            return;
+        }
+        try
+        {
+            updateServiceProperties(propertyMap);
+            if (!socketObjectPath.empty())
             {
-                lg2::error(
-                    "async_method_call error: Failed to service unit properties: {EC}",
-                    "EC", ec.value());
-                return;
+                conn->async_method_call(
+                    [this](boost::system::error_code ec,
+                           const boost::container::flat_map<
+                               std::string, VariantType>& propertyMap) {
+                    if (ec)
+                    {
+                        lg2::error(
+                            "async_method_call error: Failed to get all property: {EC}",
+                            "EC", ec.value());
+                        return;
+                    }
+                    try
+                    {
+                        updateSocketProperties(propertyMap);
+                        if (!srvCfgIface)
+                        {
+                            registerProperties();
+                        }
+                    }
+                    catch (const std::exception& e)
+                    {
+                        lg2::error(
+                            "Exception in getting socket properties: {ERROR}",
+                            "ERROR", e);
+                        return;
+                    }
+                    },
+                    sysdService, socketObjectPath, dBusPropIntf,
+                    dBusGetAllMethod, sysdSocketIntf);
             }
-            try
+            else if (!srvCfgIface)
             {
-                updateServiceProperties(propertyMap);
-                if (!socketObjectPath.empty())
-                {
-                    conn->async_method_call(
-                        [this](boost::system::error_code ec,
-                               const boost::container::flat_map<
-                                   std::string, VariantType>& propertyMap) {
-                            if (ec)
-                            {
-                                lg2::error(
-                                    "async_method_call error: Failed to get all property: {EC}",
-                                    "EC", ec.value());
-                                return;
-                            }
-                            try
-                            {
-                                updateSocketProperties(propertyMap);
-                                if (!srvCfgIface)
-                                {
-                                    registerProperties();
-                                }
-                            }
-                            catch (const std::exception& e)
-                            {
-                                lg2::error(
-                                    "Exception in getting socket properties: {ERROR}",
-                                    "ERROR", e);
-                                return;
-                            }
-                        },
-                        sysdService, socketObjectPath, dBusPropIntf,
-                        dBusGetAllMethod, sysdSocketIntf);
-                }
-                else if (!srvCfgIface)
-                {
-                    registerProperties();
-                }
+                registerProperties();
             }
-            catch (const std::exception& e)
-            {
-                lg2::error("Exception in getting socket properties: {ERROR}",
-                           "ERROR", e);
-                return;
-            }
+        }
+        catch (const std::exception& e)
+        {
+            lg2::error("Exception in getting socket properties: {ERROR}",
+                       "ERROR", e);
+            return;
+        }
         },
         sysdService, objectPath, dBusPropIntf, dBusGetAllMethod, sysdUnitIntf);
     return;
@@ -504,28 +504,28 @@
         updateInProgress = true;
         boost::asio::spawn(conn->get_io_context(),
                            [this](boost::asio::yield_context yield) {
-                               // Stop and apply configuration for all objects
-                               for (auto& srvMgrObj : srvMgrObjects)
-                               {
-                                   auto& srvObj = srvMgrObj.second;
-                                   if (srvObj->updatedFlag)
-                                   {
-                                       srvObj->stopAndApplyUnitConfig(yield);
-                                   }
-                               }
-                               // Do system reload
-                               systemdDaemonReload(conn, yield);
-                               // restart unit config.
-                               for (auto& srvMgrObj : srvMgrObjects)
-                               {
-                                   auto& srvObj = srvMgrObj.second;
-                                   if (srvObj->updatedFlag)
-                                   {
-                                       srvObj->restartUnitConfig(yield);
-                                   }
-                               }
-                               updateInProgress = false;
-                           });
+            // Stop and apply configuration for all objects
+            for (auto& srvMgrObj : srvMgrObjects)
+            {
+                auto& srvObj = srvMgrObj.second;
+                if (srvObj->updatedFlag)
+                {
+                    srvObj->stopAndApplyUnitConfig(yield);
+                }
+            }
+            // Do system reload
+            systemdDaemonReload(conn, yield);
+            // restart unit config.
+            for (auto& srvMgrObj : srvMgrObjects)
+            {
+                auto& srvObj = srvMgrObj.second;
+                if (srvObj->updatedFlag)
+                {
+                    srvObj->restartUnitConfig(yield);
+                }
+            }
+            updateInProgress = false;
+        });
     });
 }
 
@@ -539,50 +539,8 @@
         sockAttrIface->register_property(
             sockAttrPropPort, portNum,
             [this](const uint16_t& req, uint16_t& res) {
-                if (!internalSet)
-                {
-                    if (req == res)
-                    {
-                        return 1;
-                    }
-                    if (updateInProgress)
-                    {
-                        return 0;
-                    }
-                    portNum = req;
-                    updatedFlag |=
-                        (1 << static_cast<uint8_t>(UpdatedProp::port));
-                    startServiceRestartTimer();
-                }
-                res = req;
-                return 1;
-            });
-    }
-
-    srvCfgIface->register_property(
-        srvCfgPropMasked, unitMaskedState, [this](const bool& req, bool& res) {
             if (!internalSet)
             {
-#ifdef USB_CODE_UPDATE
-                if (baseUnitName == usbCodeUpdateUnitName)
-                {
-                    unitMaskedState = req;
-                    unitEnabledState = !unitMaskedState;
-                    unitRunningState = !unitMaskedState;
-                    internalSet = true;
-                    srvCfgIface->set_property(srvCfgPropEnabled,
-                                              unitEnabledState);
-                    srvCfgIface->set_property(srvCfgPropRunning,
-                                              unitRunningState);
-                    srvCfgIface->set_property(srvCfgPropMasked,
-                                              unitMaskedState);
-                    internalSet = false;
-                    setUSBCodeUpdateState(unitEnabledState);
-                    saveUSBCodeUpdateStateToFile(unitMaskedState,
-                                                 unitEnabledState);
-                    return 1;
-                }
-#endif
                 if (req == res)
                 {
                     return 1;
@@ -591,122 +549,151 @@
                 {
                     return 0;
                 }
-                unitMaskedState = req;
-                unitEnabledState = !unitMaskedState;
-                unitRunningState = !unitMaskedState;
-                updatedFlag |=
-                    (1 << static_cast<uint8_t>(UpdatedProp::maskedState)) |
-                    (1 << static_cast<uint8_t>(UpdatedProp::enabledState)) |
-                    (1 << static_cast<uint8_t>(UpdatedProp::runningState));
-                internalSet = true;
-                srvCfgIface->set_property(srvCfgPropEnabled, unitEnabledState);
-                srvCfgIface->set_property(srvCfgPropRunning, unitRunningState);
-                internalSet = false;
+                portNum = req;
+                updatedFlag |= (1 << static_cast<uint8_t>(UpdatedProp::port));
                 startServiceRestartTimer();
             }
             res = req;
             return 1;
-        });
+            });
+    }
 
-    srvCfgIface->register_property(
-        srvCfgPropEnabled, unitEnabledState,
-        [this](const bool& req, bool& res) {
-            if (!internalSet)
-            {
+    srvCfgIface->register_property(srvCfgPropMasked, unitMaskedState,
+                                   [this](const bool& req, bool& res) {
+        if (!internalSet)
+        {
 #ifdef USB_CODE_UPDATE
-                if (baseUnitName == usbCodeUpdateUnitName)
-                {
-                    if (unitMaskedState)
-                    { // block updating if masked
-                        lg2::error("Invalid value specified");
-                        return -EINVAL;
-                    }
-                    unitEnabledState = req;
-                    unitRunningState = req;
-                    internalSet = true;
-                    srvCfgIface->set_property(srvCfgPropEnabled,
-                                              unitEnabledState);
-                    srvCfgIface->set_property(srvCfgPropRunning,
-                                              unitRunningState);
-                    internalSet = false;
-                    setUSBCodeUpdateState(unitEnabledState);
-                    saveUSBCodeUpdateStateToFile(unitMaskedState,
-                                                 unitEnabledState);
-                    res = req;
-                    return 1;
-                }
+            if (baseUnitName == usbCodeUpdateUnitName)
+            {
+                unitMaskedState = req;
+                unitEnabledState = !unitMaskedState;
+                unitRunningState = !unitMaskedState;
+                internalSet = true;
+                srvCfgIface->set_property(srvCfgPropEnabled, unitEnabledState);
+                srvCfgIface->set_property(srvCfgPropRunning, unitRunningState);
+                srvCfgIface->set_property(srvCfgPropMasked, unitMaskedState);
+                internalSet = false;
+                setUSBCodeUpdateState(unitEnabledState);
+                saveUSBCodeUpdateStateToFile(unitMaskedState, unitEnabledState);
+                return 1;
+            }
 #endif
-                if (req == res)
-                {
-                    return 1;
-                }
-                if (updateInProgress)
-                {
-                    return 0;
-                }
+            if (req == res)
+            {
+                return 1;
+            }
+            if (updateInProgress)
+            {
+                return 0;
+            }
+            unitMaskedState = req;
+            unitEnabledState = !unitMaskedState;
+            unitRunningState = !unitMaskedState;
+            updatedFlag |=
+                (1 << static_cast<uint8_t>(UpdatedProp::maskedState)) |
+                (1 << static_cast<uint8_t>(UpdatedProp::enabledState)) |
+                (1 << static_cast<uint8_t>(UpdatedProp::runningState));
+            internalSet = true;
+            srvCfgIface->set_property(srvCfgPropEnabled, unitEnabledState);
+            srvCfgIface->set_property(srvCfgPropRunning, unitRunningState);
+            internalSet = false;
+            startServiceRestartTimer();
+        }
+        res = req;
+        return 1;
+    });
+
+    srvCfgIface->register_property(srvCfgPropEnabled, unitEnabledState,
+                                   [this](const bool& req, bool& res) {
+        if (!internalSet)
+        {
+#ifdef USB_CODE_UPDATE
+            if (baseUnitName == usbCodeUpdateUnitName)
+            {
                 if (unitMaskedState)
                 { // block updating if masked
                     lg2::error("Invalid value specified");
                     return -EINVAL;
                 }
                 unitEnabledState = req;
-                updatedFlag |=
-                    (1 << static_cast<uint8_t>(UpdatedProp::enabledState));
-                startServiceRestartTimer();
+                unitRunningState = req;
+                internalSet = true;
+                srvCfgIface->set_property(srvCfgPropEnabled, unitEnabledState);
+                srvCfgIface->set_property(srvCfgPropRunning, unitRunningState);
+                internalSet = false;
+                setUSBCodeUpdateState(unitEnabledState);
+                saveUSBCodeUpdateStateToFile(unitMaskedState, unitEnabledState);
+                res = req;
+                return 1;
             }
-            res = req;
-            return 1;
-        });
-
-    srvCfgIface->register_property(
-        srvCfgPropRunning, unitRunningState,
-        [this](const bool& req, bool& res) {
-            if (!internalSet)
-            {
-#ifdef USB_CODE_UPDATE
-                if (baseUnitName == usbCodeUpdateUnitName)
-                {
-                    if (unitMaskedState)
-                    { // block updating if masked
-                        lg2::error("Invalid value specified");
-                        return -EINVAL;
-                    }
-                    unitEnabledState = req;
-                    unitRunningState = req;
-                    internalSet = true;
-                    srvCfgIface->set_property(srvCfgPropEnabled,
-                                              unitEnabledState);
-                    srvCfgIface->set_property(srvCfgPropRunning,
-                                              unitRunningState);
-                    internalSet = false;
-                    setUSBCodeUpdateState(unitEnabledState);
-                    saveUSBCodeUpdateStateToFile(unitMaskedState,
-                                                 unitEnabledState);
-                    res = req;
-                    return 1;
-                }
 #endif
-                if (req == res)
-                {
-                    return 1;
-                }
-                if (updateInProgress)
-                {
-                    return 0;
-                }
+            if (req == res)
+            {
+                return 1;
+            }
+            if (updateInProgress)
+            {
+                return 0;
+            }
+            if (unitMaskedState)
+            { // block updating if masked
+                lg2::error("Invalid value specified");
+                return -EINVAL;
+            }
+            unitEnabledState = req;
+            updatedFlag |= (1
+                            << static_cast<uint8_t>(UpdatedProp::enabledState));
+            startServiceRestartTimer();
+        }
+        res = req;
+        return 1;
+    });
+
+    srvCfgIface->register_property(srvCfgPropRunning, unitRunningState,
+                                   [this](const bool& req, bool& res) {
+        if (!internalSet)
+        {
+#ifdef USB_CODE_UPDATE
+            if (baseUnitName == usbCodeUpdateUnitName)
+            {
                 if (unitMaskedState)
                 { // block updating if masked
                     lg2::error("Invalid value specified");
                     return -EINVAL;
                 }
+                unitEnabledState = req;
                 unitRunningState = req;
-                updatedFlag |=
-                    (1 << static_cast<uint8_t>(UpdatedProp::runningState));
-                startServiceRestartTimer();
+                internalSet = true;
+                srvCfgIface->set_property(srvCfgPropEnabled, unitEnabledState);
+                srvCfgIface->set_property(srvCfgPropRunning, unitRunningState);
+                internalSet = false;
+                setUSBCodeUpdateState(unitEnabledState);
+                saveUSBCodeUpdateStateToFile(unitMaskedState, unitEnabledState);
+                res = req;
+                return 1;
             }
-            res = req;
-            return 1;
-        });
+#endif
+            if (req == res)
+            {
+                return 1;
+            }
+            if (updateInProgress)
+            {
+                return 0;
+            }
+            if (unitMaskedState)
+            { // block updating if masked
+                lg2::error("Invalid value specified");
+                return -EINVAL;
+            }
+            unitRunningState = req;
+            updatedFlag |= (1
+                            << static_cast<uint8_t>(UpdatedProp::runningState));
+            startServiceRestartTimer();
+        }
+        res = req;
+        return 1;
+    });
 
     srvCfgIface->initialize();
     if (!socketObjectPath.empty())
