diff --git a/main/cdr.c b/main/cdr.c
index 586a10684a35355e7c2bfa388b48b86ce07f5e6d..e2f9b764cf270b0f5120218918b61b976031ff72 100644
--- a/main/cdr.c
+++ b/main/cdr.c
@@ -1409,9 +1409,7 @@ static int base_process_party_a(struct cdr_object *cdr, struct ast_channel_snaps
 
 static int base_process_bridge_leave(struct cdr_object *cdr, struct ast_bridge_snapshot *bridge, struct ast_channel_snapshot *channel)
 {
-	/* In general, most things shouldn't get a bridge leave */
-	ast_assert(0);
-	return 1;
+	return 0;
 }
 
 static int base_process_dial_end(struct cdr_object *cdr, struct ast_channel_snapshot *caller, struct ast_channel_snapshot *peer, const char *dial_status)
diff --git a/res/ari/resource_channels.c b/res/ari/resource_channels.c
index bce7c7def2f35b0aa630870d540807c2c3598a5b..35b757267c31608ba9727881c5866208e60ab485 100644
--- a/res/ari/resource_channels.c
+++ b/res/ari/resource_channels.c
@@ -1776,6 +1776,9 @@ void ast_ari_channels_create(struct ast_variable *headers,
 	originator = ast_channel_get_by_name(args->originator);
 	if (originator) {
 		request_cap = ao2_bump(ast_channel_nativeformats(originator));
+		if (!ast_strlen_zero(args->app)) {
+			stasis_app_subscribe_channel(args->app, originator);
+		}
 	} else if (!ast_strlen_zero(args->formats)) {
 		char *format_name;
 		char *formats_copy = ast_strdupa(args->formats);
@@ -1816,13 +1819,20 @@ void ast_ari_channels_create(struct ast_variable *headers,
 
 	chan_data->chan = ast_request(dialtech, request_cap, &assignedids, originator, dialdevice, &cause);
 	ao2_cleanup(request_cap);
-	ast_channel_cleanup(originator);
+
 	if (!chan_data->chan) {
 		ast_ari_response_alloc_failed(response);
+		ast_channel_cleanup(originator);
 		chan_data_destroy(chan_data);
 		return;
 	}
 
+	if (!ast_strlen_zero(args->app)) {
+		stasis_app_subscribe_channel(args->app, chan_data->chan);
+	}
+
+	ast_channel_cleanup(originator);
+
 	if (save_dialstring(chan_data->chan, stuff)) {
 		ast_ari_response_alloc_failed(response);
 		chan_data_destroy(chan_data);
diff --git a/res/stasis/control.c b/res/stasis/control.c
index b255477bf730e374c3920572419520329e26cc55..219a2c6cd27ffa02fcf84190a12123464322d875 100644
--- a/res/stasis/control.c
+++ b/res/stasis/control.c
@@ -881,6 +881,9 @@ end:
 	return ret_bridge;
 }
 
+static int bridge_channel_depart(struct stasis_app_control *control,
+	struct ast_channel *chan, void *data);
+
 /*!
  * \brief after bridge callback for the dial bridge
  *
@@ -890,6 +893,15 @@ end:
 static void dial_bridge_after_cb(struct ast_channel *chan, void *data)
 {
 	struct stasis_app_control *control = data;
+	struct ast_bridge_channel *bridge_channel;
+
+	ast_channel_lock(chan);
+	bridge_channel = ast_channel_get_bridge_channel(chan);
+	ast_channel_unlock(chan);
+
+	ast_debug(3, "Channel: <%s>  Reason: %d\n", ast_channel_name(control->channel), ast_channel_hangupcause(chan));
+
+	stasis_app_send_command_async(control, bridge_channel_depart, bridge_channel, __ao2_cleanup);
 
 	control->bridge = NULL;
 }
@@ -898,6 +910,7 @@ static void dial_bridge_after_cb_failed(enum ast_bridge_after_cb_reason reason,
 {
 	struct stasis_app_control *control = data;
 
+	ast_debug(3, "Channel: <%s>  Reason: %d\n", ast_channel_name(control->channel), reason);
 	dial_bridge_after_cb(control->channel, data);
 }
 
@@ -1443,6 +1456,8 @@ static int app_control_dial(struct stasis_app_control *control,
 		return -1;
 	}
 
+	ast_channel_publish_dial(NULL, chan, args->dialstring, NULL);
+
 	return 0;
 }