diff --git a/thermalCommon.cpp b/thermalCommon.cpp
index 2a3ec38..638b3b6 100644
--- a/thermalCommon.cpp
+++ b/thermalCommon.cpp
@@ -113,14 +113,14 @@
 	return -1;
 }
 
-static int readLineFromFile(std::string_view path, std::string *out)
+static int readLineFromFile(std::string_view path, std::string& out)
 {
 	char *fgets_ret;
 	FILE *fd;
 	int rv;
 	char buf[MAX_LENGTH];
 
-	out->clear();
+	out.clear();
 
 	fd = fopen(std::string(path).c_str(), "r");
 	if (fd == NULL) {
@@ -132,19 +132,19 @@
 	fgets_ret = fgets(buf, MAX_LENGTH, fd);
 	if (NULL != fgets_ret) {
 		rv = (int)strlen(buf);
-		out->append(buf, rv);
+		out.append(buf, rv);
 	} else {
 		rv = ferror(fd);
 	}
 
 	fclose(fd);
-	out->erase(std::remove(out->begin(), out->end(), '\n'), out->end());
-	LOG(DEBUG) << "Path:" << std::string(path) << " Val:" << *out << std::endl;
+	out.erase(std::remove(out.begin(), out.end(), '\n'), out.end());
+	LOG(DEBUG) << "Path:" << std::string(path) << " Val:" << out << std::endl;
 
 	return rv;
 }
 
-int ThermalCommon::readFromFile(std::string_view path, std::string *out)
+int ThermalCommon::readFromFile(std::string_view path, std::string& out)
 {
 	return readLineFromFile(path, out);
 }
@@ -183,7 +183,7 @@
 
 		snprintf(name, MAX_PATH, "%s%s/%s", THERMAL_SYSFS,
 				tdirent->d_name, TZ_TYPE);
-		ret = readLineFromFile(std::string_view(name), &buf);
+		ret = readLineFromFile(std::string_view(name), buf);
 		if (ret <= 0) {
 			LOG(ERROR) <<
 				"get_tzn: sensor name read error for tz:" <<
@@ -211,7 +211,7 @@
 	return found;
 }
 
-int ThermalCommon::initialize_sensor(struct target_therm_cfg cfg, int sens_idx)
+int ThermalCommon::initialize_sensor(struct target_therm_cfg& cfg, int sens_idx)
 {
 	struct therm_sensor sensor;
 	int idx = 0;
@@ -270,7 +270,7 @@
 	return 0;
 }
 
-int ThermalCommon::initializeCpuSensor(struct target_therm_cfg cpu_cfg)
+int ThermalCommon::initializeCpuSensor(struct target_therm_cfg& cpu_cfg)
 {
 	int cpu = 0;
 
@@ -282,7 +282,7 @@
 	return 0;
 }
 
-int ThermalCommon::initThermalZones(std::vector<struct target_therm_cfg> cfg)
+int ThermalCommon::initThermalZones(std::vector<struct target_therm_cfg>& cfg)
 {
 	std::vector<struct target_therm_cfg>::iterator it;
 
@@ -342,7 +342,7 @@
 
 		snprintf(name, MAX_PATH, "%s%s/%s", THERMAL_SYSFS,
 				tdirent->d_name, TZ_TYPE);
-		ret = readLineFromFile(std::string_view(name), &buf);
+		ret = readLineFromFile(std::string_view(name), buf);
 		if (ret <= 0) {
 			LOG(ERROR) <<
 				"init_cdev: cdev type read error for cdev:" <<
@@ -357,7 +357,7 @@
 		cdevInst.c.name = it->first;
 		cdevInst.c.type = it->second;
 		cdevInst.cdevn = cdevn;
-		read_cdev_state(&cdevInst);
+		read_cdev_state(cdevInst);
 		cdev.push_back(cdevInst);
 	}
 
@@ -368,7 +368,7 @@
 	return cdev.size();
 }
 
-int ThermalCommon::read_cdev_state(struct therm_cdev *cdev)
+int ThermalCommon::read_cdev_state(struct therm_cdev& cdev)
 {
 	char file_name[MAX_PATH];
 	std::string buf;
@@ -376,51 +376,68 @@
 
 	LOG(DEBUG) << "Entering " <<__func__;
 	snprintf(file_name, sizeof(file_name), CDEV_CUR_STATE_PATH,
-			cdev->cdevn);
-	ret = readLineFromFile(std::string(file_name), &buf);
+			cdev.cdevn);
+	ret = readLineFromFile(std::string(file_name), buf);
 	if (ret <= 0) {
 		LOG(ERROR) << "Cdev state read error:"<< ret <<
-			" for cdev: " << cdev->c.name;
+			" for cdev: " << cdev.c.name;
 		return -1;
 	}
-	cdev->c.value = std::stoi(buf);
-	LOG(DEBUG) << "cdev Name:" << cdev->c.name << ". state:" <<
-		cdev->c.value << std::endl;
+	cdev.c.value = std::stoi(buf, nullptr, 0);
+	LOG(DEBUG) << "cdev Name:" << cdev.c.name << ". state:" <<
+		cdev.c.value << std::endl;
 
-	return cdev->c.value;
+	return cdev.c.value;
 }
 
