diff --git a/main.cpp b/main.cpp
index 6c39899..3ed84f6 100644
--- a/main.cpp
+++ b/main.cpp
@@ -85,10 +85,10 @@
         }
     }
 
-    auto ModeControlBus = sdbusplus::bus::new_default();
+    auto modeControlBus = sdbusplus::bus::new_default();
 #if CONFIGURE_DBUS
     {
-        dbus_configuration::init(ModeControlBus);
+        dbus_configuration::init(modeControlBus);
     }
 #endif
     SensorManager mgmr;
@@ -96,7 +96,7 @@
 
     // Create a manager for the ModeBus because we own it.
     static constexpr auto modeRoot = "/xyz/openbmc_project/settings/fanctrl";
-    sdbusplus::server::manager::manager(ModeControlBus, modeRoot);
+    sdbusplus::server::manager::manager(modeControlBus, modeRoot);
 
     /*
      * When building the sensors, if any of the dbus passive ones aren't on the
@@ -107,7 +107,7 @@
         try
         {
             mgmr = buildSensorsFromConfig(configPath);
-            zones = buildZonesFromConfig(configPath, mgmr, ModeControlBus);
+            zones = buildZonesFromConfig(configPath, mgmr, modeControlBus);
         }
         catch (const std::exception& e)
         {
@@ -118,7 +118,7 @@
     else
     {
         mgmr = buildSensors(sensorConfig);
-        zones = buildZones(zoneConfig, zoneDetailsConfig, mgmr, ModeControlBus);
+        zones = buildZones(zoneConfig, zoneDetailsConfig, mgmr, modeControlBus);
     }
 
     if (0 == zones.size())
@@ -132,23 +132,23 @@
      * it.
      */
 
-    auto& HostSensorBus = mgmr.getHostBus();
-    auto& PassiveListeningBus = mgmr.getPassiveBus();
+    auto& hostSensorBus = mgmr.getHostBus();
+    auto& passiveListeningBus = mgmr.getPassiveBus();
 
     std::cerr << "Starting threads\n";
 
     /* TODO(venture): Ask SensorManager if we have any passive sensors. */
-    struct ThreadParams p = {std::ref(PassiveListeningBus), ""};
-    std::thread l(BusThread, std::ref(p));
+    struct ThreadParams p = {std::ref(passiveListeningBus), ""};
+    std::thread l(busThread, std::ref(p));
 
     /* TODO(venture): Ask SensorManager if we have any host sensors. */
     static constexpr auto hostBus = "xyz.openbmc_project.Hwmon.external";
-    struct ThreadParams e = {std::ref(HostSensorBus), hostBus};
-    std::thread te(BusThread, std::ref(e));
+    struct ThreadParams e = {std::ref(hostSensorBus), hostBus};
+    std::thread te(busThread, std::ref(e));
 
     static constexpr auto modeBus = "xyz.openbmc_project.State.FanCtrl";
-    struct ThreadParams m = {std::ref(ModeControlBus), modeBus};
-    std::thread tm(BusThread, std::ref(m));
+    struct ThreadParams m = {std::ref(modeControlBus), modeBus};
+    std::thread tm(busThread, std::ref(m));
 
     std::vector<std::thread> zoneThreads;
 
diff --git a/sensors/builder.cpp b/sensors/builder.cpp
index ea4d7cb..966a581 100644
--- a/sensors/builder.cpp
+++ b/sensors/builder.cpp
@@ -41,8 +41,8 @@
     buildSensors(const std::map<std::string, struct SensorConfig>& config)
 {
     SensorManager mgmr;
-    auto& HostSensorBus = mgmr.getHostBus();
-    auto& PassiveListeningBus = mgmr.getPassiveBus();
+    auto& hostSensorBus = mgmr.getHostBus();
+    auto& passiveListeningBus = mgmr.getPassiveBus();
 
     for (const auto& it : config)
     {
@@ -67,7 +67,7 @@
         switch (rtype)
         {
             case IOInterfaceType::DBUSPASSIVE:
-                ri = DbusPassive::createDbusPassive(PassiveListeningBus,
+                ri = DbusPassive::createDbusPassive(passiveListeningBus,
                                                     info->type, name, &helper);
                 if (ri == nullptr)
                 {
@@ -149,7 +149,7 @@
                  * not quite pluggable; but maybe it could be.
                  */
                 auto sensor = HostSensor::createTemp(
-                    name, info->timeout, HostSensorBus, info->readpath.c_str(),
+                    name, info->timeout, hostSensorBus, info->readpath.c_str(),
                     deferSignals);
                 mgmr.addSensor(info->type, name, std::move(sensor));
             }
diff --git a/threads/busthread.cpp b/threads/busthread.cpp
index 59704e3..6cfb08c 100644
--- a/threads/busthread.cpp
+++ b/threads/busthread.cpp
@@ -18,7 +18,7 @@
 
 #include <string>
 
-void BusThread(struct ThreadParams& params)
+void busThread(struct ThreadParams& params)
 {
     if (params.name.length() > 0)
     {
diff --git a/threads/busthread.hpp b/threads/busthread.hpp
index a3234b8..df875f5 100644
--- a/threads/busthread.hpp
+++ b/threads/busthread.hpp
@@ -8,4 +8,4 @@
     std::string name;
 };
 
-void BusThread(struct ThreadParams& params);
+void busThread(struct ThreadParams& params);
