diff --git a/libs/surfaces/generic_midi/generic_midi_control_protocol.cc b/libs/surfaces/generic_midi/generic_midi_control_protocol.cc
index bff4646..c7ee0f3 100644
--- a/libs/surfaces/generic_midi/generic_midi_control_protocol.cc
+++ b/libs/surfaces/generic_midi/generic_midi_control_protocol.cc
@@ -56,6 +56,7 @@ using namespace std;
 GenericMidiControlProtocol::GenericMidiControlProtocol (Session& s)
 	: ControlProtocol (s, _("Generic MIDI"), midi_ui_context())
 	, _motorised (false)
+	, _threshold (10)
 	, gui (0)
 {
 	_input_port = MIDI::Manager::instance()->midi_input_port ();
@@ -628,6 +629,13 @@ GenericMidiControlProtocol::load_bindings (const string& xmlpath)
 			} else {
 				_motorised = false;
 			}
+
+			if ((prop = (*citer)->property ("threshold")) != 0) {
+				_threshold = atoi (prop->value ());
+			} else {
+				_threshold = 10;
+			}
+
 		}
 
 		if ((*citer)->name() == "Binding") {
@@ -992,3 +1000,9 @@ GenericMidiControlProtocol::set_motorised (bool m)
 {
 	_motorised = m;
 }
+
+void
+GenericMidiControlProtocol::set_threshold (int t)
+{
+	_threshold = t;
+}
diff --git a/libs/surfaces/generic_midi/generic_midi_control_protocol.h b/libs/surfaces/generic_midi/generic_midi_control_protocol.h
index a868089..7248c83 100644
--- a/libs/surfaces/generic_midi/generic_midi_control_protocol.h
+++ b/libs/surfaces/generic_midi/generic_midi_control_protocol.h
@@ -87,6 +87,12 @@ class GenericMidiControlProtocol : public ARDOUR::ControlProtocol {
 		return _motorised;
 	}
 
+	void set_threshold (int);
+
+	int threshold () const {
+		return _threshold;
+	}
+
   private:
 	MIDI::Port* _input_port;
 	MIDI::Port* _output_port;
@@ -136,6 +142,7 @@ class GenericMidiControlProtocol : public ARDOUR::ControlProtocol {
 	    values jumping around when things are not in sync.
 	*/
 	bool _motorised;
+	int _threshold;
 
 	mutable void *gui;
 	void build_gui ();
diff --git a/libs/surfaces/generic_midi/gmcp_gui.cc b/libs/surfaces/generic_midi/gmcp_gui.cc
index 807e4bb..da4dd8c 100644
--- a/libs/surfaces/generic_midi/gmcp_gui.cc
+++ b/libs/surfaces/generic_midi/gmcp_gui.cc
@@ -46,10 +46,13 @@ private:
 	Gtk::Adjustment bank_adjustment;
 	Gtk::SpinButton bank_spinner;
 	Gtk::CheckButton motorised_button;
+	Gtk::Adjustment threshold_adjustment;
+	Gtk::SpinButton threshold_spinner;
 
 	void binding_changed ();
 	void bank_changed ();
 	void motorised_changed ();
+	void threshold_changed ();
 };
 
 using namespace PBD;
@@ -86,6 +89,8 @@ GMCPGUI::GMCPGUI (GenericMidiControlProtocol& p)
 	, bank_adjustment (1, 1, 100, 1, 10)
 	, bank_spinner (bank_adjustment)
 	, motorised_button ("Motorised")
+	, threshold_adjustment (1, 1, 127, 1, 10)
+	, threshold_spinner (threshold_adjustment)
 {
 	vector<string> popdowns;
 	popdowns.push_back (_("Reset All"));
@@ -140,6 +145,17 @@ GMCPGUI::GMCPGUI (GenericMidiControlProtocol& p)
 
 	motorised_button.show ();
 
+	threshold_adjustment.signal_value_changed().connect (sigc::mem_fun (*this, &GMCPGUI::threshold_changed));
+
+	label = manage (new Label (_("Threshold:")));
+	label->set_alignment (0, 0.5);
+	table->attach (*label, 0, 1, n, n + 1);
+	table->attach (threshold_spinner, 1, 2, n, n + 1);
+	++n;
+
+	threshold_spinner.show ();
+	label->show ();
+
 	pack_start (*table, false, false);
 }
 
@@ -166,6 +182,7 @@ GMCPGUI::binding_changed ()
 			if (str == x->name) {
 				cp.load_bindings (x->path);
 				motorised_button.set_active (cp.motorised ());
+				threshold_adjustment.set_value (cp.threshold ());
 				break;
 			}
 		}
@@ -177,3 +194,10 @@ GMCPGUI::motorised_changed ()
 {
 	cp.set_motorised (motorised_button.get_active ());
 }
+
+void
+GMCPGUI::threshold_changed ()
+{
+	int new_threshold = threshold_adjustment.get_value();
+	cp.set_threshold (new_threshold);
+}
diff --git a/libs/surfaces/generic_midi/midicontrollable.cc b/libs/surfaces/generic_midi/midicontrollable.cc
index ec586d3..50662ab 100644
--- a/libs/surfaces/generic_midi/midicontrollable.cc
+++ b/libs/surfaces/generic_midi/midicontrollable.cc
@@ -220,7 +220,7 @@ MIDIControllable::midi_sense_controller (Parser &, EventTwoBytes *msg)
 			float max_value = max(last_controllable_value, new_value);
 			float min_value = min(last_controllable_value, new_value);
 			float range = max_value - min_value;
-			float threshold = 10;
+			float threshold = (float) _surface->threshold ();
 
 			bool const in_sync = (
 				range < threshold &&
