diff --git a/channels/chan_pjsip.c b/channels/chan_pjsip.c
index d55bdf9f2e2716443a6c89ddceeb3b9dcf80dc1f..b70b210cec8654dccb977eda5bd7d9ede7a0e5b5 100644
--- a/channels/chan_pjsip.c
+++ b/channels/chan_pjsip.c
@@ -1601,6 +1601,10 @@ static int handle_topology_request_change(struct ast_sip_session *session,
 	SCOPE_EXIT_RTN_VALUE(res, "RC: %d\n", res);
 }
 
+/* Forward declarations */
+static int transmit_info_dtmf(void *data);
+static struct info_dtmf_data *info_dtmf_data_alloc(struct ast_sip_session *session, char digit, unsigned int duration);
+
 /*! \brief Function called by core to ask the channel to indicate some sort of condition */
 static int chan_pjsip_indicate(struct ast_channel *ast, int condition, const void *data, size_t datalen)
 {
@@ -1621,6 +1625,10 @@ static int chan_pjsip_indicate(struct ast_channel *ast, int condition, const voi
 		.data.ptr = (void *)data,
 	};
 	char condition_name[256];
+	unsigned int duration;
+	char digit;
+	struct info_dtmf_data *dtmf_data;
+
 	SCOPE_ENTER(3, "%s: Indicated %s\n", ast_channel_name(ast),
 		ast_frame_subclass2str(&f, condition_name, sizeof(condition_name), NULL, 0));
 
@@ -1680,6 +1688,22 @@ static int chan_pjsip_indicate(struct ast_channel *ast, int condition, const voi
 		}
 		ast_devstate_changed(AST_DEVICE_UNKNOWN, AST_DEVSTATE_CACHABLE, "PJSIP/%s", ast_sorcery_object_get_id(channel->session->endpoint));
 		break;
+	case AST_CONTROL_FLASH:
+		duration = 300;
+		digit = '!';
+		dtmf_data = info_dtmf_data_alloc(channel->session, digit, duration);
+
+		if (!dtmf_data) {
+			res = -1;
+			break;
+		}
+
+		if (ast_sip_push_task(channel->session->serializer, transmit_info_dtmf, dtmf_data)) {
+			ast_log(LOG_WARNING, "Error sending FLASH via INFO on channel %s\n", ast_channel_name(ast));
+			ao2_ref(dtmf_data, -1); /* dtmf_data can't be null here */
+			res = -1;
+		}
+		break;
 	case AST_CONTROL_VIDUPDATE:
 		for (i = 0; i < AST_VECTOR_SIZE(&channel->session->active_media_state->sessions); ++i) {
 			media = AST_VECTOR_GET(&channel->session->active_media_state->sessions, i);
diff --git a/doc/CHANGES-staging/chan_pjsip_flash.txt b/doc/CHANGES-staging/chan_pjsip_flash.txt
new file mode 100644
index 0000000000000000000000000000000000000000..34da79685700ecc28d673e23eedad93a1517699d
--- /dev/null
+++ b/doc/CHANGES-staging/chan_pjsip_flash.txt
@@ -0,0 +1,4 @@
+Subject: chan_pjsip
+
+Hook flash events can now be sent on a PJSIP channel
+if requested to do so.