diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c
index 032ea8efd7..2e51ba8674 100644
--- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c
+++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c
@@ -213,17 +213,17 @@ ftdm_status_t copy_cdPtyNum_from_sngss7(ftdm_channel_t *ftdmchan, SiCdPtyNum *cd
 
 ftdm_status_t copy_cdPtyNum_to_sngss7(ftdm_channel_t *ftdmchan, SiCdPtyNum *cdPtyNum)
 {
-	const char	*cld_nadi = NULL;
+	char	*val = NULL;
 	ftdm_caller_data_t *caller_data = &ftdmchan->caller_data;
 	sngss7_chan_data_t	*sngss7_info = ftdmchan->call_data;
 
 	cdPtyNum->eh.pres		   = PRSNT_NODEF;
 
 	cdPtyNum->natAddrInd.pres   = PRSNT_NODEF;
-	cld_nadi = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_cld_nadi");
-	if (!ftdm_strlen_zero(cld_nadi)) {
-		ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Found user supplied Called NADI value \"%s\"\n", cld_nadi);
-		cdPtyNum->natAddrInd.val	= atoi(cld_nadi);
+	val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_cld_nadi");
+	if (!ftdm_strlen_zero(val)) {
+		ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Found user supplied Called NADI value \"%s\"\n", val);
+		cdPtyNum->natAddrInd.val	= atoi(val);
 	} else {
 		cdPtyNum->natAddrInd.val	= g_ftdm_sngss7_data.cfg.isupCkt[sngss7_info->circuit->id].cld_nadi;
 		ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "No user supplied NADI value found for CLD, using \"%d\"\n", cdPtyNum->natAddrInd.val);
@@ -233,7 +233,14 @@ ftdm_status_t copy_cdPtyNum_to_sngss7(ftdm_channel_t *ftdmchan, SiCdPtyNum *cdPt
 	cdPtyNum->numPlan.val	   = 0x01;
 
 	cdPtyNum->innInd.pres	   = PRSNT_NODEF;
-	cdPtyNum->innInd.val		= 0x01;
+	val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_cld_inn");
+	if (!ftdm_strlen_zero(val)) {
+		cdPtyNum->innInd.val		= atoi(val);
+		ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Found user supplied Called INN value \"%s\"\n", val);
+	} else {
+		cdPtyNum->innInd.val		= 0x01;
+		ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "No user supplied Called INN value, set to default value 0x01\n");
+	}
 	
 	return copy_tknStr_to_sngss7(caller_data->dnis.digits, &cdPtyNum->addrSig, &cdPtyNum->oddEven);
 }
