diff --git a/main/channel.c b/main/channel.c
index 104558b16b5edc510eba8035e4c5af4daaca2169..8ff9bf213241254521854d7407c0631591c5c3e0 100644
--- a/main/channel.c
+++ b/main/channel.c
@@ -2360,12 +2360,23 @@ static void ast_channel_destructor(void *obj)
 	char device_name[AST_CHANNEL_NAME];
 	struct ast_callid *callid;
 
+	/* Stop monitoring */
+	if (ast_channel_monitor(chan)) {
+		ast_channel_monitor(chan)->stop(chan, 0);
+	}
+
+	/* If there is native format music-on-hold state, free it */
+	if (ast_channel_music_state(chan)) {
+		ast_moh_cleanup(chan);
+	}
+
+	ast_pbx_hangup_handler_destroy(chan);
+
+	/* Things that may possibly raise Stasis messages shouldn't occur after this point */
 	ast_set_flag(ast_channel_flags(chan), AST_FLAG_DEAD);
 	ast_channel_publish_snapshot(chan);
 	publish_cache_clear(chan);
 
-	ast_pbx_hangup_handler_destroy(chan);
-
 	ast_channel_lock(chan);
 
 	/* Get rid of each of the data stores on the channel */
@@ -2404,14 +2415,6 @@ static void ast_channel_destructor(void *obj)
 		device_name[0] = '\0';
 	}
 
-	/* Stop monitoring */
-	if (ast_channel_monitor(chan))
-		ast_channel_monitor(chan)->stop( chan, 0 );
-
-	/* If there is native format music-on-hold state, free it */
-	if (ast_channel_music_state(chan))
-		ast_moh_cleanup(chan);
-
 	/* Free translators */
 	if (ast_channel_readtrans(chan))
 		ast_translator_free_path(ast_channel_readtrans(chan));