diff --git a/include/asterisk/frame.h b/include/asterisk/frame.h
index 542407ecc93dbe5fa50281d0be5db1c30f0464bc..b618d1965f239375ad32729f35db6c938fed8f7b 100644
--- a/include/asterisk/frame.h
+++ b/include/asterisk/frame.h
@@ -337,6 +337,7 @@ enum ast_control_frame_type {
 
 enum ast_frame_read_action {
 	AST_FRAME_READ_ACTION_CONNECTED_LINE_MACRO,
+	AST_FRAME_READ_ACTION_SEND_TEXT,
 };
 
 struct ast_control_read_action_payload {
diff --git a/main/channel.c b/main/channel.c
index dcb284b631e6951132dd31113d922a5d0a45b0ef..c0e3cb43eca0932ace96c1024462e32979247319 100644
--- a/main/channel.c
+++ b/main/channel.c
@@ -3773,6 +3773,11 @@ static struct ast_frame *__ast_read(struct ast_channel *chan, int dropaudio, int
 					ast_party_connected_line_free(&connected);
 					ast_channel_lock(chan);
 					break;
+				case AST_FRAME_READ_ACTION_SEND_TEXT:
+					ast_channel_unlock(chan);
+					ast_sendtext(chan, (const char *) read_action_payload->payload);
+					ast_channel_lock(chan);
+					break;
 				}
 				ast_frfree(f);
 				f = &ast_null_frame;
diff --git a/main/manager.c b/main/manager.c
index ec50cb82cc09704330ea1ab5cfa6e5bbd4851a4b..ab4243244679ed2d37bd7cf5ac9e4e2f6ac0dbcc 100644
--- a/main/manager.c
+++ b/main/manager.c
@@ -4745,10 +4745,13 @@ static int action_status(struct mansession *s, const struct message *m)
 
 static int action_sendtext(struct mansession *s, const struct message *m)
 {
-	struct ast_channel *c = NULL;
+	struct ast_channel *c;
 	const char *name = astman_get_header(m, "Channel");
 	const char *textmsg = astman_get_header(m, "Message");
-	int res = 0;
+	struct ast_control_read_action_payload *frame_payload;
+	int payload_size;
+	int frame_size;
+	int res;
 
 	if (ast_strlen_zero(name)) {
 		astman_send_error(s, m, "No channel specified");
@@ -4760,13 +4763,29 @@ static int action_sendtext(struct mansession *s, const struct message *m)
 		return 0;
 	}
 
-	if (!(c = ast_channel_get_by_name(name))) {
+	c = ast_channel_get_by_name(name);
+	if (!c) {
 		astman_send_error(s, m, "No such channel");
 		return 0;
 	}
 
-	res = ast_sendtext(c, textmsg);
-	c = ast_channel_unref(c);
+	payload_size = strlen(textmsg) + 1;
+	frame_size = payload_size + sizeof(*frame_payload);
+
+	frame_payload = ast_malloc(frame_size);
+	if (!frame_payload) {
+		ast_channel_unref(c);
+		astman_send_error(s, m, "Failure");
+		return 0;
+	}
+
+	frame_payload->action = AST_FRAME_READ_ACTION_SEND_TEXT;
+	frame_payload->payload_size = payload_size;
+	memcpy(frame_payload->payload, textmsg, payload_size);
+	res = ast_queue_control_data(c, AST_CONTROL_READ_ACTION, frame_payload, frame_size);
+
+	ast_free(frame_payload);
+	ast_channel_unref(c);
 
 	if (res >= 0) {
 		astman_send_ack(s, m, "Success");