diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index 52bcd5ca6d3c65b6970e966243d5e355381f220c..b13b892644dd4d37fe6b88df45042ad3404fb59e 100644
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -618,13 +618,16 @@
 			for all of the sip peers will be retrieved.</para>
 		</description>
 	</manager>
+	<info name="MessageDestinationInfo" language="en_US" tech="SIP">
+		<para>Specifying a prefix of <literal>sip:</literal> will send the
+		message as a SIP MESSAGE request.</para>
+	</info>
 	<info name="MessageFromInfo" language="en_US" tech="SIP">
 		<para>The <literal>from</literal> parameter can be a configured peer name
 		or in the form of "display-name" &lt;URI&gt;.</para>
 	</info>
 	<info name="MessageToInfo" language="en_US" tech="SIP">
-		<para>Specifying a prefix of <literal>sip:</literal> will send the
-		message as a SIP MESSAGE request.</para>
+		<para>Ignored</para>
 	</info>
 	<managerEvent language="en_US" name="SIPQualifyPeerDone">
 		<managerEventInstance class="EVENT_FLAG_CALL">
diff --git a/doc/CHANGES-staging/messagesend.txt b/doc/CHANGES-staging/messagesend.txt
new file mode 100644
index 0000000000000000000000000000000000000000..7977ff15c848492feac32071844d5a8a6da88a7f
--- /dev/null
+++ b/doc/CHANGES-staging/messagesend.txt
@@ -0,0 +1,16 @@
+Subject: MessageSend
+
+The MessageSend dialplan application now takes an
+optional third argument that can set the message's
+"To" field on outgoing messages.  It's an alternative
+to using the MESSAGE(to) dialplan function.
+
+To prevent confusion with the first argument, currently
+named "to", it's been renamed to "destination".
+Its function, creating the request URI, hasn't changed.
+
+The online documentation has also been enhanced to
+explain the behavior.
+
+Despite the changes in this commit, there should be
+no impact to current users of MessageSend.
diff --git a/doc/appdocsxml.dtd b/doc/appdocsxml.dtd
index 7723bd5dc8069c0a56050edc6f91195dd2782116..93fdd3afea493f8dc2c982c23477f70eaba3ea46 100644
--- a/doc/appdocsxml.dtd
+++ b/doc/appdocsxml.dtd
@@ -83,6 +83,8 @@
 
   <!ELEMENT matchInfo (category|field?)>
 
