diff --git a/tlbmc/sensors/hwmon_temp_sensor.cc b/tlbmc/sensors/hwmon_temp_sensor.cc
index 3d7adbd..2355597 100644
--- a/tlbmc/sensors/hwmon_temp_sensor.cc
+++ b/tlbmc/sensors/hwmon_temp_sensor.cc
@@ -80,6 +80,62 @@
   return it->second;
 }
 
+absl::flat_hash_map<std::string, std::string>
+HwmonTempSensor::CreateLabelToInputFileMap(
+    const boost::filesystem::path& hwmon_path) {
+  absl::flat_hash_map<std::string, std::string> label_to_input_file;
+  for (const auto& entry : boost::filesystem::directory_iterator(hwmon_path)) {
+    constexpr std::string_view kInputFileSuffix = "_input";
+    constexpr std::string_view kLabelSuffix = "_label";
+    if (entry.is_regular_file() &&
+        absl::EndsWith(entry.path().filename().string(), kInputFileSuffix)) {
+      // e.g., /sys/bus/i2c/devices/i2c-21/21-0040/hwmon/hwmon15/temp100_input
+      std::string input_file = entry.path().filename().string();
+      std::string file_prefix =
+          input_file.substr(0, input_file.size() - kInputFileSuffix.size());
+      std::string label_file = absl::StrCat(file_prefix, kLabelSuffix);
+      // Both input file and label file should exist
+      boost::filesystem::path label_path = hwmon_path / label_file;
+      if (boost::filesystem::exists(label_path)) {
+        std::ifstream file(label_path.string());
+        std::string label = {std::istreambuf_iterator<char>(file),
+                             std::istreambuf_iterator<char>()};
+        label = std::string(absl::StripTrailingAsciiWhitespace(label));
+        label_to_input_file[label] = input_file;
+      } else if (boost::filesystem::exists(hwmon_path / input_file)) {
+        // If label file does not exist, use input file name prefix as label.
+        label_to_input_file[file_prefix] = input_file;
+      }
+    }
+  }
+  return label_to_input_file;
+}
+
+std::shared_ptr<HwmonTempSensor> HwmonTempSensor::CreateHwmonTempSensor(
+    const std::string& name, const std::string& label,
+    const std::string& input_dev_path, const HwmonTempSensorConfig& config,
+    const std::shared_ptr<boost::asio::io_context>& io_context,
+    std::optional<NotificationCb> on_batch_notify) {
+  std::string hwmon_temp_sensor_key = absl::StrCat("temperature_", name);
+
+  ThresholdConfigs threshold_configs;
+  if (auto it = config.label_to_thresholds().find(label);
+      it != config.label_to_thresholds().end()) {
+    threshold_configs = it->second;
+  }
+
+  ReadingRangeConfigs reading_range_configs;
+  if (auto it = config.label_to_reading_ranges().find(label);
+      it != config.label_to_reading_ranges().end()) {
+    reading_range_configs = it->second;
+  }
+
+  return std::make_shared<HwmonTempSensor>(
+      Token(), config.type(), input_dev_path, hwmon_temp_sensor_key,
+      config.i2c_common_config(), threshold_configs, reading_range_configs,
+      config.entity_common_config(), io_context, on_batch_notify);
+}
+
 absl::StatusOr<std::vector<std::shared_ptr<Sensor>>> HwmonTempSensor::Create(
     const HwmonTempSensorConfig& config,
     const std::shared_ptr<boost::asio::io_context>& io_context,
@@ -108,13 +164,9 @@
     LOG(ERROR) << "Failed to create HwmonTempSensor (NONFATAL): "
                << hwmon_path.status();
     for (const auto& [label, name] : config.label_to_name()) {
-      std::string hwmon_temp_sensor_key = absl::StrCat("temperature_", name);
       std::shared_ptr<HwmonTempSensor> hwmon_temp_sensor =
-          std::make_shared<HwmonTempSensor>(
-              Token(), config.type(), "", hwmon_temp_sensor_key,
-              config.i2c_common_config(), ThresholdConfigs(),
-              ReadingRangeConfigs(), config.entity_common_config(), io_context,
-              on_batch_notify);
+          CreateHwmonTempSensor(name, label, "", config, io_context,
+                                on_batch_notify);
       State state;
       // If the sensor is not detected, we set its creation as pending otherwise
       // set it to failed.
@@ -133,31 +185,8 @@
   }
 
   // Now find all labels and their input files.
-  absl::flat_hash_map<std::string, std::string> label_to_input_file;
-  for (const auto& entry : boost::filesystem::directory_iterator(*hwmon_path)) {
-    constexpr std::string_view kInputFileSuffix = "_input";
-    constexpr std::string_view kLabelSuffix = "_label";
-    if (entry.is_regular_file() &&
-        absl::EndsWith(entry.path().filename().string(), kInputFileSuffix)) {
-      // e.g., /sys/bus/i2c/devices/i2c-21/21-0040/hwmon/hwmon15/temp100_input
-      std::string input_file = entry.path().filename().string();
-      std::string file_prefix =
-          input_file.substr(0, input_file.size() - kInputFileSuffix.size());
-      std::string label_file = absl::StrCat(file_prefix, kLabelSuffix);
-      // Both input file and label file should exist
-      boost::filesystem::path label_path = *hwmon_path / label_file;
-      if (boost::filesystem::exists(label_path)) {
-        std::ifstream file(label_path.string());
-        std::string label = {std::istreambuf_iterator<char>(file),
-                             std::istreambuf_iterator<char>()};
-        label = std::string(absl::StripTrailingAsciiWhitespace(label));
-        label_to_input_file[label] = input_file;
-      } else if (boost::filesystem::exists(*hwmon_path / input_file)) {
-        // If label file does not exist, use input file name prefix as label.
-        label_to_input_file[file_prefix] = input_file;
-      }
-    }
-  }
+  absl::flat_hash_map<std::string, std::string> label_to_input_file =
+      CreateLabelToInputFileMap(*hwmon_path);
 
   for (const auto& [label, name] : config.label_to_name()) {
     boost::filesystem::path input_dev_path;
@@ -170,24 +199,9 @@
           "Failed to find $0 in hwmon folder $1", label, hwmon_path->string()));
     }
 
