diff --git a/libs/freetdm/mod_freetdm/mod_freetdm.c b/libs/freetdm/mod_freetdm/mod_freetdm.c
index 78874de059..4dc6cfcfd2 100755
--- a/libs/freetdm/mod_freetdm/mod_freetdm.c
+++ b/libs/freetdm/mod_freetdm/mod_freetdm.c
@@ -1552,6 +1552,8 @@ ftdm_status_t ftdm_channel_from_event(ftdm_sigmsg_t *sigmsg, switch_core_session
 	switch_channel_set_variable_printf(channel, "freetdm_chan_number", "%d", chanid);
 	switch_channel_set_variable_printf(channel, "freetdm_bearer_capability", "%d", channel_caller_data->bearer_capability);	
 	switch_channel_set_variable_printf(channel, "freetdm_bearer_layer1", "%d", channel_caller_data->bearer_layer1);
+	switch_channel_set_variable_printf(channel, "freetdm_screening_ind", ftdm_screening2str(channel_caller_data->screen));
+	switch_channel_set_variable_printf(channel, "freetdm_presentation_ind", ftdm_presentation2str(channel_caller_data->pres));
 	
 	if (globals.sip_headers) {
 		switch_channel_set_variable(channel, "sip_h_X-FreeTDM-SpanName", ftdm_channel_get_span_name(sigmsg->channel));
@@ -1580,21 +1582,13 @@ ftdm_status_t ftdm_channel_from_event(ftdm_sigmsg_t *sigmsg, switch_core_session
 	if (channel_caller_data->raw_data_len) {
 		switch_channel_set_variable_printf(channel, "freetdm_custom_call_data", "%s", channel_caller_data->raw_data);
 	}
-	/* Add any channel variable to the dial plan */
-	iter = ftdm_channel_get_var_iterator(sigmsg->channel, NULL);
-	for (curr = iter ; curr; curr = ftdm_iterator_next(curr)) {
-		ftdm_channel_get_current_var(curr, &var_name, &var_value);
-		snprintf(name, sizeof(name), FREETDM_VAR_PREFIX "%s", var_name);
-		switch_channel_set_variable_printf(channel, name, "%s", var_value);
-	}	
-	
 	/* Add any call variable to the dial plan */
 	iter = ftdm_call_get_var_iterator(channel_caller_data, iter);
 	for (curr = iter ; curr; curr = ftdm_iterator_next(curr)) {
 		ftdm_call_get_current_var(curr, &var_name, &var_value);
 		snprintf(name, sizeof(name), FREETDM_VAR_PREFIX "%s", var_name);
 		switch_channel_set_variable_printf(channel, name, "%s", var_value);
-		switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Call Variable: %s=%s\n", name, var_value);
+		switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Call Variable: %s = %s\n", name, var_value);
 	}
 	ftdm_iterator_free(iter);
 	
@@ -2149,8 +2143,6 @@ static FIO_SIGNAL_CB_FUNCTION(on_clear_channel_signal)
     switch(sigmsg->event_id) {
     case FTDM_SIGEVENT_START:
 		{
-			ftdm_call_add_var(caller_data, "screening_ind", ftdm_screening2str(caller_data->screen));
-			ftdm_call_add_var(caller_data, "presentation_ind", ftdm_presentation2str(caller_data->pres));
 			return ftdm_channel_from_event(sigmsg, &session);
 		}
 		break;
@@ -2698,7 +2690,7 @@ static switch_status_t load_config(void)
 			ftdm_conf_parameter_t spanparameters[30];
 			char *id = (char *) switch_xml_attr(myspan, "id");
 			char *name = (char *) switch_xml_attr(myspan, "name");
-			char *configname = (char *) switch_xml_attr(myspan, "config");
+			char *configname = (char *) switch_xml_attr(myspan, "cfgprofile");
 			ftdm_span_t *span = NULL;
 			uint32_t span_id = 0;
 			unsigned paramindex = 0;
@@ -4259,7 +4251,9 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_freetdm_load)
 	switch_console_set_complete("add ftdm gains");
 	switch_console_set_complete("add ftdm dtmf on");
 	switch_console_set_complete("add ftdm dtmf off");
-
+	switch_console_set_complete("add ftdm core state");
+	switch_console_set_complete("add ftdm core flag");
+	switch_console_set_complete("add ftdm core calls");
 
 	SWITCH_ADD_APP(app_interface, "disable_ec", "Disable Echo Canceller", "Disable Echo Canceller", disable_ec_function, "", SAF_NONE);
 	SWITCH_ADD_APP(app_interface, "disable_dtmf", "Disable DTMF Detection", "Disable DTMF Detection", disable_dtmf_function, "", SAF_NONE);
diff --git a/libs/freetdm/src/ftdm_io.c b/libs/freetdm/src/ftdm_io.c
index bd4e896dad..260892ada0 100644
--- a/libs/freetdm/src/ftdm_io.c
+++ b/libs/freetdm/src/ftdm_io.c
@@ -65,7 +65,6 @@ ftdm_time_t time_current_throttle_log = 0;
 static ftdm_iterator_t *get_iterator(ftdm_iterator_type_t type, ftdm_iterator_t *iter);
 static ftdm_status_t ftdm_call_set_call_id(ftdm_channel_t *fchan, ftdm_caller_data_t *caller_data);
 static ftdm_status_t ftdm_call_clear_call_id(ftdm_caller_data_t *caller_data);
-static ftdm_status_t ftdm_channel_clear_vars(ftdm_channel_t *ftdmchan);
 static ftdm_status_t ftdm_channel_done(ftdm_channel_t *ftdmchan);
 
 static int time_is_init = 0;
@@ -2633,7 +2632,6 @@ static ftdm_status_t ftdm_channel_done(ftdm_channel_t *ftdmchan)
 	ftdm_buffer_destroy(&ftdmchan->pre_buffer);
 	ftdmchan->pre_buffer_size = 0;
 	ftdm_mutex_unlock(ftdmchan->pre_buffer_mutex);
-	ftdm_channel_clear_vars(ftdmchan);
 	if (ftdmchan->hangup_timer) {
 		ftdm_sched_cancel_timer(globals.timingsched, ftdmchan->hangup_timer);
 	}
@@ -4033,20 +4031,13 @@ done:
 }
 
 FT_DECLARE(void) ftdm_call_clear_data(ftdm_caller_data_t *caller_data)
-{
-	ftdm_call_clear_vars(caller_data);
-	memset(&caller_data->raw_data, 0, sizeof(caller_data->raw_data));
-	caller_data->raw_data_len = 0;
-	return;
-}
-
-FT_DECLARE(ftdm_status_t) ftdm_call_clear_vars(ftdm_caller_data_t *caller_data)
 {
 	if (caller_data->variables) {
 		hashtable_destroy(caller_data->variables);
 	}
 	caller_data->variables = NULL;
-	return FTDM_SUCCESS;
+	memset(&caller_data->raw_data, 0, sizeof(caller_data->raw_data));
+	caller_data->raw_data_len = 0;
 }
 
 FT_DECLARE(ftdm_status_t) ftdm_call_remove_var(ftdm_caller_data_t *caller_data, const char *var_name)
@@ -4058,7 +4049,6 @@ FT_DECLARE(ftdm_status_t) ftdm_call_remove_var(ftdm_caller_data_t *caller_data,
 	return FTDM_SUCCESS;
 }
 
-
 FT_DECLARE(ftdm_status_t) ftdm_call_add_var(ftdm_caller_data_t *caller_data, const char *var_name, const char *value)
 {
 	char *t_name = 0, *t_val = 0;
@@ -4125,72 +4115,6 @@ FT_DECLARE(ftdm_status_t) ftdm_call_get_current_var(ftdm_iterator_t *iter, const
 	return FTDM_SUCCESS;
 }
 
-
-static ftdm_status_t ftdm_channel_clear_vars(ftdm_channel_t *ftdmchan)
-{
-	ftdm_channel_lock(ftdmchan);
-
-	if (ftdmchan->variable_hash) {
-		hashtable_destroy(ftdmchan->variable_hash);
-	}
-	ftdmchan->variable_hash = NULL;
-
-	ftdm_channel_unlock(ftdmchan);
-	return FTDM_SUCCESS;
-}
-
-FT_DECLARE(ftdm_status_t) ftdm_channel_add_var(ftdm_channel_t *ftdmchan, const char *var_name, const char *value)
-{
-	char *t_name = 0, *t_val = 0;
-
-	ftdm_status_t status = FTDM_FAIL;
-
-	if (!var_name || !value) {
-		return FTDM_FAIL;
-	}
-
-	ftdm_channel_lock(ftdmchan);
-
-	if (!ftdmchan->variable_hash) {
-		/* initialize on first use */
-		ftdmchan->variable_hash = create_hashtable(16, ftdm_hash_hashfromstring, ftdm_hash_equalkeys);
-		if (!ftdmchan->variable_hash) {
-			goto done;
-		}
-	}
-
-	t_name = ftdm_strdup(var_name);
-	t_val = ftdm_strdup(value);
-
-	hashtable_insert(ftdmchan->variable_hash, t_name, t_val, HASHTABLE_FLAG_FREE_KEY | HASHTABLE_FLAG_FREE_VALUE);
-
-	status = FTDM_SUCCESS;
-
-done:
-	ftdm_channel_unlock(ftdmchan);
-
-	return status;
-}
-
-
-FT_DECLARE(const char *) ftdm_channel_get_var(ftdm_channel_t *ftdmchan, const char *var_name)
-{
-	const char *var = NULL;
-
-	ftdm_channel_lock(ftdmchan);
-
-	if (!ftdmchan->variable_hash || !var_name) {
-		goto done;
-	}
-	
-	var = (const char *)hashtable_search(ftdmchan->variable_hash, (void *)var_name);
-
-done:
-	ftdm_channel_unlock(ftdmchan);
-
-	return var;
-}
-
 static ftdm_iterator_t *get_iterator(ftdm_iterator_type_t type, ftdm_iterator_t *iter)
 {
 	int allocated = 0;
@@ -4215,25 +4139,6 @@ static ftdm_iterator_t *get_iterator(ftdm_iterator_type_t type, ftdm_iterator_t
 	return iter;
 }
 
-FT_DECLARE(ftdm_iterator_t *) ftdm_channel_get_var_iterator(const ftdm_channel_t *ftdmchan, ftdm_iterator_t *iter)
-{
-	ftdm_hash_iterator_t *hashiter = NULL;
-	ftdm_channel_lock(ftdmchan);
-	hashiter = ftdmchan->variable_hash == NULL ? NULL : hashtable_first(ftdmchan->variable_hash);
-	ftdm_channel_unlock(ftdmchan);
-
-
-	if (hashiter == NULL) {
-		return NULL;
-	}
-	
-	if (!(iter = get_iterator(FTDM_ITERATOR_VARS, iter))) {
-		return NULL;
-	}
-	iter->pvt.hashiter = hashiter;
-	return iter;
-}
-
 FT_DECLARE(ftdm_iterator_t *) ftdm_span_get_chan_iterator(const ftdm_span_t *span, ftdm_iterator_t *iter)
 {
 	if (!(iter = get_iterator(FTDM_ITERATOR_CHANS, iter))) {
@@ -4244,24 +4149,6 @@ FT_DECLARE(ftdm_iterator_t *) ftdm_span_get_chan_iterator(const ftdm_span_t *spa
 	return iter;
 }
 
-FT_DECLARE(ftdm_status_t) ftdm_channel_get_current_var(ftdm_iterator_t *iter, const char **var_name, const char **var_val)
-{
-	const void *key = NULL;
-	void *val = NULL;
-
-	*var_name = NULL;
-	*var_val = NULL;
-
-	ftdm_assert_return(iter && (iter->type == FTDM_ITERATOR_VARS) && iter->pvt.hashiter, FTDM_FAIL, "Cannot get variable from invalid iterator!\n");
-
-	hashtable_this(iter->pvt.hashiter, &key, NULL, &val);
-
-	*var_name = key;
-	*var_val = val;
-
-	return FTDM_SUCCESS;
-}
-
 FT_DECLARE(ftdm_iterator_t *) ftdm_iterator_next(ftdm_iterator_t *iter)
 {
 	ftdm_assert_return(iter && iter->type, NULL, "Invalid iterator\n");
@@ -5532,6 +5419,7 @@ FT_DECLARE(ftdm_status_t) ftdm_span_send_signal(ftdm_span_t *span, ftdm_sigmsg_t
 		sigmsg->chan_id = sigmsg->channel->chan_id;
 		sigmsg->span_id = sigmsg->channel->span_id;
 		sigmsg->call_id = sigmsg->channel->caller_data.call_id;
+		sigmsg->call_priv = sigmsg->channel->caller_data.priv;
 	}
 	
 	/* some core things to do on special events */
@@ -5563,10 +5451,6 @@ FT_DECLARE(ftdm_status_t) ftdm_span_send_signal(ftdm_span_t *span, ftdm_sigmsg_t
 			}
 			ftdm_set_flag(sigmsg->channel, FTDM_CHANNEL_CALL_STARTED);
 			ftdm_call_set_call_id(sigmsg->channel, &sigmsg->channel->caller_data);
-			if (sigmsg->channel->dtmfdbg.requested) {
-				ftdm_channel_command(sigmsg->channel, FTDM_COMMAND_ENABLE_DEBUG_DTMF, NULL);
-			}
-
 			/* when cleaning up the public API I added this because mod_freetdm.c on_fxs_signal was
 			* doing it during SIGEVENT_START, but now that flags are private they can't, wonder if
 			* is needed at all?
diff --git a/libs/freetdm/src/ftmod/ftmod_r2/ftmod_r2.c b/libs/freetdm/src/ftmod/ftmod_r2/ftmod_r2.c
index d86fb43195..4265c9b8fa 100644
--- a/libs/freetdm/src/ftmod/ftmod_r2/ftmod_r2.c
+++ b/libs/freetdm/src/ftmod/ftmod_r2/ftmod_r2.c
@@ -676,12 +676,6 @@ static void ftdm_r2_on_call_offered(openr2_chan_t *r2chan, const char *ani, cons
 	ftdm_log_chan(ftdmchan, FTDM_LOG_NOTICE, "Call offered with ANI = %s, DNIS = %s, Category = %d, ANI restricted = %s\n", 
 			ani, dnis, category, ani_restricted ? "Yes" : "No");
 
-	/* nothing went wrong during call setup, MF has ended, we can and must disable the MF dump */
-	if (r2data->mf_dump_size) {
-		ftdm_channel_command(ftdmchan, FTDM_COMMAND_DISABLE_INPUT_DUMP, NULL);
-		ftdm_channel_command(ftdmchan, FTDM_COMMAND_DISABLE_OUTPUT_DUMP, NULL);
-	}
-
 	/* check if this is a collect call and if we should accept it */
 	if (!r2data->allow_collect_calls && category == OR2_CALLING_PARTY_CATEGORY_COLLECT_CALL) {
 		ftdm_log_chan_msg(ftdmchan, FTDM_LOG_NOTICE, "Rejecting collect call\n");
@@ -725,9 +719,10 @@ static void dump_mf(openr2_chan_t *r2chan)
 	if (r2data->mf_dump_size) {
 		char *logname = R2CALL(ftdmchan)->logname;
 		
-		ftdm_log_chan(ftdmchan, FTDM_LOG_ERROR, "Dumping IO output in prefix %s\n", logname);
-		snprintf(dfile, sizeof(dfile), logname ? "%s.s%dc%d.input.alaw" : "%s/s%dc%d.input.alaw", 
-				logname ? logname : r2data->logdir, ftdmchan->span_id, ftdmchan->chan_id);
+		ftdm_log_chan(ftdmchan, FTDM_LOG_ERROR, "Dumping IO output in prefix %s\n", !ftdm_strlen_zero(logname)
+				? logname : r2data->logdir);
+		snprintf(dfile, sizeof(dfile), !ftdm_strlen_zero(logname) ? "%s.s%dc%d.input.alaw" : "%s/s%dc%d.input.alaw", 
+				!ftdm_strlen_zero(logname) ? logname : r2data->logdir, ftdmchan->span_id, ftdmchan->chan_id);
 		f = fopen(dfile, "wb");
 		if (f) {
 			ftdm_log_chan(ftdmchan, FTDM_LOG_ERROR, "Dumping IO input in file %s\n", dfile);
@@ -737,8 +732,8 @@ static void dump_mf(openr2_chan_t *r2chan)
 			ftdm_log_chan(ftdmchan, FTDM_LOG_ERROR, "Could not dump IO input in file %s, error: %s", dfile, strerror(errno));
 		}
 
-		snprintf(dfile, sizeof(dfile), logname ? "%s.s%dc%d.output.alaw" : "%s/s%dc%d.output.alaw", 
-				logname ? logname : r2data->logdir, ftdmchan->span_id, ftdmchan->chan_id);
+		snprintf(dfile, sizeof(dfile), !ftdm_strlen_zero(logname) ? "%s.s%dc%d.output.alaw" : "%s/s%dc%d.output.alaw", 
+				!ftdm_strlen_zero(logname) ? logname : r2data->logdir, ftdmchan->span_id, ftdmchan->chan_id);
 		f = fopen(dfile, "wb");
 		if (f) {
 			ftdm_log_chan(ftdmchan, FTDM_LOG_ERROR, "Dumping IO output in file %s\n", dfile);
@@ -769,6 +764,12 @@ static void ftdm_r2_on_call_accepted(openr2_chan_t *r2chan, openr2_call_mode_t m
 	
 	R2CALL(ftdmchan)->accepted = 1;
 
+	/* nothing went wrong during call setup, MF has ended, we can and must disable the MF dump */
+	if (r2data->mf_dump_size) {
+		ftdm_channel_command(ftdmchan, FTDM_COMMAND_DISABLE_INPUT_DUMP, NULL);
+		ftdm_channel_command(ftdmchan, FTDM_COMMAND_DISABLE_OUTPUT_DUMP, NULL);
+	}
+
 	if (OR2_DIR_BACKWARD == openr2_chan_get_direction(r2chan)) {
 		if (R2CALL(ftdmchan)->answer_pending) {
 			ftdm_log_chan_msg(ftdmchan, FTDM_LOG_DEBUG, "Answer was pending, answering now.\n");
@@ -777,11 +778,6 @@ static void ftdm_r2_on_call_accepted(openr2_chan_t *r2chan, openr2_call_mode_t m
 			return;
 		}
 	} else {
-		/* nothing went wrong during call setup, MF has ended, we can and must disable the MF dump */
-		if (r2data->mf_dump_size) {
-			ftdm_channel_command(ftdmchan, FTDM_COMMAND_DISABLE_INPUT_DUMP, NULL);
-			ftdm_channel_command(ftdmchan, FTDM_COMMAND_DISABLE_OUTPUT_DUMP, NULL);
-		}
 		ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_PROGRESS_MEDIA);
 	}
 }
diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn.c b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn.c
index 5702b72fa2..608b0b6ac0 100644
--- a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn.c
+++ b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn.c
@@ -912,9 +912,6 @@ static FIO_CHANNEL_OUTGOING_CALL_FUNCTION(ftdm_sangoma_isdn_outgoing_call)
 	sngisdn_chan_data_t  *sngisdn_info = ftdmchan->call_data;
 	ftdm_status_t status = FTDM_FAIL;	
 	
-	/* lock the channel while we check whether it is availble */
-	ftdm_channel_lock(ftdmchan);
-
 	switch (ftdmchan->state) {
 
 		case FTDM_CHANNEL_STATE_DOWN:
@@ -939,10 +936,9 @@ static FIO_CHANNEL_OUTGOING_CALL_FUNCTION(ftdm_sangoma_isdn_outgoing_call)
 			ftdm_log_chan_msg(ftdmchan, FTDM_LOG_WARNING, "Outgoing call requested channel in already in use\n");
 			status = FTDM_BREAK;
 		}
-		break;		  
+		break;
 	}
 
-	ftdm_channel_unlock(ftdmchan);
 	return status;
 }
 static FIO_CHANNEL_GET_SIG_STATUS_FUNCTION(ftdm_sangoma_isdn_get_chan_sig_status)
diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c
index 0298429109..280107acd0 100644
--- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c
+++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c
@@ -680,8 +680,8 @@ static ftdm_status_t handle_print_usuage(ftdm_stream_handle_t *stream)
 	stream->write_function(stream, "ftdm ss7 set mtrace X Y\n");
 	stream->write_function(stream, "\n");
 	stream->write_function(stream, "Ftmod_sangoma_ss7 information:\n");
-	stream->write_function(stream, "ftdm ss7 show status link X\n");
-	stream->write_function(stream, "ftdm ss7 show status linkset X\n");
+	stream->write_function(stream, "ftdm ss7 show status mtp3 X\n");
+	stream->write_function(stream, "ftdm ss7 show status mtp2 X\n");
 	stream->write_function(stream, "ftdm ss7 show status span X chan Y\n");
 	stream->write_function(stream, "ftdm ss7 show free span X chan Y\n");
 	stream->write_function(stream, "ftdm ss7 show inuse span X chan Y\n");
diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c
index 06b0b2183e..918b284de1 100644
--- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c
+++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c
@@ -299,7 +299,7 @@ void ft_to_sngss7_iam (ftdm_channel_t * ftdmchan)
 							ftdmchan->caller_data.dnis.digits,
 							iam.cdPtyNum.natAddrInd.val);
 
-	ftdm_call_clear_vars(&ftdmchan->caller_data);
+	ftdm_call_clear_data(&ftdmchan->caller_data);
 	SS7_FUNC_TRACE_EXIT (__FUNCTION__);
 	return;
 }
@@ -379,7 +379,7 @@ void ft_to_sngss7_acm (ftdm_channel_t * ftdmchan)
 						ADDRCMPLT);
 	
 	SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx ACM\n", sngss7_info->circuit->cic);
-	ftdm_call_clear_vars(&ftdmchan->caller_data);
+	ftdm_call_clear_data(&ftdmchan->caller_data);
 	SS7_FUNC_TRACE_EXIT (__FUNCTION__);
 	return;
 }
@@ -403,7 +403,7 @@ void ft_to_sngss7_anm (ftdm_channel_t * ftdmchan)
 						5);
 
   SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx ANM\n", sngss7_info->circuit->cic);
-  ftdm_call_clear_vars(&ftdmchan->caller_data);
+  ftdm_call_clear_data(&ftdmchan->caller_data);
   SS7_FUNC_TRACE_EXIT (__FUNCTION__);
   return;
 }
@@ -438,7 +438,7 @@ void ft_to_sngss7_rel (ftdm_channel_t * ftdmchan)
 	SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx REL cause=%d \n",
 							sngss7_info->circuit->cic,
 							ftdmchan->caller_data.hangup_cause );
-	ftdm_call_clear_vars(&ftdmchan->caller_data);
+	ftdm_call_clear_data(&ftdmchan->caller_data);
 	SS7_FUNC_TRACE_EXIT (__FUNCTION__);
 	return;
 }
