diff --git a/src/mod/endpoints/mod_loopback/mod_loopback.c b/src/mod/endpoints/mod_loopback/mod_loopback.c
index 3ec843e187..a1882f8ca3 100644
--- a/src/mod/endpoints/mod_loopback/mod_loopback.c
+++ b/src/mod/endpoints/mod_loopback/mod_loopback.c
@@ -217,6 +217,7 @@ static switch_status_t channel_on_init(switch_core_session_t *session)
 	switch_core_session_t *b_session;
 	char name[128];
 	switch_caller_profile_t *caller_profile;
+	switch_event_t *vars = NULL;
 
 	tech_pvt = switch_core_session_get_private(session);
 	switch_assert(tech_pvt != NULL);
@@ -273,8 +274,18 @@ static switch_status_t channel_on_init(switch_core_session_t *session)
 
 
 		switch_channel_set_flag(channel, CF_ACCEPT_CNG);
-		//switch_ivr_transfer_variable(session, tech_pvt->other_session, "process_cdr");
-		switch_ivr_transfer_variable(session, tech_pvt->other_session, NULL);
+
+		if ((vars = (switch_event_t *) switch_channel_get_private(channel, "__loopback_vars__"))) {
+			switch_event_header_t *h;
+		
+			switch_channel_set_private(channel, "__loopback_vars__", NULL);
+
+			for (h = vars->headers; h; h = h->next) {
+				switch_channel_set_variable(tech_pvt->other_channel, h->name, h->value);
+			}
+
+			switch_event_destroy(&vars);
+		}
 
 		if (switch_test_flag(tech_pvt, TFLAG_APP)) {
 			switch_set_flag(b_tech_pvt, TFLAG_APP);
@@ -382,12 +393,18 @@ static switch_status_t channel_on_destroy(switch_core_session_t *session)
 	switch_channel_t *channel = NULL;
 	private_t *tech_pvt = NULL;
 	void *pop;
+	switch_event_t *vars;
 
 	channel = switch_core_session_get_channel(session);
 	switch_assert(channel != NULL);
 
 	tech_pvt = switch_core_session_get_private(session);
 
+	if ((vars = (switch_event_t *) switch_channel_get_private(channel, "__loopback_vars__"))) {
+		switch_channel_set_private(channel, "__loopback_vars__", NULL);
+		switch_event_destroy(&vars);
+	}
+	
 	if (tech_pvt) {
 		switch_core_timer_destroy(&tech_pvt->timer);
 
@@ -741,7 +758,7 @@ static switch_status_t channel_receive_message(switch_core_session_t *session, s
 {
 	switch_channel_t *channel;
 	private_t *tech_pvt;
-	int done = 1;
+	int done = 1, pass = 0;
 	
 	channel = switch_core_session_get_channel(session);
 	switch_assert(channel != NULL);
@@ -799,7 +816,27 @@ static switch_status_t channel_receive_message(switch_core_session_t *session, s
 	}
 
 
-	if (!done && tech_pvt->other_session && switch_test_flag(tech_pvt, TFLAG_RUNNING_APP)) {
+	switch (msg->message_id) {
+	case SWITCH_MESSAGE_INDICATE_DISPLAY:
+		{
+
+			if (!zstr(msg->string_array_arg[0])) {
+				switch_channel_set_profile_var(tech_pvt->other_channel, "callee_id_name", msg->string_array_arg[0]);
+			}
+
+			if (!zstr(msg->string_array_arg[1])) {
+				switch_channel_set_profile_var(tech_pvt->other_channel, "callee_id_number", msg->string_array_arg[1]);
+			}
+			
+			pass = 1;
+		}
+		break;
+	default:
+		break;
+	}
+
+
+	if (!done && tech_pvt->other_session && (pass || switch_test_flag(tech_pvt, TFLAG_RUNNING_APP))) {
 		switch_status_t r = SWITCH_STATUS_FALSE;
 		switch_core_session_t *other_session;
 		
@@ -889,6 +926,7 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi
 		private_t *tech_pvt;
 		switch_channel_t *channel;
 		switch_caller_profile_t *caller_profile;
+		switch_event_t *clone = NULL;
 
 		switch_core_session_add_stream(*new_session, NULL);
 
@@ -906,6 +944,10 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi
 			return SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER;
 		}
 
+		if (switch_event_dup(&clone, var_event) == SWITCH_STATUS_SUCCESS) {
+			switch_channel_set_private(channel, "__loopback_vars__", clone);
+		}
+
 		if (outbound_profile) {
 			char *dialplan = NULL, *context = NULL;
 
diff --git a/src/mod/endpoints/mod_sofia/mod_sofia.c b/src/mod/endpoints/mod_sofia/mod_sofia.c
index a103b86302..22df5bbf25 100644
--- a/src/mod/endpoints/mod_sofia/mod_sofia.c
+++ b/src/mod/endpoints/mod_sofia/mod_sofia.c
@@ -2082,20 +2082,7 @@ static switch_status_t sofia_receive_message(switch_core_session_t *session, swi
 	case SWITCH_MESSAGE_INDICATE_DISPLAY:
 		{
 			const char *name = msg->string_array_arg[0], *number = msg->string_array_arg[1];
-			char *arg = NULL;
-			char *argv[2] = { 0 };
-			//int argc;
-
-			if (zstr(name) && !zstr(msg->string_arg)) {
-				arg = strdup(msg->string_arg);
-				switch_assert(arg);
-
-				switch_separate_string(arg, '|', argv, (sizeof(argv) / sizeof(argv[0])));
-				name = argv[0];
-				number = argv[1];
-
-			}
-
+			
 			if (!zstr(name)) {
 				char message[256] = "";
 				const char *ua = switch_channel_get_variable(tech_pvt->channel, "sip_user_agent");
@@ -2176,9 +2163,6 @@ static switch_status_t sofia_receive_message(switch_core_session_t *session, swi
 
 						tech_pvt->last_sent_callee_id_name = switch_core_session_strdup(tech_pvt->session, name);
 						tech_pvt->last_sent_callee_id_number = switch_core_session_strdup(tech_pvt->session, number);
-
-						switch_channel_set_variable(channel, "last_sent_callee_id_name", name);
-						switch_channel_set_variable(channel, "last_sent_callee_id_number", number);
 						
 
 						if (switch_event_create(&event, SWITCH_EVENT_CALL_UPDATE) == SWITCH_STATUS_SUCCESS) {
@@ -2203,8 +2187,6 @@ static switch_status_t sofia_receive_message(switch_core_session_t *session, swi
 					}
 				}
 			}
-
-			switch_safe_free(arg);
 		}
 		break;
 
diff --git a/src/switch_core_session.c b/src/switch_core_session.c
index 4e6836ddce..54be1431ac 100644
--- a/src/switch_core_session.c
+++ b/src/switch_core_session.c
@@ -681,12 +681,30 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_perform_receive_message(swit
 		switch_channel_clear_flag(session->channel, CF_EARLY_MEDIA);
 	}
 
-	if (message->message_id == SWITCH_MESSAGE_INDICATE_DISPLAY &&
-		switch_true(switch_channel_get_variable(session->channel, SWITCH_IGNORE_DISPLAY_UPDATES_VARIABLE))) {
-		switch_log_printf(SWITCH_CHANNEL_ID_LOG, message->_file, message->_func, message->_line,
-						  switch_core_session_get_uuid(session), SWITCH_LOG_DEBUG1, "Ignoring display update.\n");
-		status = SWITCH_STATUS_SUCCESS;
-		goto end;
+	if (message->message_id == SWITCH_MESSAGE_INDICATE_DISPLAY) {
+		char *arg = NULL;
+
+		if (zstr(message->string_array_arg[0]) && !zstr(message->string_arg)) {
+			arg = switch_core_session_strdup(session, message->string_arg);
+			switch_separate_string(arg, '|', (char **)message->string_array_arg, 2);			
+		}
+
+		if (!zstr(message->string_array_arg[0])) {
+			switch_channel_set_variable(session->channel, "last_sent_callee_id_name", message->string_array_arg[0]);
+		}
+
+		if (!zstr(message->string_array_arg[1])) {
+			switch_channel_set_variable(session->channel, "last_sent_callee_id_number", message->string_array_arg[1]);
+		}
+		
+
+		if (switch_true(switch_channel_get_variable(session->channel, SWITCH_IGNORE_DISPLAY_UPDATES_VARIABLE))) {
+			switch_log_printf(SWITCH_CHANNEL_ID_LOG, message->_file, message->_func, message->_line,
+							  switch_core_session_get_uuid(session), SWITCH_LOG_DEBUG1, "Ignoring display update.\n");
+			status = SWITCH_STATUS_SUCCESS;
+			goto end;
+		}
+
 	}
 
 	if (switch_channel_down_nosig(session->channel) && message->message_id != SWITCH_MESSAGE_INDICATE_SIGNAL_DATA) {