diff --git a/src/s6a/fd_init.c b/src/s6a/fd_init.c
new file mode 100644
index 0000000..b93623f
--- /dev/null
+++ b/src/s6a/fd_init.c
@@ -0,0 +1,656 @@
+/*
+ * Copyright (c) 2003-2018, Great Software Laboratory Pvt. Ltd.
+ * Copyright (c) 2017 Intel Corporation
+ * Copyright (c) 2019, Infosys Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *	   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <freeDiameter/freeDiameter-host.h>
+#include <freeDiameter/libfdcore.h>
+#include <freeDiameter/libfdproto.h>
+
+#include "log.h"
+#include "s6a.h"
+#include "s6a_fd.h"
+
+/**Globals and externs**/
+extern struct fd_dict_objects g_fd_dict_objs;
+extern struct fd_dict_data g_fd_dict_data;
+extern bool g_nolog;
+extern enum log_levels g_log_level;
+/**Globals and externs**/
+
+/**
+ * @brief Add element to freediameter message
+ * ready
+ * @param[in] val - AVP value to be added
+ * @param[in] obj - Disctionary object
+ * @param[in/out] msg_bufi
+ * @return int Sucess or failure code
+ */
+int
+add_fd_msg(union avp_value *val, struct dict_object * obj,
+		struct msg **msg_buf)
+{
+	struct avp *avp_val = NULL;
+
+	CHECK_FCT_DO(fd_msg_avp_new(obj, 0, &avp_val), return S6A_FD_ERROR);
+
+	CHECK_FCT_DO(fd_msg_avp_setvalue(avp_val, val), return S6A_FD_ERROR);
+
+	CHECK_FCT_DO(fd_msg_avp_add(*msg_buf, MSG_BRW_LAST_CHILD, avp_val),
+				return S6A_FD_ERROR);
+
+	return SUCCESS;
+}
+
+/**
+ * @brief Dumo freediameter message buffer
+ * ready
+ * @param[in] Freediameter message to print
+ * @return void
+ */
+void
+dump_fd_msg(struct msg *msg)
+{
+	//char *buf = NULL;
+	//int len = 0;
+
+	g_nolog = true;
+
+	if (g_nolog) return;
+
+	//TODO: correct - fprintf(stderr, "%s\n", fd_msg_dump_treeview(&buf, &len, NULL, msg,
+	//			fd_g_config->cnf_dict, 0, 1));
+	//free(buf);
+}
+
+/**
+ * @brief Extract last integeger representing ue index from session ID
+ * @param[in] sid - session id
+ * @param[in] sidlen - session id len
+ * @return int - eror code
+ */
+int
+get_ue_idx_from_fd_resp(unsigned char *sid, int sidlen)
+{
+	int index = -1;
+	char *tmp = strrchr((char *)sid, ';');
+
+	index = strtol(++tmp, NULL, 10);
+	log_msg(LOG_INFO, "Received resp for index %d\n", index);
+	return index;
+}
+
+/**
+ * @brief Initialize free diameter vendor info
+ * @param None
+ * @return int - eror code
+ */
+int
+s6a_fd_init()
+{
+	//TODO: check vendor id
+	vendor_id_t vendor_id = 10415;
+
+	FD_DICT_SEARCH(DICT_VENDOR, VENDOR_BY_ID, &vendor_id, g_fd_dict_objs.vendor_id);
+
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.vendor_id, &g_fd_dict_data.vendor_data),
+		return S6A_FD_ERROR);
+
+	return SUCCESS;
+}
+
+/**
+ * @brief Initialize freediameter dictionary objects
+ * @param None
+ * @return int - error code
+ */
+int
+s6a_fd_objs_init()
+{
+	//TODO: Check app id
+	application_id_t app_s6a = 16777251;
+
+	FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME, "Result-Code",
+			g_fd_dict_objs.res_code);
+
+	FD_DICT_SEARCH(DICT_APPLICATION, APPLICATION_BY_ID, &app_s6a,
+			g_fd_dict_objs.s6a_app);
+
+	FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME, "Experimental-Result",
+					g_fd_dict_objs.exp_res);
+
+	FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME, "Auth-Application-Id",
+					g_fd_dict_objs.auth_app_id);
+
+	FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME, "Session-Id",
+					g_fd_dict_objs.sess_id);
+
+	FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME, "Auth-Session-State",
+					g_fd_dict_objs.auth_sess_state);
+
+	//NI Detach
+	FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME, "Origin-Host",
+					g_fd_dict_objs.org_host);
+
+	FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME, "Origin-Realm",
+					g_fd_dict_objs.org_realm);
+	//NI Detach
+	
+	FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME, "Destination-Host",
+					g_fd_dict_objs.dest_host);
+
+	FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME, "Destination-Realm",
+					g_fd_dict_objs.dest_realm);
+
+	FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME, "User-Name",
+					g_fd_dict_objs.user_name);
+
+	/*search and map avp names to elements*/
+	FD_DICT_SEARCH(DICT_COMMAND, CMD_BY_NAME,
+					"Authentication-Information-Request",
+					g_fd_dict_objs.AIR);
+
+	FD_DICT_SEARCH(DICT_COMMAND, CMD_BY_NAME,
+					"Authentication-Information-Answer",
+					g_fd_dict_objs.AIA);
+
+	FD_DICT_SEARCH(DICT_COMMAND, CMD_BY_NAME, "Update-Location-Request",
+				g_fd_dict_objs.ULR);
+
+	FD_DICT_SEARCH(DICT_COMMAND, CMD_BY_NAME, "Update-Location-Answer",
+					g_fd_dict_objs.ULA);
+
+	FD_DICT_SEARCH(DICT_COMMAND, CMD_BY_NAME, "Purge-UE-Request",
+					g_fd_dict_objs.PUR);
+
+	FD_DICT_SEARCH(DICT_COMMAND, CMD_BY_NAME, "Purge-UE-Answer",
+					g_fd_dict_objs.PUA);
+	
+	//NI Detach
+	FD_DICT_SEARCH(DICT_COMMAND, CMD_BY_NAME, "Cancel-Location-Request",
+					g_fd_dict_objs.CLR);
+
+	FD_DICT_SEARCH(DICT_COMMAND, CMD_BY_NAME, "Cancel-Location-Answer",
+					g_fd_dict_objs.CLA);
+	//NI Detach
+	
+	
+	FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Visited-PLMN-Id",
+					g_fd_dict_objs.visited_PLMN_id);
+
+	FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS,
+					"Requested-EUTRAN-Authentication-Info",
+					g_fd_dict_objs.req_EUTRAN_auth_info);
+
+	FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS,
+					"Number-Of-Requested-Vectors",
+					g_fd_dict_objs.no_of_req_vectors);
+
+	FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS,
+					"Immediate-Response-Preferred",
+					g_fd_dict_objs.immediate_resp_pref);
+
+	FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Authentication-Info",
+					g_fd_dict_objs.auth_info);
+
+	FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "E-UTRAN-Vector",
+					g_fd_dict_objs.E_UTRAN_vector);
+
+	FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "RAND",
+					g_fd_dict_objs.RAND);
+
+	FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "XRES",
+					g_fd_dict_objs.XRES);
+
+	FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "AUTN",
+					g_fd_dict_objs.AUTN);
+
+	FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "KASME",
+					g_fd_dict_objs.KASME);
+
+	FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "RAT-Type",
+					g_fd_dict_objs.RAT_type);
+
+	FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "ULR-Flags",
+					g_fd_dict_objs.ULR_flags);
+
+	FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "ULA-Flags",
+					g_fd_dict_objs.ULA_flags);
+
+	FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Subscription-Data",
+					g_fd_dict_objs.subscription_data);
+
+	FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Subscriber-Status",
+					g_fd_dict_objs.subscriber_status);
+
+	FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "MSISDN",
+					g_fd_dict_objs.MSISDN);
+
+	FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Network-Access-Mode",
+					g_fd_dict_objs.net_access_mode);
+
+	FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS,
+					"Access-Restriction-Data",
+					g_fd_dict_objs.access_restriction_data);
+
+	FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "AMBR",
+					g_fd_dict_objs.AMBR);
+
+	FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS,
+					"Max-Requested-Bandwidth-UL",
+					g_fd_dict_objs.max_req_bandwidth_UL);
+
+	FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS,
+					"Max-Requested-Bandwidth-DL",
+					g_fd_dict_objs.max_req_bandwidth_DL);
+
+	FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS,
+					"APN-Configuration-Profile",
+					g_fd_dict_objs.APN_config_profile);
+
+	FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Context-Identifier",
+					g_fd_dict_objs.ctx_id);
+
+	FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS,
+					"Additional-Context-Identifier",
+					g_fd_dict_objs.additional_ctx_id);
+
+	FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS,
+					"All-APN-Configurations-Included-Indicator",
+					g_fd_dict_objs.all_APN_configs_included_ind);
+
+	FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "APN-Configuration",
+					g_fd_dict_objs.APN_config);
+
+	FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "PDN-Type",
+					g_fd_dict_objs.PDN_type);
+
+	FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS,
+					"PDN-GW-Allocation-Type",
+					g_fd_dict_objs.PDN_GW_alloc_type);
+
+	FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Specific-APN-Info",
+					g_fd_dict_objs.specific_APN_info);
+
+	FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS,
+					"Non-IP-PDN-Type-Indicator",
+					g_fd_dict_objs.non_IP_PDN_type_ind);
+
+	FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS,
+					"Non-IP-Data-Delivery-Mechanism",
+					g_fd_dict_objs.non_IP_data_delivery_mech);
+
+	FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "SCEF-ID",
+					g_fd_dict_objs.SCEF_ID);
+
+	FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Priority-Level",
+					g_fd_dict_objs.priority_Level);
+
+	FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Location-Area-Identity",
+					g_fd_dict_objs.location_area_id);
+
+	FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Tracking-Area-Identity",
+					g_fd_dict_objs.tracking_area_id);
+
+	FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS,
+					"Subscribed-Periodic-RAU-TAU-Timer",
+					g_fd_dict_objs.subsc_periodic_RAU_TAU_tmr);
+
+	FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "PUR-Flags",
+					g_fd_dict_objs.PUR_flags);
+
+	FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS,
+					"Regional-Subscription-Zone-Code",
+					g_fd_dict_objs.reg_subs_zone_code);
+	//NI Detach
+	FD_DICT_SEARCH(DICT_AVP, AVP_BY_NAME_ALL_VENDORS,
+					"Cancellation-Type",
+					g_fd_dict_objs.cancellation_type);
+	return SUCCESS;
+}
+
+/**
+ * @brief Initialize freediameter data objects for the dictionary object
+ * initialized
+ * @param None
+ * @return int - error code
+ */
+int
+s6a_fd_data_init()
+{
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.s6a_app,
+				&g_fd_dict_data.app_s6a_data), return S6A_FD_ERROR);
+
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.res_code,
+				&g_fd_dict_data.res_code), return S6A_FD_ERROR);
+
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.exp_res,
+				&g_fd_dict_data.exp_res), return S6A_FD_ERROR);
+
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.auth_app_id,
+			&g_fd_dict_data.auth_app_id),
+			return S6A_FD_ERROR);
+
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.sess_id,
+				&g_fd_dict_data.sess_id), return S6A_FD_ERROR);
+
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.auth_sess_state,
+			&g_fd_dict_data.auth_sess_state),
+			return S6A_FD_ERROR);
+	//NI Detach
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.org_host,
+				&g_fd_dict_data.org_host), return S6A_FD_ERROR);
+	
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.org_realm,
+				&g_fd_dict_data.org_realm), return S6A_FD_ERROR);
+	//NI Detach
+	
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.dest_host,
+				&g_fd_dict_data.dest_host), return S6A_FD_ERROR);
+
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.dest_realm,
+				&g_fd_dict_data.dest_realm), return S6A_FD_ERROR);
+
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.user_name,
+				&g_fd_dict_data.user_name), return S6A_FD_ERROR);
+	
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.visited_PLMN_id,
+				&g_fd_dict_data.visited_PLMN_id),
+				return S6A_FD_ERROR);
+
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.req_EUTRAN_auth_info,
+				&g_fd_dict_data.req_EUTRAN_auth_info),
+				return S6A_FD_ERROR);
+
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.no_of_req_vectors,
+				&g_fd_dict_data.no_of_req_vectors),
+				return S6A_FD_ERROR);
+
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.immediate_resp_pref,
+				&g_fd_dict_data.immediate_resp_pref),
+				return S6A_FD_ERROR);
+
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.auth_info,
+				&g_fd_dict_data.auth_info),
+				return S6A_FD_ERROR);
+
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.E_UTRAN_vector,
+				&g_fd_dict_data.E_UTRAN_vector),
+				return S6A_FD_ERROR);
+
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.RAND,
+				&g_fd_dict_data.RAND),
+				return S6A_FD_ERROR);
+
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.XRES,
+				&g_fd_dict_data.XRES),
+				return S6A_FD_ERROR);
+
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.AUTN,
+				&g_fd_dict_data.AUTN),
+				return S6A_FD_ERROR);
+
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.KASME,
+				&g_fd_dict_data.KASME),
+				return S6A_FD_ERROR);
+
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.RAT_type,
+				&g_fd_dict_data.RAT_type),
+				return S6A_FD_ERROR);
+
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.ULR_flags,
+				&g_fd_dict_data.ULR_flags),
+				return S6A_FD_ERROR);
+
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.ULA_flags,
+				&g_fd_dict_data.ULA_flags),
+				return S6A_FD_ERROR);
+
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.subscription_data,
+				&g_fd_dict_data.subscription_data),
+				return S6A_FD_ERROR);
+
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.subscriber_status,
+				&g_fd_dict_data.subscriber_status),
+				return S6A_FD_ERROR);
+
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.MSISDN,
+				&g_fd_dict_data.MSISDN),
+				return S6A_FD_ERROR);
+
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.net_access_mode,
+				&g_fd_dict_data.net_access_mode),
+				return S6A_FD_ERROR);
+
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.access_restriction_data,
+				&g_fd_dict_data.access_restriction_data),
+				return S6A_FD_ERROR);
+
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.AMBR,
+				&g_fd_dict_data.AMBR),
+				return S6A_FD_ERROR);
+
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.max_req_bandwidth_UL,
+				&g_fd_dict_data.max_req_bandwidth_UL),
+				return S6A_FD_ERROR);
+
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.max_req_bandwidth_DL,
+				&g_fd_dict_data.max_req_bandwidth_DL),
+				return S6A_FD_ERROR);
+
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.APN_config_profile,
+				&g_fd_dict_data.APN_config_profile),
+				return S6A_FD_ERROR);
+
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.ctx_id,
+				&g_fd_dict_data.ctx_id),
+				return S6A_FD_ERROR);
+
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.additional_ctx_id,
+				&g_fd_dict_data.additional_ctx_id),
+				return S6A_FD_ERROR);
+
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.all_APN_configs_included_ind,
+				&g_fd_dict_data.all_APN_configs_included_ind),
+				return S6A_FD_ERROR);
+
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.APN_config,
+				&g_fd_dict_data.APN_config),
+				return S6A_FD_ERROR);
+
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.PDN_type,
+				&g_fd_dict_data.PDN_type),
+				return S6A_FD_ERROR);
+
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.PDN_GW_alloc_type,
+				&g_fd_dict_data.PDN_GW_alloc_type),
+				return S6A_FD_ERROR);
+
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.specific_APN_info,
+				&g_fd_dict_data.specific_APN_info),
+				return S6A_FD_ERROR);
+
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.non_IP_PDN_type_ind,
+				&g_fd_dict_data.non_IP_PDN_type_ind),
+				return S6A_FD_ERROR);
+
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.non_IP_data_delivery_mech,
+				&g_fd_dict_data.non_IP_data_delivery_mech),
+				return S6A_FD_ERROR);
+
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.SCEF_ID,
+				&g_fd_dict_data.SCEF_ID),
+				return S6A_FD_ERROR);
+
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.priority_Level,
+				&g_fd_dict_data.priority_Level),
+				return S6A_FD_ERROR);
+
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.location_area_id,
+				&g_fd_dict_data.location_area_id),
+				return S6A_FD_ERROR);
+
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.tracking_area_id,
+				&g_fd_dict_data.tracking_area_id),
+				return S6A_FD_ERROR);
+
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.subsc_periodic_RAU_TAU_tmr,
+				&g_fd_dict_data.subsc_periodic_RAU_TAU_tmr),
+				return S6A_FD_ERROR);
+
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.PUR_flags,
+				&g_fd_dict_data.PUR_flags),
+				return S6A_FD_ERROR);
+
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.reg_subs_zone_code,
+				&g_fd_dict_data.reg_subs_zone_code),
+				return S6A_FD_ERROR);
+
+	CHECK_FCT_DO(fd_dict_getval(g_fd_dict_objs.cancellation_type,
+				&g_fd_dict_data.cancellation_type),
+				return S6A_FD_ERROR);
+	return SUCCESS;
+}
+
+int
+s6a_fd_cb_reg(void)
+{
+	log_msg(LOG_INFO, "ANJANA s6a_fd_cb_reg.\n");
+
+	struct disp_when data;
+
+	memset(&data, 0, sizeof(data));
+	data.app = g_fd_dict_objs.s6a_app;
+
+	/* Register resp callbacks */
+	data.command = g_fd_dict_objs.AIA;
+	CHECK_FCT_DO(fd_disp_register(aia_resp_callback, DISP_HOW_CC, &data,
+			NULL, NULL),
+			return S6A_FD_ERROR);
+
+	data.command = g_fd_dict_objs.ULA;
+	CHECK_FCT_DO(fd_disp_register(ula_resp_callback, DISP_HOW_CC, &data,
+			NULL, NULL),
+			return S6A_FD_ERROR);
+
+#if 0	
+	data.command = g_fd_dict_objs.PUA;
+	CHECK_FCT_DO(fd_disp_register(purge_resp_callback, DISP_HOW_CC, &data,
+	                     NULL, NULL),
+	                     return S6A_FD_ERROR);
+#endif
+	//NI Detach
+	data.command = g_fd_dict_objs.CLR;
+        CHECK_FCT_DO(fd_disp_register(clr_resp_callback, DISP_HOW_CC, &data,
+                        NULL, NULL),
+                        return S6A_FD_ERROR);
+	
+	//NI Detach
+	
+	CHECK_FCT_DO(fd_disp_app_support(g_fd_dict_objs.s6a_app,
+			g_fd_dict_objs.vendor_id, 1, 0),
+			return S6A_FD_ERROR);
+
+	return SUCCESS;
+}
+
+/**
+ * @brief Create session ID for every HSS request. Append UE ID to session ID
+ * initialized
+ * @param [out] session ID created
+ * @param [in] UE index to append to session ID
+ * @return int - error code
+ */
+short
+create_fd_sess_id(struct s6a_sess_info *s6a_sess,
+	int ue_idx)
+{
+	struct session *sess = NULL;
+	unsigned char *sess_id;
+	size_t sess_id_len;
+	char idx[10] = {0};
+
+	/* clear the session id if exists */
+	if (s6a_sess->sess_id_len > 0) {
+		int exist = false;
+		CHECK_FCT_DO(fd_sess_fromsid((unsigned char*)s6a_sess->sess_id,
+			s6a_sess->sess_id_len, &sess, &exist),
+			return S6A_FD_ERROR);
+
+		if (exist == 0) {
+			CHECK_FCT_DO(fd_sess_destroy(&sess), return S6A_FD_ERROR);
+			sess = NULL;
+		}
+	}
+
+	sprintf(idx, "%d", ue_idx);
+	if (sess == NULL) {
+		CHECK_FCT_DO(fd_sess_new(&sess, fd_g_config->cnf_diamid,
+		fd_g_config->cnf_diamid_len, (unsigned char*)idx, strlen(idx)),
+		return S6A_FD_ERROR);
+	}
+	CHECK_FCT_DO(fd_sess_getsid(sess, &sess_id, &sess_id_len),
+			return S6A_FD_ERROR);
+
+	s6a_sess->sess_id_len = (unsigned char)sess_id_len;
+	memcpy(s6a_sess->sess_id, sess_id, s6a_sess->sess_id_len);
+	s6a_sess->sess_id[s6a_sess->sess_id_len] = '\0';
+
+	return SUCCESS;
+}
+
+/**
+ * @brief Parse AVP received in freediameter response
+ * initialized
+ * @param [in]avp - AVP value receivned
+ * @param [out] result value parserd out of avp
+ * @return int - error code
+ */
+short
+parse_fd_result(struct avp *avp, struct fd_result *res)
+{
+	struct avp_hdr *hdr;
+	struct avp *child_avp = NULL;
+
+	CHECK_FCT_DO(fd_msg_avp_hdr(avp, &hdr), return S6A_FD_ERROR);
+	if (hdr->avp_code != g_fd_dict_data.exp_res.avp_code)
+	   return S6A_FD_ERROR;
+
+	CHECK_FCT_DO(fd_msg_browse(avp, MSG_BRW_FIRST_CHILD, &child_avp, NULL),
+			return S6A_FD_ERROR);
+
+	while (child_avp) {
+	   fd_msg_avp_hdr (child_avp, &hdr);
+
+	   if (hdr->avp_code ==
+		g_fd_dict_data.exp_res_code.avp_code) {
+			res->result_code = hdr->avp_value->u32;
+			res->present = true;
+		} else if (hdr->avp_code == g_fd_dict_data.vendor_id.avp_code) {
+			res->vendor_id = hdr->avp_value->u32;
+		}
+
+		CHECK_FCT_DO(fd_msg_browse(child_avp, MSG_BRW_NEXT, &child_avp,
+				NULL),
+				return S6A_FD_ERROR);
+	}
+
+	return SUCCESS;
+}
+
+
+
+
