diff --git a/src/CPUSensorMain.cpp b/src/CPUSensorMain.cpp
index 4f377aa..9d5bda4 100644
--- a/src/CPUSensorMain.cpp
+++ b/src/CPUSensorMain.cpp
@@ -116,20 +116,20 @@
     bool isWordEnd = true;
     std::transform(sensorName.begin(), sensorName.end(), sensorName.begin(),
                    [&isWordEnd](int c) {
-                       if (std::isspace(c))
-                       {
-                           isWordEnd = true;
-                       }
-                       else
-                       {
-                           if (isWordEnd)
-                           {
-                               isWordEnd = false;
-                               return std::toupper(c);
-                           }
-                       }
-                       return c;
-                   });
+        if (std::isspace(c))
+        {
+            isWordEnd = true;
+        }
+        else
+        {
+            if (isWordEnd)
+            {
+                isWordEnd = false;
+                return std::toupper(c);
+            }
+        }
+        return c;
+    });
     return sensorName;
 }
 
@@ -737,33 +737,33 @@
 
     std::function<void(sdbusplus::message::message&)> eventHandler =
         [&](sdbusplus::message::message& message) {
-            if (message.is_method_error())
+        if (message.is_method_error())
+        {
+            std::cerr << "callback method error\n";
+            return;
+        }
+
+        if (debug)
+        {
+            std::cout << message.get_path() << " is changed\n";
+        }
+
+        // this implicitly cancels the timer
+        filterTimer.expires_from_now(boost::posix_time::seconds(1));
+        filterTimer.async_wait([&](const boost::system::error_code& ec) {
+            if (ec == boost::asio::error::operation_aborted)
             {
-                std::cerr << "callback method error\n";
-                return;
+                return; // we're being canceled
             }
 
-            if (debug)
+            if (getCpuConfig(systemBus, cpuConfigs, sensorConfigs,
+                             objectServer))
             {
-                std::cout << message.get_path() << " is changed\n";
+                detectCpuAsync(pingTimer, creationTimer, io, objectServer,
+                               systemBus, cpuConfigs, sensorConfigs);
             }
-
-            // this implicitly cancels the timer
-            filterTimer.expires_from_now(boost::posix_time::seconds(1));
-            filterTimer.async_wait([&](const boost::system::error_code& ec) {
-                if (ec == boost::asio::error::operation_aborted)
-                {
-                    return; // we're being canceled
-                }
-
-                if (getCpuConfig(systemBus, cpuConfigs, sensorConfigs,
-                                 objectServer))
-                {
-                    detectCpuAsync(pingTimer, creationTimer, io, objectServer,
-                                   systemBus, cpuConfigs, sensorConfigs);
-                }
-            });
-        };
+        });
+    };
 
     for (const char* type : sensorTypes)
     {