@@ -1240,32 +1247,194 @@ ftdm_status_t copy_txMedReq_to_sngss7(ftdm_channel_t *ftdmchan, SiTxMedReq *txMe
 
 ftdm_status_t copy_usrServInfoA_to_sngss7(ftdm_channel_t *ftdmchan, SiUsrServInfo *usrServInfoA)
 {
-	usrServInfoA->eh.pres			= PRSNT_NODEF;
+	int bProceed = 0;
+	const char *val = NULL;
+	
+	val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_iam_usi_trans_cap");
+	if (!ftdm_strlen_zero(val)) {
+		int itc_type = 0;
+		if (!strcasecmp(val, "SPEECH")) {
+			itc_type = ITC_SPEECH;
+		} else if (!strcasecmp(val, "UNRESTRICTED")) {
+			itc_type = ITC_UNRDIG;
+		} else if (!strcasecmp(val, "RESTRICTED")) {
+			itc_type = ITC_RESDIG;
+		} else if (!strcasecmp(val, "31KHZ")) {
+			itc_type = ITC_A31KHZ;
+		} else if (!strcasecmp(val, "7KHZ")) {
+			itc_type = ITC_A7KHZ;
+		} else if (!strcasecmp(val, "15KHZ")) {
+			itc_type = ITC_A15KHZ;
+		} else if (!strcasecmp(val, "VIDEO")) {
+			itc_type = ITC_VIDEO;
+		} else {
+			itc_type = ITC_SPEECH;
+			ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "USI transmission capability parameter is wrong : %s. Setting to default SPEECH. \n", val );
+		}
+		
+		usrServInfoA->infoTranCap.pres	= PRSNT_NODEF;
+		usrServInfoA->infoTranCap.val = get_trillium_val(bc_cap_codes, ftdmchan->caller_data.bearer_capability, itc_type);
+		bProceed = 1;		
+	} else {
+		usrServInfoA->infoTranCap.pres	= NOTPRSNT;
+	}
 
-	usrServInfoA->infoTranCap.pres	= PRSNT_NODEF;
+	val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_iam_usi_code_standard");
+	if (!ftdm_strlen_zero(val)) {		
+		usrServInfoA->cdeStand.pres			= PRSNT_NODEF;
+		usrServInfoA->cdeStand.val			= (int)atoi(val);	/* default is 0x0 */
+		ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "USI coding standard = %d\n", usrServInfoA->cdeStand.val );
+		bProceed = 1;
+	} else {
+		usrServInfoA->cdeStand.pres			= NOTPRSNT;	
+	}
+	
+	val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_iam_usi_trans_mode");
+	if (!ftdm_strlen_zero(val)) {
+		usrServInfoA->tranMode.pres			= PRSNT_NODEF;
+		usrServInfoA->tranMode.val			= (int)atoi(val);				/* transfer mode, default is 0x0*/
+		ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "USI transfer mode = %d\n", usrServInfoA->tranMode.val );
+		bProceed = 1;
+	} else {
+		usrServInfoA->tranMode.pres			= NOTPRSNT;	
+	}
+	
+	val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_iam_usi_trans_rate_0");	
+	if (!ftdm_strlen_zero(val)) {
+		usrServInfoA->infoTranRate0.pres		= PRSNT_NODEF;
+		usrServInfoA->infoTranRate0.val		= (int)atoi(val);			/* default is 0x10, 64kbps origination to destination*/
+		ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "USI trans rate 0 = %d\n", usrServInfoA->infoTranRate0.val );
+		bProceed = 1;
+	} else {
+		usrServInfoA->infoTranRate0.pres		= NOTPRSNT;	
+	}
+	
+	val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_iam_usi_trans_rate_1");
+	if (!ftdm_strlen_zero(val)) {
+		usrServInfoA->infoTranRate1.pres		= PRSNT_NODEF;
+		usrServInfoA->infoTranRate1.val		= (int)atoi(val);			/* 64kbps destination to origination, default is 0x10 */
+		ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "USI trans rate 1 = %d\n", usrServInfoA->infoTranRate1.val );
+		bProceed = 1;
+	} else {
+		usrServInfoA->infoTranRate1.pres		= NOTPRSNT;
+	}
+	
+	val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_iam_usi_layer1_ident");
+	if (!ftdm_strlen_zero(val)) {		
+		usrServInfoA->lyr1Ident.pres			= PRSNT_NODEF;
+		usrServInfoA->lyr1Ident.val			= (int)atoi(val);		/*default value is 0x01 */
+		ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "USI layer 1 indentification = %d\n", usrServInfoA->lyr1Ident.val );
+		bProceed = 1;
+	} else {
+		usrServInfoA->lyr1Ident.pres			= NOTPRSNT;	
+	}
+	
+	val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_iam_usi_layer1_prot");
+	if (!ftdm_strlen_zero(val)) {
+		usrServInfoA->usrInfLyr1Prot.pres		= PRSNT_NODEF;
+		usrServInfoA->usrInfLyr1Prot.val		= (int)atoi(val);		/*default value is 0x02 */
+		ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "USI layer 1 protocol = %d\n", usrServInfoA->usrInfLyr1Prot.val );
+		bProceed = 1;
+	} else {
+		usrServInfoA->usrInfLyr1Prot.pres		= NOTPRSNT;
+	}
+	
+	val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_iam_usi_layer2_ident");
+	if (!ftdm_strlen_zero(val)) {
+		usrServInfoA->lyr2Ident.pres			= PRSNT_NODEF;
+		usrServInfoA->lyr2Ident.val			= (int)atoi(val);		/*default value is 0x01 */
+		ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "USI layer 2 indentification = %d\n", usrServInfoA->lyr2Ident.val );
+		bProceed = 1;
+	} else {
+		usrServInfoA->lyr2Ident.pres			= NOTPRSNT;	
+	}
+	
+	val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_iam_usi_layer2_prot");
+	if (!ftdm_strlen_zero(val)) {
+		usrServInfoA->usrInfLyr2Prot.pres		= PRSNT_NODEF;
+		usrServInfoA->usrInfLyr2Prot.val		= (int)atoi(val);		/*default value is 0x02 */
+		ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "USI layer 2 protocol = %d\n", usrServInfoA->usrInfLyr2Prot.val );
+		bProceed = 1;
+	} else {
+		usrServInfoA->usrInfLyr2Prot.pres		= NOTPRSNT;	
+	}
+	
+	val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_iam_usi_layer3_ident");
+	if (!ftdm_strlen_zero(val)) {
+		usrServInfoA->lyr3Ident.pres			= PRSNT_NODEF;
+		usrServInfoA->lyr3Ident.val			= (int)atoi(val);		/*default value is 0x01 */
+		ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "USI layer 3 indentification = %d\n", usrServInfoA->lyr3Ident.val );
+		bProceed = 1;
+	} else {
+		usrServInfoA->lyr3Ident.pres			= NOTPRSNT;
+	}
+	
+	val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_iam_usi_layer3_prot");
+	if (!ftdm_strlen_zero(val)) {
+		usrServInfoA->usrInfLyr3Prot.pres		= PRSNT_NODEF;
+		usrServInfoA->usrInfLyr3Prot.val		= (int)atoi(val);		/*default value is 0x02 */
+		ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "USI layer 3 protocol = %d\n", usrServInfoA->usrInfLyr3Prot.val );
+		bProceed = 1;
+	} else {
+		usrServInfoA->usrInfLyr3Prot.pres		= NOTPRSNT;
+	}
+	
+	val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_iam_usi_chan_struct");
+	if (!ftdm_strlen_zero(val)) {
+		usrServInfoA->chanStruct.pres			= PRSNT_NODEF;
+		usrServInfoA->chanStruct.val			= (int)atoi(val);                          /* default value is 0x1, 8kHz integrity */
+		ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "USI channel structure = %d\n", usrServInfoA->chanStruct.val );
+		bProceed = 1;
+	} else {
+		usrServInfoA->chanStruct.pres			= NOTPRSNT;
+	}
+	
+	val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_iam_usi_config");
+	if (!ftdm_strlen_zero(val)) {
+		usrServInfoA->config.pres				= PRSNT_NODEF;
+		usrServInfoA->config.val				= (int)atoi(val);                          /* default value is 0x0, point to point configuration */
+		ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "USI configuration = %d\n", usrServInfoA->config.val );
+		bProceed = 1;
+	} else {
+		usrServInfoA->config.pres				= NOTPRSNT;	
+	}
+	
+	val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_iam_usi_establish");
+	if (!ftdm_strlen_zero(val)) {
+		usrServInfoA->establish.pres			= PRSNT_NODEF;
+		usrServInfoA->establish.val			= (int)atoi(val);                           /* default value is 0x0, on demand */
+		ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "USI establishment = %d\n", usrServInfoA->establish.val );
+		bProceed = 1;
+	} else {
+		usrServInfoA->establish.pres			= NOTPRSNT;	
+	}
+	
+	val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_iam_usi_symmetry");
+	if (!ftdm_strlen_zero(val)) {
+		usrServInfoA->symmetry.pres			= PRSNT_NODEF;
+		usrServInfoA->symmetry.val			= (int)atoi(val);                           /* default value is 0x0, bi-directional symmetric */
+		ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "USI symmetry = %d\n", usrServInfoA->symmetry.val );
+		bProceed = 1;
+	} else {
+		usrServInfoA->symmetry.pres			= NOTPRSNT;	
+	}
+	
+	val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_iam_usi_rate_multiplier");
+	if (!ftdm_strlen_zero(val)) {
+		usrServInfoA->rateMultiplier.pres		= PRSNT_NODEF;
+		usrServInfoA->rateMultiplier.val		= (int)atoi(val);                           /* default value is 0x1, 1x rate multipler */
+		ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "USI rate multipier = %d\n", usrServInfoA->rateMultiplier.val );
+		bProceed = 1;
+	} else {
+		usrServInfoA->rateMultiplier.pres		= NOTPRSNT;
+	}
+	
+	if (bProceed) {
+		usrServInfoA->eh.pres				= PRSNT_NODEF;
+	} else {
+		usrServInfoA->eh.pres				= NOTPRSNT;
+	}
 
-	usrServInfoA->infoTranCap.val = get_trillium_val(bc_cap_codes, ftdmchan->caller_data.bearer_capability, ITC_SPEECH);
-
-	usrServInfoA->cdeStand.pres			= PRSNT_NODEF;
-	usrServInfoA->cdeStand.val			= 0x0;				/* ITU-T standardized coding */
-	usrServInfoA->tranMode.pres			= PRSNT_NODEF;
-	usrServInfoA->tranMode.val			= 0x0;				/* circuit mode */
-	usrServInfoA->infoTranRate0.pres		= PRSNT_NODEF;
-	usrServInfoA->infoTranRate0.val		= 0x10;				/* 64kbps origination to destination */
-	usrServInfoA->infoTranRate1.pres		= PRSNT_NODEF;
-	usrServInfoA->infoTranRate1.val		= 0x10;				/* 64kbps destination to origination */
-	usrServInfoA->chanStruct.pres		= PRSNT_NODEF;
-	usrServInfoA->chanStruct.val			= 0x1;				/* 8kHz integrity */
-	usrServInfoA->config.pres			= PRSNT_NODEF;
-	usrServInfoA->config.val				= 0x0;				/* point to point configuration */
-	usrServInfoA->establish.pres			= PRSNT_NODEF;
-	usrServInfoA->establish.val			= 0x0;				/* on demand */
-	usrServInfoA->symmetry.pres			= PRSNT_NODEF;
-	usrServInfoA->symmetry.val			= 0x0;				/* bi-directional symmetric */
-	usrServInfoA->usrInfLyr1Prot.pres	= PRSNT_NODEF;
-	usrServInfoA->usrInfLyr1Prot.val		= 0x2;				/* G.711 ulaw */
-	usrServInfoA->rateMultiplier.pres	= PRSNT_NODEF;
-	usrServInfoA->rateMultiplier.val		= 0x1;				/* 1x rate multipler */
 	return FTDM_SUCCESS;
 }