@@ -461,7 +461,7 @@ void ft_to_sngss7_rlc (ftdm_channel_t * ftdmchan)
 						&rlc);
 	
 	SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx RLC\n", sngss7_info->circuit->cic);
-	ftdm_call_clear_vars(&ftdmchan->caller_data);
+	ftdm_call_clear_data(&ftdmchan->caller_data);
 	SS7_FUNC_TRACE_EXIT (__FUNCTION__);
 	return;
 }
@@ -482,7 +482,7 @@ void ft_to_sngss7_rsc (ftdm_channel_t * ftdmchan)
 						NULL);
 	
 	SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx RSC\n", sngss7_info->circuit->cic);
-	ftdm_call_clear_vars(&ftdmchan->caller_data);
+	ftdm_call_clear_data(&ftdmchan->caller_data);
 	SS7_FUNC_TRACE_EXIT (__FUNCTION__);
 	return;
 }
@@ -503,7 +503,7 @@ void ft_to_sngss7_rsca (ftdm_channel_t * ftdmchan)
 						NULL);
 	
 	SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx RSC-RLC\n", sngss7_info->circuit->cic);
-	ftdm_call_clear_vars(&ftdmchan->caller_data);
+	ftdm_call_clear_data(&ftdmchan->caller_data);
 	SS7_FUNC_TRACE_EXIT (__FUNCTION__);
   return;
 }
