diff --git a/include/asterisk/stasis_app.h b/include/asterisk/stasis_app.h
index 528c48030a7facd07d9a5504481e6b066bf89e35..5dbb55397162e148778e001a4986d112e43b6fa5 100644
--- a/include/asterisk/stasis_app.h
+++ b/include/asterisk/stasis_app.h
@@ -166,12 +166,15 @@ const char *stasis_app_control_get_channel_id(
  *
  * \param control Control for \c res_stasis
  * \param endpoint The endpoint to dial.
+ * \param exten Extension to dial if no endpoint specified.
+ * \param context Context to use with extension.
  * \param timeout The amount of time to wait for answer, before giving up.
  *
  * \return 0 for success
  * \return -1 for error.
  */
-int stasis_app_control_dial(struct stasis_app_control *control, const char *endpoint, int timeout);
+int stasis_app_control_dial(struct stasis_app_control *control, const char *endpoint, const char *exten,
+                            const char *context, int timeout);
 
 /*!
  * \brief Apply a bridge role to a channel controlled by a stasis app control
diff --git a/res/ari/resource_channels.c b/res/ari/resource_channels.c
index 29ceb778f20a1855be8e900a4027bb95538d3e36..4d5228168a311fc8605d99b58611de630902857e 100644
--- a/res/ari/resource_channels.c
+++ b/res/ari/resource_channels.c
@@ -90,7 +90,7 @@ void ast_ari_dial(struct ast_variable *headers, struct ast_dial_args *args, stru
 		return;
 	}
 
-	if (stasis_app_control_dial(control, args->endpoint, args->timeout)) {
+	if (stasis_app_control_dial(control, args->endpoint, args->extension, args->context, args->timeout)) {
 		ast_ari_response_alloc_failed(response);
 		return;
 	}
diff --git a/res/stasis/control.c b/res/stasis/control.c
index 2c3a10980ab5ab4a0824cc333a8bf881079178f6..26406bb07a3c5465d16b4390098b955b1aa1925b 100644
--- a/res/stasis/control.c
+++ b/res/stasis/control.c
@@ -135,6 +135,10 @@ struct stasis_app_control_dial_data {
 	int timeout;
 };
 
+static void *app_control_add_channel_to_bridge(
+        struct stasis_app_control *control,
+        struct ast_channel *chan, void *data);
+
 static void *app_control_dial(struct stasis_app_control *control,
 	struct ast_channel *chan, void *data)
 {
@@ -142,9 +146,8 @@ static void *app_control_dial(struct stasis_app_control *control,
 	RAII_VAR(struct stasis_app_control_dial_data *, dial_data, data, ast_free);
 	enum ast_dial_result res;
 	char *tech, *resource;
-
 	struct ast_channel *new_chan;
-	struct ast_bridge *bridge;
+	RAII_VAR(struct ast_bridge *, bridge, NULL, ao2_cleanup);
 
 	tech = dial_data->endpoint;
 	if (!(resource = strchr(tech, '/'))) {
@@ -178,13 +181,14 @@ static void *app_control_dial(struct stasis_app_control *control,
 		AST_BRIDGE_IMPART_CHAN_INDEPENDENT)) {
 		ast_hangup(new_chan);
 	} else {
-		stasis_app_control_add_channel_to_bridge(control, bridge);
+		app_control_add_channel_to_bridge(control, chan, bridge);
 	}
 
 	return NULL;
 }
 
-int stasis_app_control_dial(struct stasis_app_control *control, const char *endpoint, int timeout)
+int stasis_app_control_dial(struct stasis_app_control *control, const char *endpoint, const char *exten, const char *context,
+			    int timeout)
 {
 	struct stasis_app_control_dial_data *dial_data;
 
@@ -192,7 +196,13 @@ int stasis_app_control_dial(struct stasis_app_control *control, const char *endp
 		return -1;
 	}
 
-	ast_copy_string(dial_data->endpoint, endpoint, sizeof(dial_data->endpoint));
+	if (!ast_strlen_zero(endpoint)) {
+		ast_copy_string(dial_data->endpoint, endpoint, sizeof(dial_data->endpoint));
+	} else if (!ast_strlen_zero(exten) && !ast_strlen_zero(context)) {
+		snprintf(dial_data->endpoint, sizeof(dial_data->endpoint), "Local/%s@%s", exten, context);
+	} else {
+		return -1;
+	}
 
 	if (timeout > 0) {
 		dial_data->timeout = timeout * 1000;