diff --git a/src/report.cpp b/src/report.cpp
index c9df1e2..21302b4 100644
--- a/src/report.cpp
+++ b/src/report.cpp
@@ -31,8 +31,7 @@
                const interfaces::ReportFactory& reportFactory,
                const bool enabledIn, std::unique_ptr<interfaces::Clock> clock,
                Readings readingsIn) :
-    id(reportId),
-    path(utils::pathAppend(utils::constants::reportDirPath, id)),
+    id(reportId), path(utils::pathAppend(utils::constants::reportDirPath, id)),
     name(reportName), reportingType(reportingTypeIn), interval(intervalIn),
     reportActions(reportActionsIn.begin(), reportActionsIn.end()),
     metricCount(getMetricCount(metricsIn)), appendLimit(appendLimitIn),
@@ -203,8 +202,7 @@
             persistency = storeConfiguration();
         }
         return 1;
-    },
-        [this](const auto&) { return state.get<ReportFlags::enabled>(); });
+    }, [this](const auto&) { return state.get<ReportFlags::enabled>(); });
     dbusIface->register_method(
         "SetReportingProperties",
         [this](std::string newReportingType, uint64_t newInterval) {
@@ -276,8 +274,7 @@
             persistency = oldVal = false;
         }
         return 1;
-    },
-        [this](const auto&) { return persistency; });
+    }, [this](const auto&) { return persistency; });
 
     dbusIface->register_property_r("Readings", readings,
                                    sdbusplus::vtable::property_::emits_change,
@@ -302,8 +299,7 @@
         persistency = storeConfiguration();
         oldVal = std::move(newVal);
         return 1;
-    },
-        [this](const auto&) { return readingParameters; });
+    }, [this](const auto&) { return readingParameters; });
     dbusIface->register_property_r<bool>("EmitsReadingsUpdate",
                                          sdbusplus::vtable::property_::none,
                                          [this](const auto&) {
@@ -334,8 +330,7 @@
             oldVal = std::move(newVal);
         }
         return 1;
-    },
-        [this](const auto&) {
+    }, [this](const auto&) {
         return utils::transform<std::vector>(reportActions,
                                              [](const auto reportAction) {
             return utils::enumToString(reportAction);
@@ -344,15 +339,13 @@
     dbusIface->register_property_r<uint64_t>(
         "AppendLimit", sdbusplus::vtable::property_::emits_change,
         [this](const auto&) { return appendLimit; });
-    dbusIface->register_property_rw(
-        "ReportUpdates", std::string(),
-        sdbusplus::vtable::property_::emits_change,
-        [this](auto newVal, auto& oldVal) {
+    dbusIface->register_property_rw("ReportUpdates", std::string(),
+                                    sdbusplus::vtable::property_::emits_change,
+                                    [this](auto newVal, auto& oldVal) {
         setReportUpdates(utils::toReportUpdates(newVal));
         oldVal = newVal;
         return 1;
-    },
-        [this](const auto&) { return utils::enumToString(reportUpdates); });
+    }, [this](const auto&) { return utils::enumToString(reportUpdates); });
     dbusIface->register_property_r(
         "Triggers", std::vector<sdbusplus::message::object_path>{},
         sdbusplus::vtable::property_::emits_change, [this](const auto&) {