@@ -524,7 +524,7 @@ void ft_to_sngss7_blo (ftdm_channel_t * ftdmchan)
 						NULL);
 	
 	SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx BLO\n", sngss7_info->circuit->cic);
-	ftdm_call_clear_vars(&ftdmchan->caller_data);
+	ftdm_call_clear_data(&ftdmchan->caller_data);
 	SS7_FUNC_TRACE_EXIT (__FUNCTION__);
 	return;
 }
@@ -545,7 +545,7 @@ void ft_to_sngss7_bla (ftdm_channel_t * ftdmchan)
 						NULL);
 	
 	SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx BLA\n", sngss7_info->circuit->cic);
-	ftdm_call_clear_vars(&ftdmchan->caller_data);
+	ftdm_call_clear_data(&ftdmchan->caller_data);
 	SS7_FUNC_TRACE_EXIT (__FUNCTION__);
 	return;
 }
@@ -567,7 +567,7 @@ ft_to_sngss7_ubl (ftdm_channel_t * ftdmchan)
 						NULL);
 	
 	SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx UBL\n", sngss7_info->circuit->cic);
-	ftdm_call_clear_vars(&ftdmchan->caller_data);
+	ftdm_call_clear_data(&ftdmchan->caller_data);
 	SS7_FUNC_TRACE_EXIT (__FUNCTION__);
 	return;
 }