-int ThermalCommon::estimateSeverity(struct therm_sensor *sensor)
+int ThermalCommon::estimateSeverity(struct therm_sensor& sensor)
 {
 	int idx = 0;
 	ThrottlingSeverity severity = ThrottlingSeverity::NONE;
-	float temp = sensor->t.value;
+	float temp = sensor.t.value;
 
 	for (idx = (int)ThrottlingSeverity::SHUTDOWN; idx >= 0; idx--) {
-		if ((sensor->positiveThresh &&
-			!isnan(sensor->thresh.hotThrottlingThresholds[idx]) &&
+		/* If a particular threshold is hit already, check if the
+		 * hysteresis is cleared before changing the severity */
+		if (idx == (int)sensor.t.throttlingStatus) {
+			if ((sensor.positiveThresh &&
+				!isnan(sensor.thresh.hotThrottlingThresholds[idx]) &&
+				temp >=
+				(sensor.thresh.hotThrottlingThresholds[idx] -
+				DEFAULT_HYSTERESIS / sensor.mulFactor)) ||
+				(!sensor.positiveThresh &&
+				!isnan(sensor.thresh.coldThrottlingThresholds[idx]) &&
+				temp <=
+				(sensor.thresh.coldThrottlingThresholds[idx] +
+				DEFAULT_HYSTERESIS / sensor.mulFactor)))
+				break;
+			continue;
+		}
+		if ((sensor.positiveThresh &&
+			!isnan(sensor.thresh.hotThrottlingThresholds[idx]) &&
 			temp >=
-			sensor->thresh.hotThrottlingThresholds[idx]) ||
-		 	(!sensor->positiveThresh &&
-			!isnan(sensor->thresh.coldThrottlingThresholds[idx]) &&
+			sensor.thresh.hotThrottlingThresholds[idx]) ||
+		 	(!sensor.positiveThresh &&
+			!isnan(sensor.thresh.coldThrottlingThresholds[idx]) &&
 			temp <=
-			sensor->thresh.coldThrottlingThresholds[idx]))
+			sensor.thresh.coldThrottlingThresholds[idx]))
 			break;
 	}
 	if (idx >= 0)
 		severity = (ThrottlingSeverity)(idx);
-	LOG(DEBUG) << "Sensor Name:" << sensor->t.name << ". old severity:" <<
-		(int)sensor->t.throttlingStatus << " New severity:" <<
+	LOG(DEBUG) << "Sensor Name:" << sensor.t.name << ". prev severity:" <<
+		(int)sensor.lastThrottleStatus << ". cur severity:" <<
+		(int)sensor.t.throttlingStatus << " New severity:" <<
 		(int)severity << std::endl;
-	if (severity == sensor->t.throttlingStatus)
-		return 0;
-	sensor->lastThrottleStatus = sensor->t.throttlingStatus;
-	sensor->t.throttlingStatus = severity;
+	if (severity == sensor.t.throttlingStatus)
+		return -1;
+	sensor.lastThrottleStatus = sensor.t.throttlingStatus;
+	sensor.t.throttlingStatus = severity;
 
-	return 0;
+	return (int)severity;
 }
 