+  <!ELEMENT dataType (#PCDATA)>
+
   <!ELEMENT category (#PCDATA)>
   <!ATTLIST category match (yes|no|true|false) #REQUIRED>
 
diff --git a/main/message.c b/main/message.c
index b6f254d166cf6d396c6543a0e7bc927155a7de2f..75450e913d3abd65b92cfde1a725d17e93ec80b9 100644
--- a/main/message.c
+++ b/main/message.c
@@ -52,13 +52,25 @@
 			<para>Field of the message to get or set.</para>
 			<enumlist>
 				<enum name="to">
-					<para>Read-only.  The destination of the message.  When processing an
+					<para>When processing an
 					incoming message, this will be set to the destination listed as
 					the recipient of the message that was received by Asterisk.</para>
+					<para>
+					</para>
+					<para>For an outgoing message, this will set the To header in the
+					outgoing SIP message.  This may be overridden by the "to" parameter
+					of MessageSend.
+					</para>
 				</enum>
 				<enum name="from">
-					<para>Read-only.  The source of the message.  When processing an
+					<para>When processing an
 					incoming message, this will be set to the source of the message.</para>
+					<para>
+					</para>
+					<para>For an outgoing message, this will set the From header in the
+					outgoing SIP message. This may be overridden by the "from" parameter
+					of MessageSend.
+					</para>
 				</enum>
 				<enum name="custom_data">
 					<para>Write-only.  Mark or unmark all message headers for an outgoing
@@ -119,23 +131,39 @@
 			Send a text message.
 		</synopsis>
 		<syntax>
-			<parameter name="to" required="true">
+			<parameter name="destination" required="true">
 				<para>A To URI for the message.</para>
-				<xi:include xpointer="xpointer(/docs/info[@name='MessageToInfo'])" />
+				<xi:include xpointer="xpointer(/docs/info[@name='MessageDestinationInfo'])" />
 			</parameter>
 			<parameter name="from" required="false">
 				<para>A From URI for the message if needed for the
 				message technology being used to send this message. This can be a
 				SIP(S) URI, such as <literal>Alice &lt;sip:alice@atlanta.com&gt;</literal>,
-				a string in the format <literal>alice@atlanta.com</literal>, or simply
-				a username such as <literal>alice</literal>.</para>
+				or a string in the format <literal>alice@atlanta.com</literal>.
+				This will override a <literal>from</literal>
+				specified using the MESSAGE dialplan function or the <literal>from</literal>
+				that may have been on an incoming message.
+				</para>
+				<xi:include xpointer="xpointer(/docs/info[@name='MessageFromInfo'])" />
+			</parameter>
+			<parameter name="to" required="false">
+				<para>A To URI for the message if needed for the
+				message technology being used to send this message. This can be a
+				SIP(S) URI, such as <literal>Alice &lt;sip:alice@atlanta.com&gt;</literal>,
+				or a string in the format <literal>alice@atlanta.com</literal>.
+				This will override a <literal>to</literal>
+				specified using the MESSAGE dialplan function or the <literal>to</literal>
+				that may have been on an incoming message.
+				</para>
+				<xi:include xpointer="xpointer(/docs/info[@name='MessageToInfo'])" />
 			</parameter>
 		</syntax>
 		<description>
 			<para>Send a text message.  The body of the message that will be
 			sent is what is currently set to <literal>MESSAGE(body)</literal>.
-			  The technology chosen for sending the message is determined
-			based on a prefix to the <literal>to</literal> parameter.</para>
+			This may he come from an incoming message.
+			The technology chosen for sending the message is determined
+			based on a prefix to the <literal>destination</literal> parameter.</para>
 			<para>This application sets the following channel variables:</para>
 			<variablelist>
 				<variable name="MESSAGE_SEND_STATUS">
@@ -1204,8 +1232,9 @@ static int msg_send_exec(struct ast_channel *chan, const char *data)
 	char *parse;
 	int res = -1;
 	AST_DECLARE_APP_ARGS(args,
-		AST_APP_ARG(to);
+		AST_APP_ARG(destination);
 		AST_APP_ARG(from);
+		AST_APP_ARG(to);
 	);
 
 	if (ast_strlen_zero(data)) {
@@ -1217,7 +1246,7 @@ static int msg_send_exec(struct ast_channel *chan, const char *data)
 	parse = ast_strdupa(data);
 	AST_STANDARD_APP_ARGS(args, parse);
 
-	if (ast_strlen_zero(args.to)) {
+	if (ast_strlen_zero(args.destination)) {
 		ast_log(LOG_WARNING, "A 'to' URI is required for MessageSend()\n");
 		pbx_builtin_setvar_helper(chan, "MESSAGE_SEND_STATUS", "INVALID_URI");
 		return 0;
@@ -1236,7 +1265,7 @@ static int msg_send_exec(struct ast_channel *chan, const char *data)
 	ao2_ref(msg, +1);
 	ast_channel_unlock(chan);
 
-	tech_name = ast_strdupa(args.to);
+	tech_name = ast_strdupa(args.destination);
 	tech_name = strsep(&tech_name, ":");
 
 	ast_rwlock_rdlock(&msg_techs_lock);
@@ -1248,13 +1277,21 @@ static int msg_send_exec(struct ast_channel *chan, const char *data)
 		goto exit_cleanup;
 	}
 
+	/*
+	 * If there was a "to" in the call to MessageSend,
+	 * replace the to already in the channel datastore.
+	 */
+	if (!ast_strlen_zero(args.to)) {
+		ast_string_field_set(msg, to, args.to);
+	}
+
 	/*
 	 * The message lock is held here to safely allow the technology
 	 * implementation to access the message fields without worrying
 	 * that they could change.
 	 */
 	ao2_lock(msg);
-	res = msg_tech->msg_send(msg, S_OR(args.to, ""), S_OR(args.from, ""));
+	res = msg_tech->msg_send(msg, S_OR(args.destination, ""), S_OR(args.from, ""));
 	ao2_unlock(msg);
 
 	pbx_builtin_setvar_helper(chan, "MESSAGE_SEND_STATUS", res ? "FAILURE" : "SUCCESS");
diff --git a/res/res_pjsip_messaging.c b/res/res_pjsip_messaging.c
index 5378b8cd6bf8dd41c9754376b4efa1ed233e45f3..92873244efd6f6b657b11a9123fb4d874511382c 100644
--- a/res/res_pjsip_messaging.c
+++ b/res/res_pjsip_messaging.c
@@ -24,13 +24,16 @@
  ***/
 
 /*** DOCUMENTATION
+	<info name="MessageDestinationInfo" language="en_US" tech="PJSIP">
+		<para>Specifying a prefix of <literal>pjsip:</literal> will send the
+		message as a SIP MESSAGE request.</para>
+	</info>
 	<info name="MessageFromInfo" language="en_US" tech="PJSIP">
 		<para>The <literal>from</literal> parameter can be a configured endpoint
 		or in the form of "display-name" &lt;URI&gt;.</para>
 	</info>
 	<info name="MessageToInfo" language="en_US" tech="PJSIP">
-		<para>Specifying a prefix of <literal>pjsip:</literal> will send the
-		message as a SIP MESSAGE request.</para>
+		<para>Ignored</para>
 	</info>
  ***/
 #include "asterisk.h"
diff --git a/res/res_xmpp.c b/res/res_xmpp.c
index 0f304375fe1bb8f41a42f3de57bd7acc47e738d8..63dc257a21c350d03ada775edbac4496e0bb72d4 100644
--- a/res/res_xmpp.c
+++ b/res/res_xmpp.c
@@ -251,7 +251,7 @@
 			<para>Sends a message to a Jabber Client.</para>
 		</description>
 	</manager>
-	<info name="MessageToInfo" language="en_US" tech="XMPP">
+	<info name="MessageDestinationInfo" language="en_US" tech="XMPP">
 		<para>Specifying a prefix of <literal>xmpp:</literal> will send the
 		message as an XMPP chat message.</para>
 	</info>
@@ -260,6 +260,9 @@
 		account defined in <literal>xmpp.conf</literal> to send the message from.
 		Note that this field is required for XMPP messages.</para>
 	</info>
+	<info name="MessageToInfo" language="en_US" tech="XMPP">
+		<para>Ignored</para>
+	</info>
 	<configInfo name="res_xmpp" language="en_US">
 		<synopsis>XMPP Messaging</synopsis>
 		<configFile name="xmpp.conf">