@@ -588,7 +588,7 @@ void ft_to_sngss7_uba (ftdm_channel_t * ftdmchan)
 						NULL);
 	
 	SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx UBA\n", sngss7_info->circuit->cic);
-	ftdm_call_clear_vars(&ftdmchan->caller_data);
+	ftdm_call_clear_data(&ftdmchan->caller_data);
 	SS7_FUNC_TRACE_EXIT (__FUNCTION__);
 	return;
 }
@@ -609,7 +609,7 @@ void ft_to_sngss7_lpa (ftdm_channel_t * ftdmchan)
 						NULL);
 	
 	SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx LPA\n", sngss7_info->circuit->cic);
-	ftdm_call_clear_vars(&ftdmchan->caller_data);
+	ftdm_call_clear_data(&ftdmchan->caller_data);
 	SS7_FUNC_TRACE_EXIT (__FUNCTION__);
 return;
 }
@@ -654,7 +654,7 @@ void ft_to_sngss7_gra (ftdm_channel_t * ftdmchan)
 							sngss7_info->circuit->cic,
 							(sngss7_info->circuit->cic + sngss7_span->rx_grs.range));
 	
-	ftdm_call_clear_vars(&ftdmchan->caller_data);
+	ftdm_call_clear_data(&ftdmchan->caller_data);
 	SS7_FUNC_TRACE_EXIT (__FUNCTION__);
 	return;
 }