-int ThermalCommon::read_temperature(struct therm_sensor *sensor)
+int ThermalCommon::read_temperature(struct therm_sensor& sensor)
 {
 	char file_name[MAX_PATH];
 	float temp;
@@ -429,21 +446,22 @@
 
 	LOG(DEBUG) << "Entering " <<__func__;
 	snprintf(file_name, sizeof(file_name), TEMPERATURE_FILE_FORMAT,
-			sensor->tzn);
-	ret = readLineFromFile(std::string(file_name), &buf);
+			sensor.tzn);
+	ret = readLineFromFile(std::string(file_name), buf);
 	if (ret <= 0) {
 		LOG(ERROR) << "Temperature read error:"<< ret <<
-			" for sensor " << sensor->t.name;
+			" for sensor " << sensor.t.name;
 		return -1;
 	}
-	sensor->t.value = (float)std::stoi(buf) / (float)sensor->mulFactor;
-	LOG(DEBUG) << "Sensor Name:" << sensor->t.name << ". Temperature:" <<
-		(float)sensor->t.value << std::endl;
+	sensor.t.value = (float)std::stoi(buf, nullptr, 0) / (float)sensor.mulFactor;
+	LOG(DEBUG) << "Sensor Name:" << sensor.t.name << ". Temperature:" <<
+		(float)sensor.t.value << std::endl;
 
-	return estimateSeverity(sensor);
+	estimateSeverity(sensor);
+	return ret;
 }
 
-void ThermalCommon::initThreshold(struct therm_sensor sensor)
+void ThermalCommon::initThreshold(struct therm_sensor& sensor)
 {
 	char file_name[MAX_PATH] = "";
 	std::string buf;
@@ -459,7 +477,7 @@
 	}
 	snprintf(file_name, sizeof(file_name), POLICY_FILE_FORMAT,
 			sensor.tzn);
