diff --git a/CHANGES b/CHANGES
index 63938ad099ad1b47f182c63ac926e8426ff91c99..26a3d492e8d1fbdfec52f950afa3a41456d06e89 100644
--- a/CHANGES
+++ b/CHANGES
@@ -12,6 +12,14 @@
 --- Functionality changes from Asterisk 13.24.0 to Asterisk 13.25.0 ----------
 ------------------------------------------------------------------------------
 
+ARI
+------------------
+ * Whenever an ARI application is started, a context will be created for it
+   automatically as long as one does not already exist, following the format
+   'stasis-<app_name>'. Two extensions are also added to this context: a match-all
+   extension, and the 'h' extension. Any phone that registers under this context
+   will place all calls to the corresponding Stasis application.
+
 res_pjsip
 ------------------
  * Added "send_contact_status_on_update_registration" global configuration option
diff --git a/res/stasis/app.c b/res/stasis/app.c
index fe05d36815fd0d05949dab21cd0101ab9a49f093..e48d8cc5ebfb9d8940a90dc3ef84887d2e594611 100644
--- a/res/stasis/app.c
+++ b/res/stasis/app.c
@@ -299,6 +299,8 @@ static int forwards_sort(const void *obj_left, const void *obj_right, int flags)
 static void app_dtor(void *obj)
 {
 	struct stasis_app *app = obj;
+	size_t size = strlen("stasis-") + strlen(app->name) + 1;
+	char context_name[size];
 
 	ast_verb(1, "Destroying Stasis app %s\n", app->name);
 
@@ -306,6 +308,11 @@ static void app_dtor(void *obj)
 	ast_assert(app->bridge_router == NULL);
 	ast_assert(app->endpoint_router == NULL);
 
+	/* If we created a context for this application, remove it */
+	strcpy(context_name, "stasis-");
+	strcat(context_name, app->name);
+	ast_context_destroy_by_name(context_name, "res_stasis");
+
 	ao2_cleanup(app->topic);
 	app->topic = NULL;
 	ao2_cleanup(app->forwards);
@@ -943,6 +950,8 @@ struct stasis_app *app_create(const char *name, stasis_app_cb handler, void *dat
 	RAII_VAR(struct stasis_app *, app, NULL, ao2_cleanup);
 	size_t size;
 	int res = 0;
+	size_t context_size = strlen("stasis-") + strlen(name) + 1;
+	char context_name[context_size];
 
 	ast_assert(name != NULL);
 	ast_assert(handler != NULL);
@@ -1021,6 +1030,22 @@ struct stasis_app *app_create(const char *name, stasis_app_cb handler, void *dat
 	app->handler = handler;
 	app->data = ao2_bump(data);
 
+	/* Create a context, a match-all extension, and a 'h' extension for this application. Note that
+	 * this should only be done if a context does not already exist. */
+	strcpy(context_name, "stasis-");
+	strcat(context_name, name);
+	if (!ast_context_find(context_name)) {
+		if (!ast_context_find_or_create(NULL, NULL, context_name, "res_stasis")) {
+			ast_log(LOG_WARNING, "Could not create context '%s' for Stasis application '%s'\n", context_name, name);
+		} else {
+			ast_add_extension(context_name, 0, "_.", 1, NULL, NULL, "Stasis", ast_strdup(name), ast_free_ptr, "res_stasis");
+			ast_add_extension(context_name, 0, "h", 1, NULL, NULL, "NoOp", NULL, NULL, "res_stasis");
+		}
+	} else {
+		ast_log(LOG_WARNING, "Not creating context '%s' for Stasis application '%s' because it already exists\n",
+			context_name, name);
+	}
+
 	ao2_ref(app, +1);
 	return app;
 }