@@ -688,7 +688,7 @@ void ft_to_sngss7_grs (ftdm_channel_t * ftdmchan)
 							sngss7_info->circuit->cic,
 							(sngss7_info->circuit->cic + sngss7_span->tx_grs.range));
 
-	ftdm_call_clear_vars(&ftdmchan->caller_data);
+	ftdm_call_clear_data(&ftdmchan->caller_data);
 	SS7_FUNC_TRACE_EXIT (__FUNCTION__);
 return;
 }
@@ -737,7 +737,7 @@ void ft_to_sngss7_cgba(ftdm_channel_t * ftdmchan)
 
 	/* clean out the saved data */
 	memset(&sngss7_span->rx_cgb, 0x0, sizeof(sngss7_group_data_t));
-	ftdm_call_clear_vars(&ftdmchan->caller_data);
+	ftdm_call_clear_data(&ftdmchan->caller_data);
 	SS7_FUNC_TRACE_EXIT (__FUNCTION__);
 	return;
 }
@@ -787,7 +787,7 @@ void ft_to_sngss7_cgua(ftdm_channel_t * ftdmchan)
 	/* clean out the saved data */
 	memset(&sngss7_span->rx_cgu, 0x0, sizeof(sngss7_group_data_t));
 
-	ftdm_call_clear_vars(&ftdmchan->caller_data);
+	ftdm_call_clear_data(&ftdmchan->caller_data);
 	SS7_FUNC_TRACE_EXIT (__FUNCTION__);
 	return;
 }
