diff --git a/include/asterisk/bridge.h b/include/asterisk/bridge.h
index 621ed0d248af92d0edac2efa496300f83480f6e6..1111d63893c0f92993b9cd54dde3ddd48ff18b11 100644
--- a/include/asterisk/bridge.h
+++ b/include/asterisk/bridge.h
@@ -645,6 +645,9 @@ enum ast_bridge_impart_flags {
  * it were placed into the bridge by ast_bridge_join().
  * Channels placed into a bridge by ast_bridge_join() are
  * removed by a third party using ast_bridge_remove().
+ *
+ * \note Any callbacks on the channel will be invoked on failure
+ * with the reason as AST_BRIDGE_AFTER_CB_REASON_IMPART_FAILED.
  */
 int ast_bridge_impart(struct ast_bridge *bridge,
 	struct ast_channel *chan,
diff --git a/main/bridge.c b/main/bridge.c
index 5752001381baadd1e24f8969dd7c148b394947ad..366d375d8929aa98d3bd19a5763d41c9b1e49d5d 100644
--- a/main/bridge.c
+++ b/main/bridge.c
@@ -1928,6 +1928,7 @@ int ast_bridge_impart(struct ast_bridge *bridge,
 	res = bridge_impart_internal(bridge, chan, swap, features, flags, &cond);
 	if (res) {
 		/* Impart failed.  Signal any other waiting impart threads */
+		ast_bridge_discard_after_callback(chan, AST_BRIDGE_AFTER_CB_REASON_IMPART_FAILED);
 		bridge_channel_impart_signal(chan);
 	}