diff --git a/redfish-core/lib/chassis.hpp b/redfish-core/lib/chassis.hpp
index 9f3fb38..c7f7b95 100644
--- a/redfish-core/lib/chassis.hpp
+++ b/redfish-core/lib/chassis.hpp
@@ -35,7 +35,7 @@
 
 /**
  * OnDemandChassisProvider
- * Chassis provider class that retrieves data directly from dbus, before seting
+ * Chassis provider class that retrieves data directly from dbus, before setting
  * it into JSON output. This does not cache any data.
  *
  * Class can be a good example on how to scale different data providing
@@ -125,7 +125,7 @@
               // is Chassis.
               if (interface.first ==
                   "xyz.openbmc_project.Configuration.Chassis") {
-                // Cut out everyting until last "/", ...
+                // Cut out everything until last "/", ...
                 const std::string &chassis_id = objpath.first.value;
                 std::size_t last_pos = chassis_id.rfind("/");
                 if (last_pos != std::string::npos) {
@@ -135,7 +135,7 @@
               }
             }
           }
-          // Finally make a callback with usefull data
+          // Finally make a callback with useful data
           callback(true, chassis_list);
         },
         {"xyz.openbmc_project.EntityManager",
diff --git a/redfish-core/lib/ethernet.hpp b/redfish-core/lib/ethernet.hpp
index eaee13e..88ce9f2 100644
--- a/redfish-core/lib/ethernet.hpp
+++ b/redfish-core/lib/ethernet.hpp
@@ -61,8 +61,8 @@
 
 /**
  * OnDemandEthernetProvider
- * Ethernet provider class that retrieves data directly from dbus, before seting
- * it into JSON output. This does not cache any data.
+ * Ethernet provider class that retrieves data directly from dbus, before
+ * setting it into JSON output. This does not cache any data.
  *
  * TODO(Pawel)
  * This perhaps shall be different file, which has to be chosen on compile time
@@ -175,7 +175,7 @@
     // Since there might be several IPv4 configurations aligned with
     // single ethernet interface, loop over all of them
     for (auto &objpath : dbus_data) {
-      // Check if propper patter for object path appears
+      // Check if proper patter for object path appears
       if (boost::starts_with(
               objpath.first.value,
               "/xyz/openbmc_project/network/" + ethiface_id + "/ipv4/")) {
@@ -215,7 +215,7 @@
 
           // Attach IPv4 only if address is present
           if (ipv4_address.address != nullptr) {
-            // Check if given addres is local, or global
+            // Check if given address is local, or global
             if (boost::starts_with(*ipv4_address.address, "169.254")) {
               ipv4_address.global = false;
             } else {
@@ -270,7 +270,7 @@
             }
           }
 
-          // Finally make a callback with usefull data
+          // Finally make a callback with useful data
           callback(true, eth_data, ipv4_data);
         },
         {"xyz.openbmc_project.Network", "/xyz/openbmc_project/network",
@@ -310,7 +310,7 @@
               // this is what we're looking for.
               if (interface.first ==
                   "xyz.openbmc_project.Network.EthernetInterface") {
-                // Cut out everyting until last "/", ...
+                // Cut out everything until last "/", ...
                 const std::string &iface_id = objpath.first.value;
                 std::size_t last_pos = iface_id.rfind("/");
                 if (last_pos != std::string::npos) {
@@ -320,7 +320,7 @@
               }
             }
           }
-          // Finally make a callback with usefull data
+          // Finally make a callback with useful data
           callback(true, iface_list);
         },
         {"xyz.openbmc_project.Network", "/xyz/openbmc_project/network",
diff --git a/redfish-core/lib/sensors.hpp b/redfish-core/lib/sensors.hpp
index c48512a..f427909 100644
--- a/redfish-core/lib/sensors.hpp
+++ b/redfish-core/lib/sensors.hpp
@@ -200,7 +200,7 @@
 /**
  * @brief Builds a json sensor representation of a sensor.
  * @param sensorName  The name of the sensor to be built
- * @param sensorType  The type (temperature, fan_tach, ect) of the sensor to
+ * @param sensorType  The type (temperature, fan_tach, etc) of the sensor to
  * build
  * @param interfacesDict  A dictionary of the interfaces and properties of said
  * interfaces to be built from
@@ -361,7 +361,7 @@
                   continue;
                 }
                 // These indexes aren't intuitive, as boost::split puts an empty
-                // string at the beggining
+                // string at the beginning
                 const std::string& sensorType = split[4];
                 const std::string& sensorName = split[5];
                 CROW_LOG_DEBUG << "sensorName " << sensorName << " sensorType "
