diff --git a/firmware/application/apps/ui_touch_calibration.cpp b/firmware/application/apps/ui_touch_calibration.cpp
index a5a7c3486e3bf439d9b6ce6401af10960bcbdceb..57766af0cbce75c44003008994293df1aabaa255 100644
--- a/firmware/application/apps/ui_touch_calibration.cpp
+++ b/firmware/application/apps/ui_touch_calibration.cpp
@@ -34,6 +34,8 @@ TouchCalibrationView::TouchCalibrationView(
 	calibration { touch::default_calibration() }
 {
 	add_children({
+		&labels,
+		&field_sensitivity,
 		&image_calibrate_0,
 		&image_calibrate_1,
 		&image_calibrate_2,
@@ -51,9 +53,31 @@ TouchCalibrationView::TouchCalibrationView(
 	button_cancel.on_select = [this](Button&){ this->on_cancel(); };
 	button_ok.on_select = [this](Button&){ this->on_ok(); };
 
+	field_sensitivity.set_by_value(persistent_memory::touchsensible());
+	adjust_sensitivity(field_sensitivity.selected_index_value());
+	field_sensitivity.on_change = [this](size_t, OptionsField::value_t v) {
+		adjust_sensitivity(v);
+	};
+
 	set_phase(Phase::Calibrate0);
 }
 
+void TouchCalibrationView::adjust_sensitivity(uint32_t level) {
+	switch (level) {
+	case 2:		//ENHANCED
+		r_touch_threshold = 480;
+		samples_limit = 30;
+		break;
+	case 3:		//EXTREME
+		r_touch_threshold = 320;
+		samples_limit = 20;
+		break;
+	default:	//STANDARD (original values)
+		r_touch_threshold = 640;
+		samples_limit = 40;
+	}
+}
+
 void TouchCalibrationView::focus() {
 	button_cancel.focus();
 }
@@ -155,6 +179,8 @@ void TouchCalibrationView::touch_complete() {
 void TouchCalibrationView::on_ok() {
 	if( phase == Phase::Success ) {
 		persistent_memory::set_touch_calibration(calibration);
+		persistent_memory::set_touchsensible(field_sensitivity.selected_index_value()); //Save current sensitivity index	
+		touch::r_touch_threshold = r_touch_threshold; //Pass the sensitivity threshold into the touch routine	
 		nav.pop();
 	}
 	if( phase == Phase::Failure ) {
@@ -185,7 +211,7 @@ void TouchCalibrationView::on_frame_sync() {
 	const auto x = metrics.x * 1024;
 	const auto y = metrics.y * 1024;
 
-	if( metrics.r < 640.0f ) {
+	if( metrics.r < r_touch_threshold ) {  //euquiq was hardcoded to 640.0f
 		if( samples_count > 0 ) {
 			average.x = ((average.x * 7) + x) / 8;
 			average.y = ((average.y * 7) + y) / 8;
@@ -203,4 +229,4 @@ void TouchCalibrationView::on_frame_sync() {
 	}
 }
 
-} /* namespace ui */
+} /* namespace ui */
\ No newline at end of file
diff --git a/firmware/application/apps/ui_touch_calibration.hpp b/firmware/application/apps/ui_touch_calibration.hpp
index b47fc8599d6384645905cb69cf6bcbaf73055ac1..69c7a294ada12a7a119d69e5c9a8dd39df1b3a4d 100644
--- a/firmware/application/apps/ui_touch_calibration.hpp
+++ b/firmware/application/apps/ui_touch_calibration.hpp
@@ -62,7 +62,10 @@ private:
 	void on_ok();
 	void on_cancel();
 
-	const uint32_t samples_limit { 40 };
+	void adjust_sensitivity(uint32_t level);
+	float r_touch_threshold = 640;
+
+	uint32_t samples_limit { 40 };
 	const uint32_t verify_d_sq_max = 10 * 10;
 
 	uint32_t samples_count { 0 };
@@ -115,6 +118,20 @@ private:
 		Color::black()
 	};
 
+	Labels labels {
+		{ { 5 * 8, 16 * 8 }, "TOUCH SENSITIVITY:", Color::light_grey() }
+	};
+
+	OptionsField field_sensitivity {
+		{ 9 * 8, 18 * 8 },
+		10,
+		{
+			{ " STANDARD ", 1 },
+			{ " ENHANCED ", 2 },
+			{ " EXTREME  ", 3 },
+		}
+	};
+
 	Text label_calibrate {
 		{ 16, 5 * 16, 26 * 8, 1 * 16 },
 		"Touch targets to calibrate"
diff --git a/firmware/application/touch.cpp b/firmware/application/touch.cpp
index d3fc6c92557ff51c7503be951546f3f48a1dfd5c..f468223c3e44a998db7fa3bd1bfa20f74c4e8731 100644
--- a/firmware/application/touch.cpp
+++ b/firmware/application/touch.cpp
@@ -85,18 +85,27 @@ const Calibration default_calibration() {
 };
 
 void Manager::feed(const Frame& frame) {
-	// touch_debounce.feed(touch_raw);
 	const auto touch_raw = frame.touch;
-	//const auto touch_stable = touch_debounce.state();
 	const auto touch_stable = frame.touch;
 	bool touch_pressure = false;
 
 	// Only feed coordinate averaging if there's a touch.
-	// TODO: Separate threshold to gate coordinates for filtering?
 	if( touch_raw ) {
 		const auto metrics = calculate_metrics(frame);
 
-		// TODO: Add touch pressure hysteresis?
+		if (!r_touch_threshold) {	//Assigns the correct value from persistent memory at startup
+			switch (persistent_memory::touchsensible()) { 
+			case 2:	//Enhanced
+				r_touch_threshold = 480;
+				break;
+			case 3:	//Extreme
+				r_touch_threshold = 320;
+				break;
+			default:	//standard
+				r_touch_threshold = 640;
+			}
+		}
+
 		touch_pressure = (metrics.r < r_touch_threshold);
 		if( touch_pressure ) {
 			filter_x.feed(metrics.x * 1024);
diff --git a/firmware/application/touch.hpp b/firmware/application/touch.hpp
index ebea3c92d172c02caa4fc2bacb11450f4639d172..8ef5884e8c963095cb3a1381ea1bb045e38cee24 100644
--- a/firmware/application/touch.hpp
+++ b/firmware/application/touch.hpp
@@ -40,6 +40,8 @@ constexpr sample_t sample_max = 1023;
 
 constexpr sample_t touch_threshold = sample_max / 5;
 
+static float r_touch_threshold { 0 };
+
 struct Samples {
 	sample_t xp;
 	sample_t xn;
@@ -212,7 +214,6 @@ private:
 		TouchDetected,
 	};
 
-	static constexpr float r_touch_threshold = 640;
 	static constexpr size_t touch_count_threshold { 3 };
 	static constexpr uint32_t touch_stable_bound { 8 };
 
diff --git a/firmware/common/portapack_persistent_memory.cpp b/firmware/common/portapack_persistent_memory.cpp
index 1772fb24600c0082b888ff9eca41b69407f05f8f..1dbebae4613266f19659158b7131faed90072f38 100644
--- a/firmware/common/portapack_persistent_memory.cpp
+++ b/firmware/common/portapack_persistent_memory.cpp
@@ -63,6 +63,10 @@ using modem_repeat_range_t = range_t<int32_t>;
 constexpr modem_repeat_range_t modem_repeat_range { 1, 99 };
 constexpr int32_t modem_repeat_reset_value { 5 };
 
+using touchsensible_range_t = range_t<uint32_t>;
+constexpr touchsensible_range_t touchsensible_range { 1, 3 };
+constexpr uint32_t touchsensible_reset_value { 2 };
+
 /* struct must pack the same way on M4 and M0 cores. */
 struct data_t {
 	int64_t tuned_frequency;
@@ -91,6 +95,7 @@ struct data_t {
 	uint32_t pocsag_ignore_address;
 	
 	int32_t tone_mix;
+	uint32_t touchsense_level;
 };
 
 static_assert(sizeof(data_t) <= backup_ram.size(), "Persistent memory structure too large for VBAT-maintained region");
@@ -185,6 +190,15 @@ void set_modem_repeat(const uint32_t new_value) {
 	data->modem_repeat = modem_repeat_range.clip(new_value);
 }
 
+uint32_t touchsensible() {
+	touchsensible_range.reset_if_outside(data->touchsense_level, touchsensible_reset_value);
+	return data->touchsense_level;
+}
+
+void set_touchsensible(const uint32_t new_value) {
+	data->touchsense_level = touchsensible_range.clip(new_value);
+}
+
 serial_format_t serial_format() {
 	return data->serial_format;
 }
diff --git a/firmware/common/portapack_persistent_memory.hpp b/firmware/common/portapack_persistent_memory.hpp
index be740edb7196b4dbed0fb5a8d77855b5f5ff137d..0c311c597fd81ddd70280b8ca8bffa192162c6f9 100644
--- a/firmware/common/portapack_persistent_memory.hpp
+++ b/firmware/common/portapack_persistent_memory.hpp
@@ -78,11 +78,13 @@ bool config_splash();
 bool config_login();
 bool config_speaker();
 uint32_t config_backlight_timer();
+uint32_t touchsensible();
 
 void set_config_splash(bool v);
 void set_config_login(bool v);
 void set_config_speaker(bool new_value); 
 void set_config_backlight_timer(uint32_t i);
+void set_touchsensible(const uint32_t new_value);
 
 //uint8_t ui_config_textentry();
 //void set_config_textentry(uint8_t new_value);