-	ret = readLineFromFile(std::string(file_name), &buf);
+	ret = readLineFromFile(std::string(file_name), buf);
 	if (ret <= 0) {
 		LOG(ERROR) << "Policy read error:"<< ret <<
 			" for sensor " << sensor.t.name;
diff --git a/thermalCommon.h b/thermalCommon.h
index 4375e1e..6a1b348 100644
--- a/thermalCommon.h
+++ b/thermalCommon.h
@@ -44,14 +44,14 @@
 		ThermalCommon();
 		~ThermalCommon() = default;
 
-		int readFromFile(std::string_view path, std::string *out);
-		int initThermalZones(std::vector<struct target_therm_cfg> cfg);
-		void initThreshold(struct therm_sensor sens);
+		int readFromFile(std::string_view path, std::string& out);
+		int initThermalZones(std::vector<struct target_therm_cfg>& cfg);
+		void initThreshold(struct therm_sensor& sens);
 		int initCdev();
 
-		int read_cdev_state(struct therm_cdev *cdev);
-		int read_temperature(struct therm_sensor *sensor);
-		int estimateSeverity(struct therm_sensor *sensor);
+		int read_cdev_state(struct therm_cdev& cdev);
+		int read_temperature(struct therm_sensor& sensor);
+		int estimateSeverity(struct therm_sensor& sensor);
 		int get_cpu_usages(hidl_vec<CpuUsage>& list);
 
 		std::vector<struct therm_sensor> fetch_sensor_list()
@@ -69,8 +69,8 @@
 		std::vector<struct therm_sensor> sens;
 		std::vector<struct therm_cdev> cdev;
 
-		int initializeCpuSensor(struct target_therm_cfg cpu_cfg);
-		int initialize_sensor(struct target_therm_cfg cfg,
+		int initializeCpuSensor(struct target_therm_cfg& cpu_cfg);
+		int initialize_sensor(struct target_therm_cfg& cfg,
 					int sens_idx);
 };
 
diff --git a/thermalConfig.cpp b/thermalConfig.cpp
index 34c0d36..3ab97b1 100644
--- a/thermalConfig.cpp
+++ b/thermalConfig.cpp
@@ -634,7 +634,7 @@
 		bool bcl_defined = false;
 		std::string soc_val;
 
-		if (cmnInst.readFromFile(socIDPath, &soc_val) <= 0) {
+		if (cmnInst.readFromFile(socIDPath, soc_val) <= 0) {
 			LOG(ERROR) <<"soc ID fetch error";
 			return;
 		}
diff --git a/thermalUtils.cpp b/thermalUtils.cpp
index 7aaada4..f057e75 100644
--- a/thermalUtils.cpp
+++ b/thermalUtils.cpp
@@ -54,19 +54,19 @@
 {
 	int ret = 0;
 	std::vector<struct therm_sensor> sensorList;
-	std::vector<struct therm_sensor>::iterator it;
+	std::vector<struct target_therm_cfg> therm_cfg = cfg.fetchConfig();
 
 	is_sensor_init = false;
 	is_cdev_init = false;
-	ret = cmnInst.initThermalZones(cfg.fetchConfig());
+	ret = cmnInst.initThermalZones(therm_cfg);
 	if (ret > 0) {
 		is_sensor_init = true;
 		sensorList = cmnInst.fetch_sensor_list();
 		std::lock_guard<std::mutex> _lock(sens_cb_mutex);
-		for (it = sensorList.begin(); it != sensorList.end(); it++) {
-			thermalConfig[it->sensor_name] = *it;
-			cmnInst.read_temperature(&(*it));
-			cmnInst.initThreshold(*it);
+		for (struct therm_sensor sens: sensorList) {
+			thermalConfig[sens.sensor_name] = sens;
+			cmnInst.read_temperature(sens);
+			cmnInst.initThreshold(sens);
 		}
 		monitor.start();
 	}
@@ -79,23 +79,22 @@
 
 void ThermalUtils::ueventParse(std::string sensor_name, int temp)
 {
-	std::unordered_map<std::string, struct therm_sensor>::iterator it;
-	struct therm_sensor sens;
+	int severity = 0;
 
 	LOG(INFO) << "uevent triggered for sensor: " << sensor_name
 		<< std::endl;
-	it = thermalConfig.find(sensor_name);
-	if (it == thermalConfig.end()) {
+	if (thermalConfig.find(sensor_name) == thermalConfig.end()) {
 		LOG(DEBUG) << "sensor is not monitored:" << sensor_name
 			<< std::endl;
 		return;
 	}
-	sens = it->second;
 	std::lock_guard<std::mutex> _lock(sens_cb_mutex);
+	struct therm_sensor& sens = thermalConfig[sensor_name];
 	sens.t.value = (float)temp / (float)sens.mulFactor;
-	cmnInst.estimateSeverity(&sens);
-	if (sens.lastThrottleStatus != sens.t.throttlingStatus) {
-		LOG(INFO) << "sensor: " << sensor_name <<" old: " <<
+	severity = cmnInst.estimateSeverity(sens);
+	if (severity != -1) {
+		LOG(INFO) << "sensor: " << sensor_name <<" temperature: "
+			<< sens.t.value << " old: " <<
 			(int)sens.lastThrottleStatus << " new: " <<
 			(int)sens.t.throttlingStatus << std::endl;
 		cb(sens.t);
@@ -113,13 +112,13 @@
 		return 0;
 	for (it = thermalConfig.begin(); it != thermalConfig.end();
 			it++, idx++) {
-		struct therm_sensor sens = it->second;
+		struct therm_sensor& sens = it->second;
 		Temperature_1_0 _temp;
 
 		/* v1 supports only CPU, GPU, Battery and SKIN */
 		if (sens.t.type > TemperatureType::SKIN)
 			continue;
-		ret = cmnInst.read_temperature(&sens);
+		ret = cmnInst.read_temperature(sens);
 		if (ret < 0)
 			return ret;
 		_temp.currentValue = sens.t.value;
@@ -145,11 +144,11 @@
 	std::vector<Temperature> _temp;
 
 	for (it = thermalConfig.begin(); it != thermalConfig.end(); it++) {
-		struct therm_sensor sens = it->second;
+		struct therm_sensor& sens = it->second;
 
 		if (filterType && sens.t.type != type)
 			continue;
-		ret = cmnInst.read_temperature(&sens);
+		ret = cmnInst.read_temperature(sens);
 		if (ret < 0)
 			return ret;
 		_temp.push_back(sens.t);
@@ -166,7 +165,7 @@
 	std::vector<TemperatureThreshold> _thresh;
 
 	for (it = thermalConfig.begin(); it != thermalConfig.end(); it++) {
-		struct therm_sensor sens = it->second;
+		struct therm_sensor& sens = it->second;
 
 		if (filterType && sens.t.type != type)
 			continue;
@@ -187,7 +186,7 @@
 
 		if (filterType && cdev.c.type != type)
 			continue;
-		ret = cmnInst.read_cdev_state(&cdev);
+		ret = cmnInst.read_cdev_state(cdev);
 		if (ret < 0)
 			return ret;
 		_cdev.push_back(cdev.c);
