diff --git a/res/stasis/app.c b/res/stasis/app.c
index aba2661400000c3430c702adf041e257c7464b37..ee2fd0bc52815a8180c42c0b424ee4784b37a947 100644
--- a/res/stasis/app.c
+++ b/res/stasis/app.c
@@ -1126,8 +1126,23 @@ void app_update(struct stasis_app *app, stasis_app_cb handler, void *data)
 			"timestamp", ast_json_timeval(ast_tvnow(), NULL),
 			"application", app->name);
 		if (msg) {
+			/*
+			 * The app must be unlocked before calling 'send' since a handler may
+			 * subsequently attempt to grab the app lock after first obtaining a
+			 * lock for another object, thus causing a deadlock.
+			 */
+			ao2_unlock(app);
 			app_send(app, msg);
+			ao2_lock(app);
 			ast_json_unref(msg);
+			if (!app->handler) {
+				/*
+				 * If the handler disappeared then the app was deactivated. In that
+				 * case don't replace. Re-activation will reset the handler later.
+				 */
+				ao2_unlock(app);
+				return;
+			}
 		}
 	} else {
 		ast_verb(1, "Activating Stasis app '%s'\n", app->name);