diff --git a/src/include/switch_types.h b/src/include/switch_types.h
index 707ede43ac..cc8539085e 100644
--- a/src/include/switch_types.h
+++ b/src/include/switch_types.h
@@ -2149,7 +2149,8 @@ typedef enum {
 } switch_session_ctl_t;
 
 typedef enum {
-	SSH_FLAG_STICKY = (1 << 0)
+	SSH_FLAG_STICKY = (1 << 0),
+	SSH_FLAG_PRE_EXEC = (1 << 1)
 } switch_state_handler_flag_t;
 
 #ifdef WIN32
diff --git a/src/switch_core_state_machine.c b/src/switch_core_state_machine.c
index 9bbf6e6714..a9c3e23216 100644
--- a/src/switch_core_state_machine.c
+++ b/src/switch_core_state_machine.c
@@ -433,10 +433,48 @@ void switch_core_state_machine_init(switch_memory_pool_t *pool)
 		}																\
 		switch_core_session_request_video_refresh(session);				\
 		switch_core_media_gen_key_frame(session);						\
-		if (!driver_state_handler->on_##__STATE || (driver_state_handler->on_##__STATE(session) == SWITCH_STATUS_SUCCESS \
-													)) {				\
+		proceed = 1;													\
+		while (do_extra_handlers && (application_state_handler = switch_channel_get_state_handler(session->channel, index++)) != 0) { \
+			if (!switch_test_flag(application_state_handler, SSH_FLAG_PRE_EXEC)) {\
+				continue;												\
+			}															\
+			if (!application_state_handler->on_##__STATE				\
+				|| (application_state_handler->on_##__STATE				\
+					&& application_state_handler->on_##__STATE(session) == SWITCH_STATUS_SUCCESS \
+					)) {												\
+				proceed++;												\
+				continue;												\
+			} else {													\
+				proceed = 0;											\
+				break;													\
+			}															\
+		}																\
+		index = 0;														\
+		if (!proceed) global_proceed = 0;								\
+		proceed = 1;													\
+		while (do_extra_handlers && proceed && (application_state_handler = switch_core_get_state_handler(index++)) != 0) { \
+			if (!switch_test_flag(application_state_handler, SSH_FLAG_PRE_EXEC)) { \
+				continue;												\
+			}															\
+			if (!application_state_handler->on_##__STATE ||				\
+				(application_state_handler->on_##__STATE &&				\
+				 application_state_handler->on_##__STATE(session) == SWITCH_STATUS_SUCCESS \
+				 )) {													\
+				proceed++;												\
+				continue;												\
+			} else {													\
+				proceed = 0;											\
+				break;													\
+			}															\
+		}																\
+		index = 0;														\
+		if (!proceed) global_proceed = 0;								\
+		if (!driver_state_handler->on_##__STATE || (driver_state_handler->on_##__STATE(session) == SWITCH_STATUS_SUCCESS )) { \
 			while (do_extra_handlers && (application_state_handler = switch_channel_get_state_handler(session->channel, index++)) != 0) { \
-				if (!application_state_handler || !application_state_handler->on_##__STATE \
+				if (switch_test_flag(application_state_handler, SSH_FLAG_PRE_EXEC)) { \
+					continue;											\
+				}														\
+				if (!application_state_handler->on_##__STATE			\
 					|| (application_state_handler->on_##__STATE			\
 						&& application_state_handler->on_##__STATE(session) == SWITCH_STATUS_SUCCESS \
 						)) {											\
@@ -451,7 +489,10 @@ void switch_core_state_machine_init(switch_memory_pool_t *pool)
 			if (!proceed) global_proceed = 0;							\
 			proceed = 1;												\
 			while (do_extra_handlers && proceed && (application_state_handler = switch_core_get_state_handler(index++)) != 0) { \
-				if (!application_state_handler || !application_state_handler->on_##__STATE || \
+				if (switch_test_flag(application_state_handler, SSH_FLAG_PRE_EXEC)) { \
+					continue;											\
+				}														\
+				if (!application_state_handler->on_##__STATE || \
 					(application_state_handler->on_##__STATE &&			\
 					 application_state_handler->on_##__STATE(session) == SWITCH_STATUS_SUCCESS \
 					 )) {												\