@@ -838,7 +838,7 @@ void ft_to_sngss7_cgb(ftdm_channel_t * ftdmchan)
 	/* clean out the saved data */
 	memset(&sngss7_span->tx_cgb, 0x0, sizeof(sngss7_group_data_t));
 
-	ftdm_call_clear_vars(&ftdmchan->caller_data);
+	ftdm_call_clear_data(&ftdmchan->caller_data);
 	SS7_FUNC_TRACE_EXIT (__FUNCTION__);
 	return;
 }
@@ -889,7 +889,7 @@ void ft_to_sngss7_cgu(ftdm_channel_t * ftdmchan)
 	/* clean out the saved data */
 	memset(&sngss7_span->tx_cgu, 0x0, sizeof(sngss7_group_data_t));
 
-	ftdm_call_clear_vars(&ftdmchan->caller_data);
+	ftdm_call_clear_data(&ftdmchan->caller_data);
 	SS7_FUNC_TRACE_EXIT (__FUNCTION__);
 	return;
 }
diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c
index 2f67d3fee7..166fe5dc04 100644
--- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c
+++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c
@@ -2833,7 +2833,7 @@ static int ftmod_ss7_fill_in_ccSpan(sng_ccSpan_t *ccSpan)
 		}
 
 		/* find a spot for this circuit in the global structure */