-    ThresholdConfigs threshold_configs;
-    if (auto it = config.label_to_thresholds().find(label);
-        it != config.label_to_thresholds().end()) {
-      threshold_configs = it->second;
-    }
-
-    ReadingRangeConfigs reading_range_configs;
-    if (auto it = config.label_to_reading_ranges().find(label);
-        it != config.label_to_reading_ranges().end()) {
-      reading_range_configs = it->second;
-    }
-
-    std::string hwmon_temp_sensor_key = absl::StrCat("temperature_", name);
-
-    sensors.push_back(std::make_shared<HwmonTempSensor>(
-        Token(), config.type(), input_dev_path.string(), hwmon_temp_sensor_key,
-        config.i2c_common_config(), threshold_configs, reading_range_configs,
-        config.entity_common_config(), io_context, on_batch_notify));
+    sensors.push_back(CreateHwmonTempSensor(name, label,
+                                            input_dev_path.string(), config,
+                                            io_context, on_batch_notify));
   }
 
   return sensors;
diff --git a/tlbmc/sensors/hwmon_temp_sensor.h b/tlbmc/sensors/hwmon_temp_sensor.h
index 7f59246..07dcb84 100644
--- a/tlbmc/sensors/hwmon_temp_sensor.h
+++ b/tlbmc/sensors/hwmon_temp_sensor.h
@@ -9,8 +9,8 @@
 #include <vector>
 
 #include "absl/base/thread_annotations.h"
+#include "absl/container/flat_hash_map.h"
 #include "absl/status/statusor.h"
-#include "absl/synchronization/mutex.h"
 #include "boost/asio.hpp"  //NOLINT: boost::asio is commonly used in BMC
 #include "boost/circular_buffer.hpp"  //NOLINT: boost is commonly used in BMC
 #include "entity_common_config.pb.h"
@@ -61,6 +61,15 @@
   static absl::StatusOr<std::string_view> GetDriverName(
       HwmonTempSensorType sensor_type);
 
+  static absl::flat_hash_map<std::string, std::string>
+  CreateLabelToInputFileMap(const boost::filesystem::path& hwmon_path);
+
+  static std::shared_ptr<HwmonTempSensor> CreateHwmonTempSensor(
+      const std::string& name, const std::string& label,
+      const std::string& input_dev_path, const HwmonTempSensorConfig& config,
+      const std::shared_ptr<boost::asio::io_context>& io_context,
+      std::optional<NotificationCb> on_batch_notify);
+
  private:
   class Token {
    private:
