diff --git a/indra/llui/llbutton.cpp b/indra/llui/llbutton.cpp
index ba3748a5736d1118339cf350d3b6673774b50592..2e9c7a5d3d773b198f61815c639d613c77b3aa34 100644
--- a/indra/llui/llbutton.cpp
+++ b/indra/llui/llbutton.cpp
@@ -296,6 +296,24 @@ void LLButton::onCommit()
 	LLUICtrl::onCommit();
 }
 
+boost::signals2::connection LLButton::setClickedCallback(const CommitCallbackParam& cb)
+{
+	return setClickedCallback(initCommitCallback(cb));
+}
+boost::signals2::connection LLButton::setMouseDownCallback(const CommitCallbackParam& cb)
+{
+	return setMouseDownCallback(initCommitCallback(cb));
+}
+boost::signals2::connection LLButton::setMouseUpCallback(const CommitCallbackParam& cb)
+{
+	return setMouseUpCallback(initCommitCallback(cb));
+}
+boost::signals2::connection LLButton::setHeldDownCallback(const CommitCallbackParam& cb)
+{
+	return setHeldDownCallback(initCommitCallback(cb));
+}
+
+
 boost::signals2::connection LLButton::setClickedCallback( const commit_signal_t::slot_type& cb )
 {
 	if (!mCommitSignal) mCommitSignal = new commit_signal_t();
diff --git a/indra/llui/llbutton.h b/indra/llui/llbutton.h
index a0a7b4e372c49b677873f537e4fdcdf74713bda3..ba0345f61099a01c7af0f591c544222dd01c4b85 100644
--- a/indra/llui/llbutton.h
+++ b/indra/llui/llbutton.h
@@ -170,6 +170,11 @@ class LLButton
 	void			setUseEllipses( BOOL use_ellipses )					{ mUseEllipses = use_ellipses; }
 
 
+	boost::signals2::connection setClickedCallback(const CommitCallbackParam& cb);
+	boost::signals2::connection setMouseDownCallback(const CommitCallbackParam& cb);
+	boost::signals2::connection setMouseUpCallback(const CommitCallbackParam& cb);
+	boost::signals2::connection setHeldDownCallback(const CommitCallbackParam& cb);
+
 	boost::signals2::connection setClickedCallback( const commit_signal_t::slot_type& cb ); // mouse down and up within button
 	boost::signals2::connection setMouseDownCallback( const commit_signal_t::slot_type& cb );
 	boost::signals2::connection setMouseUpCallback( const commit_signal_t::slot_type& cb ); // mouse up, EVEN IF NOT IN BUTTON
diff --git a/indra/llui/llcommandmanager.cpp b/indra/llui/llcommandmanager.cpp
index d8e035a320370fd1ca45d79e3a3dbefcc6c618c8..128ba609cb2e9940fad52909b21b7334800cdd04 100644
--- a/indra/llui/llcommandmanager.cpp
+++ b/indra/llui/llcommandmanager.cpp
@@ -55,6 +55,8 @@ LLCommand::Params::Params()
 	, tooltip_ref("tooltip_ref")
 	, execute_function("execute_function")
 	, execute_parameters("execute_parameters")
+	, execute_stop_function("execute_stop_function")
+	, execute_stop_parameters("execute_stop_parameters")
 	, is_enabled_function("is_enabled_function")
 	, is_enabled_parameters("is_enabled_parameters")
 	, is_running_function("is_running_function")
@@ -72,6 +74,8 @@ LLCommand::LLCommand(const LLCommand::Params& p)
 	, mTooltipRef(p.tooltip_ref)
 	, mExecuteFunction(p.execute_function)
 	, mExecuteParameters(p.execute_parameters)
+	, mExecuteStopFunction(p.execute_stop_function)
+	, mExecuteStopParameters(p.execute_stop_parameters)
 	, mIsEnabledFunction(p.is_enabled_function)
 	, mIsEnabledParameters(p.is_enabled_parameters)
 	, mIsRunningFunction(p.is_running_function)
diff --git a/indra/llui/llcommandmanager.h b/indra/llui/llcommandmanager.h
index 46e0fe6e69eb257c8b4d008fee7ebafc35a5b070..9b93ab735a4937d9eef4975ea50192b6c6f7b11f 100644
--- a/indra/llui/llcommandmanager.h
+++ b/indra/llui/llcommandmanager.h
@@ -116,6 +116,9 @@ class LLCommand
 		Mandatory<std::string>	execute_function;
 		Optional<LLSD>			execute_parameters;
 
+		Optional<std::string>	execute_stop_function;
+		Optional<LLSD>			execute_stop_parameters;
+		
 		Optional<std::string>	is_enabled_function;
 		Optional<LLSD>			is_enabled_parameters;
 
@@ -139,6 +142,9 @@ class LLCommand
 	const std::string& executeFunctionName() const { return mExecuteFunction; }
 	const LLSD& executeParameters() const { return mExecuteParameters; }
 
+	const std::string& executeStopFunctionName() const { return mExecuteStopFunction; }
+	const LLSD& executeStopParameters() const { return mExecuteStopParameters; }
+	
 	const std::string& isEnabledFunctionName() const { return mIsEnabledFunction; }
 	const LLSD& isEnabledParameters() const { return mIsEnabledParameters; }
 
@@ -159,6 +165,9 @@ class LLCommand
 	std::string mExecuteFunction;
 	LLSD        mExecuteParameters;
 
+	std::string mExecuteStopFunction;
+	LLSD        mExecuteStopParameters;
+	
 	std::string mIsEnabledFunction;
 	LLSD        mIsEnabledParameters;
 
diff --git a/indra/llui/lltoolbar.cpp b/indra/llui/lltoolbar.cpp
index 89184f781f74308ff3db51124c52faba76641b15..e74aab6e21654b7abd402b435d8db28db5893c72 100644
--- a/indra/llui/lltoolbar.cpp
+++ b/indra/llui/lltoolbar.cpp
@@ -659,11 +659,25 @@ LLToolBarButton* LLToolBar::createButton(const LLCommandId& id)
 
 	if (!mReadOnly)
 	{
-		LLUICtrl::CommitCallbackParam cbParam;
-		cbParam.function_name = commandp->executeFunctionName();
-		cbParam.parameter = commandp->executeParameters();
+		LLUICtrl::CommitCallbackParam executeParam;
+		executeParam.function_name = commandp->executeFunctionName();
+		executeParam.parameter = commandp->executeParameters();
 
-		button->setCommitCallback(cbParam);
+		// If we have a "stop" function then we map the command to mouse down / mouse up otherwise commit
+		const std::string& executeStopFunction = commandp->executeStopFunctionName();
+		if (executeStopFunction.length() > 0)
+		{
+			LLUICtrl::CommitCallbackParam executeStopParam;
+			executeStopParam.function_name = executeStopFunction;
+			executeStopParam.parameter = commandp->executeStopParameters();
+			
+			button->setMouseDownCallback(executeParam);
+			button->setMouseUpCallback(executeStopParam);
+		}
+		else
+		{
+			button->setCommitCallback(executeParam);
+		}
 
 		const std::string& isEnabledFunction = commandp->isEnabledFunctionName();
 		if (isEnabledFunction.length() > 0)
diff --git a/indra/newview/app_settings/commands.xml b/indra/newview/app_settings/commands.xml
index d758647d3a7869d1c78c4face866280bb5010546..296d992b3408d56d5c7568efb84fa0eea5d1dcf2 100644
--- a/indra/newview/app_settings/commands.xml
+++ b/indra/newview/app_settings/commands.xml
@@ -217,6 +217,8 @@
            tooltip_ref="Command_Speak_Tooltip"
            execute_function="Agent.ToggleMicrophone"
            execute_parameters="speak"
+           execute_stop_function=""
+           execute_stop_parameters="speak"
            is_enabled_function="Agent.IsActionAllowed"
            is_enabled_parameters="speak"
            is_running_function="Agent.IsMicrophoneOn"