-		x = (ccSpan->procId * 1000);
+		x = (ccSpan->procId * 1000) + 1;
 		flag = 0;
 		while (flag == 0) {
 		/**********************************************************************/
diff --git a/libs/freetdm/src/include/freetdm.h b/libs/freetdm/src/include/freetdm.h
index 588dc311b6..ef7843e5cc 100644
--- a/libs/freetdm/src/include/freetdm.h
+++ b/libs/freetdm/src/include/freetdm.h
@@ -554,6 +554,7 @@ struct ftdm_sigmsg {
 	uint32_t chan_id; /*!< easy access to chan id */
 	uint32_t span_id; /*!< easy access to span_id */
 	uint32_t call_id; /*!< unique call id for this call */
+	void *call_priv; /*!< Private data for the FreeTDM user from ftdm_caller_data->priv */
 	union {
 		ftdm_event_sigstatus_t sigstatus; /*!< valid if event_id is FTDM_SIGEVENT_SIGSTATUS_CHANGED */
 		ftdm_event_trace_t trace;	/*!< valid if event_id is FTDM_SIGEVENT_TRACE or FTDM_SIGEVENT_TRACE_RAW */
@@ -1368,34 +1369,12 @@ FT_DECLARE(ftdm_status_t) ftdm_channel_read(ftdm_channel_t *ftdmchan, void *data
  */
 FT_DECLARE(ftdm_status_t) ftdm_channel_write(ftdm_channel_t *ftdmchan, void *data, ftdm_size_t datasize, ftdm_size_t *datalen);
 
-/*! \brief Add a custom variable to the channel
- *  \note This variables may be used by signaling modules to override signaling parameters
- *  \todo Document which signaling variables are available
- * */
-FT_DECLARE(ftdm_status_t) ftdm_channel_add_var(ftdm_channel_t *ftdmchan, const char *var_name, const char *value);
-
-/*! \brief Get a custom variable from the channel. 
- *  \note The variable pointer returned is only valid while the channel is open and it'll be destroyed when the channel is closed. */
-FT_DECLARE(const char *) ftdm_channel_get_var(ftdm_channel_t *ftdmchan, const char *var_name);
-
-/*! \brief Get an iterator to iterate over the channel variables
- *  \param ftdmchan The channel structure containing the variables
- *  \param iter Optional iterator. You can reuse an old iterator (not previously freed) to avoid the extra allocation of a new iterator.
- *  \note The iterator pointer returned is only valid while the channel is open and it'll be destroyed when the channel is closed. 
- *        This iterator is completely non-thread safe, if you are adding variables or removing variables while iterating 
- *        results are unpredictable
- */
-FT_DECLARE(ftdm_iterator_t *) ftdm_channel_get_var_iterator(const ftdm_channel_t *ftdmchan, ftdm_iterator_t *iter);
-
 /*! \brief Get iterator current value (depends on the iterator type)
  *  \note Channel iterators return a pointer to ftdm_channel_t
  *        Variable iterators return a pointer to the variable name (not the variable value)
  */
 FT_DECLARE(void *) ftdm_iterator_current(ftdm_iterator_t *iter);
 
-/*! \brief Get variable name and value for the current iterator position */
-FT_DECLARE(ftdm_status_t) ftdm_channel_get_current_var(ftdm_iterator_t *iter, const char **var_name, const char **var_val);
-
 /*! \brief Advance iterator */
 FT_DECLARE(ftdm_iterator_t *) ftdm_iterator_next(ftdm_iterator_t *iter);
 
@@ -1426,23 +1405,6 @@ FT_DECLARE(ftdm_iterator_t *) ftdm_call_get_var_iterator(const ftdm_caller_data_
 /*! \brief Get variable name and value for the current iterator position */
 FT_DECLARE(ftdm_status_t) ftdm_call_get_current_var(ftdm_iterator_t *iter, const char **var_name, const char **var_val);
 
-/*! \brief Clear all variables  attached to the call
- *  \note Variables are cleared at the end of each call back, so it is not necessary for the user to call this function.
- *  \todo Document which signaling variables are available
- * */
-FT_DECLARE(ftdm_status_t) ftdm_call_clear_vars(ftdm_caller_data_t *caller_data);
-
-/*! \brief Remove a variable attached to the call
- *  \note Removes a variable that was attached to the call.
- *  \todo Document which call variables are available
- * */
-FT_DECLARE(ftdm_status_t) ftdm_call_remove_var(ftdm_caller_data_t *caller_data, const char *var_name);
-
-/*! \brief Clears all the temporary data attached to this call
- *  \note Clears caller_data->variables and caller_data->raw_data.
- * */
-FT_DECLARE(void) ftdm_call_clear_data(ftdm_caller_data_t *caller_data);
-		
 /*! \brief Get the span pointer associated to the channel */
 FT_DECLARE(ftdm_span_t *) ftdm_channel_get_span(const ftdm_channel_t *ftdmchan);
 
diff --git a/libs/freetdm/src/include/private/ftdm_core.h b/libs/freetdm/src/include/private/ftdm_core.h
index ba16c7cb7f..0de52727da 100644
--- a/libs/freetdm/src/include/private/ftdm_core.h
+++ b/libs/freetdm/src/include/private/ftdm_core.h
@@ -451,7 +451,6 @@ struct ftdm_channel {
 	struct ftdm_caller_data caller_data;
 	struct ftdm_span *span;
 	struct ftdm_io_interface *fio;
-	ftdm_hash_t *variable_hash;
 	unsigned char rx_cas_bits;
 	uint32_t pre_buffer_size;
 	uint8_t rxgain_table[FTDM_GAINS_TABLE_SIZE];
@@ -629,6 +628,24 @@ FT_DECLARE(void) ftdm_channel_clear_detected_tones(ftdm_channel_t *ftdmchan);
 FT_DECLARE(void) ftdm_set_echocancel_call_begin(ftdm_channel_t *chan);
 FT_DECLARE(void) ftdm_set_echocancel_call_end(ftdm_channel_t *chan);
 
+/*! \brief Clear all variables  attached to the call
+ *  \note Variables are cleared at the end of each call back, so it is not necessary for the user to call this function.
+ *  \todo Document which signaling variables are available
+ * */
+FT_DECLARE(ftdm_status_t) ftdm_call_clear_vars(ftdm_caller_data_t *caller_data);
+
+/*! \brief Remove a variable attached to the call
+ *  \note Removes a variable that was attached to the call.
+ *  \todo Document which call variables are available
+ * */
+FT_DECLARE(ftdm_status_t) ftdm_call_remove_var(ftdm_caller_data_t *caller_data, const char *var_name);
+
+/*! \brief Clears all the temporary data attached to this call
+ *  \note Clears caller_data->variables and caller_data->raw_data.
+ * */
+FT_DECLARE(void) ftdm_call_clear_data(ftdm_caller_data_t *caller_data);
+		
+
 /*!
   \brief Assert condition
 */
@@ -688,6 +705,9 @@ FT_DECLARE(void) ftdm_set_echocancel_call_end(ftdm_channel_t *chan);
 			if (!ftdm_test_flag((fchan), FTDM_CHANNEL_MEDIA)) { \
 				ftdm_set_flag((fchan), FTDM_CHANNEL_MEDIA); \
 				ftdm_set_echocancel_call_begin((fchan)); \
+				if ((fchan)->dtmfdbg.requested) { \
+					ftdm_channel_command((fchan), FTDM_COMMAND_ENABLE_DEBUG_DTMF, NULL); \
+				} \
 			} \
 		} while (0);