diff --git a/src/NVMeBasicContext.cpp b/src/NVMeBasicContext.cpp
index d0ece2c..760167e 100644
--- a/src/NVMeBasicContext.cpp
+++ b/src/NVMeBasicContext.cpp
@@ -277,10 +277,10 @@
     boost::asio::async_write(
         reqStream, boost::asio::buffer(command->data(), command->size()),
         [command](boost::system::error_code ec, std::size_t) {
-            if (ec)
-            {
-                std::cerr << "Got error writing basic query: " << ec << "\n";
-            }
+        if (ec)
+        {
+            std::cerr << "Got error writing basic query: " << ec << "\n";
+        }
         });
 
     auto response = std::make_shared<boost::asio::streambuf>();
@@ -290,67 +290,67 @@
     boost::asio::async_read(
         respStream, *response,
         [response](const boost::system::error_code& ec, std::size_t n) {
-            if (ec)
-            {
-                std::cerr << "Got error completing basic query: " << ec << "\n";
-                return static_cast<std::size_t>(0);
-            }
+        if (ec)
+        {
+            std::cerr << "Got error completing basic query: " << ec << "\n";
+            return static_cast<std::size_t>(0);
+        }
 
-            if (n == 0)
-            {
-                return static_cast<std::size_t>(1);
-            }
+        if (n == 0)
+        {
+            return static_cast<std::size_t>(1);
+        }
 
-            std::istream is(response.get());
-            size_t len = static_cast<std::size_t>(is.peek());
+        std::istream is(response.get());
+        size_t len = static_cast<std::size_t>(is.peek());
 
-            if (n > len + 1)
-            {
-                std::cerr << "Query stream has become unsynchronised: "
-                          << "n: " << n << ", "
-                          << "len: " << len << "\n";
-                return static_cast<std::size_t>(0);
-            }
+        if (n > len + 1)
+        {
+            std::cerr << "Query stream has become unsynchronised: "
+                      << "n: " << n << ", "
+                      << "len: " << len << "\n";
+            return static_cast<std::size_t>(0);
+        }
 
-            if (n == len + 1)
-            {
-                return static_cast<std::size_t>(0);
-            }
+        if (n == len + 1)
+        {
+            return static_cast<std::size_t>(0);
+        }
 
-            if (n > 1)
-            {
-                return len + 1 - n;
-            }
+        if (n > 1)
+        {
+            return len + 1 - n;
+        }
 
-            response->prepare(len);
-            return len;
+        response->prepare(len);
+        return len;
         },
         [self{shared_from_this()}, sensor, response](
             const boost::system::error_code& ec, std::size_t length) mutable {
-            if (ec)
-            {
-                std::cerr << "Got error reading basic query: " << ec << "\n";
-                return;
-            }
+        if (ec)
+        {
+            std::cerr << "Got error reading basic query: " << ec << "\n";
+            return;
+        }
 
-            if (length == 0)
-            {
-                std::cerr << "Invalid message length: " << length << "\n";
-                return;
-            }
+        if (length == 0)
+        {
+            std::cerr << "Invalid message length: " << length << "\n";
+            return;
+        }
 
-            /* Deserialise the response */
-            response->consume(1); /* Drop the length byte */
-            std::istream is(response.get());
-            std::vector<char> data(response->size());
-            is.read(data.data(), response->size());
+        /* Deserialise the response */
+        response->consume(1); /* Drop the length byte */
+        std::istream is(response.get());
+        std::vector<char> data(response->size());
+        is.read(data.data(), response->size());
 
-            /* Update the sensor */
-            self->processResponse(sensor, data.data(), data.size());
+        /* Update the sensor */
+        self->processResponse(sensor, data.data(), data.size());
 
-            /* Enqueue processing of the next sensor */
-            self->readAndProcessNVMeSensor();
-        });
+        /* Enqueue processing of the next sensor */
+        self->readAndProcessNVMeSensor();
+    });
 }
 
 void NVMeBasicContext::pollNVMeDevices()
@@ -360,19 +360,19 @@
     scanTimer.expires_from_now(boost::posix_time::seconds(1));
     scanTimer.async_wait(
         [self{shared_from_this()}](const boost::system::error_code errorCode) {
-            if (errorCode == boost::asio::error::operation_aborted)
-            {
-                return;
-            }
+        if (errorCode == boost::asio::error::operation_aborted)
+        {
+            return;
+        }
 
-            if (errorCode)
-            {
-                std::cerr << errorCode.message() << "\n";
-                return;
-            }
+        if (errorCode)
+        {
+            std::cerr << errorCode.message() << "\n";
+            return;
+        }
 
-            self->readAndProcessNVMeSensor();
-        });
+        self->readAndProcessNVMeSensor();
+    });
 }
 
 static double getTemperatureReading(int8_t reading)
