diff --git a/ipacm/inc/IPACM_Iface.h b/ipacm/inc/IPACM_Iface.h
index eb9e265..436e99e 100644
--- a/ipacm/inc/IPACM_Iface.h
+++ b/ipacm/inc/IPACM_Iface.h
@@ -73,6 +73,9 @@
 	/* IPACM interface id */
 	int ipa_if_num;
 
+		/* IPACM interface category */
+		int ipa_if_cate;
+
 	/* IPACM interface name */
 	char dev_name[IF_NAME_LEN];
 
@@ -121,6 +124,9 @@
 	/*Configure the initial filter rules */
 	virtual int init_fl_rule(ipa_ip_type iptype);
 
+	/* Get interface index */
+	virtual int ipa_get_if_index(char * if_name, int * if_index);
+
 	static IPACM_Routing m_routing;
 	static IPACM_Filtering m_filtering;
 	static IPACM_Header m_header;
diff --git a/ipacm/inc/IPACM_IfaceManager.h b/ipacm/inc/IPACM_IfaceManager.h
index a78ec4c..d37ede2 100644
--- a/ipacm/inc/IPACM_IfaceManager.h
+++ b/ipacm/inc/IPACM_IfaceManager.h
@@ -1,4 +1,4 @@
-/* 
+/*
 Copyright (c) 2013, The Linux Foundation. All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
@@ -67,23 +67,23 @@
 
 public:
 
-  IPACM_IfaceManager(); 
-  
+  IPACM_IfaceManager();
+
   void event_callback(ipa_cm_event_id event,
                       void *data);
 
   /* api for all iface instances to de-register instances */
   static int deregistr(IPACM_Listener *param);
 
-					  
-private:
-	int create_iface_instance(int if_index, bool is_sta_mode);
 
-    /* api to register instances */	
+private:
+	int create_iface_instance(int if_index, int is_sta_mode);
+
+    /* api to register instances */
 	int registr(int ipa_if_index, IPACM_Listener *obj);
-		
+
 	int SearchInstance(int ipa_if_index);
-	
+
 	static iface_instances *head;
 
 };
diff --git a/ipacm/inc/IPACM_Lan.h b/ipacm/inc/IPACM_Lan.h
index 7f5229e..45eb9ee 100644
--- a/ipacm/inc/IPACM_Lan.h
+++ b/ipacm/inc/IPACM_Lan.h
@@ -191,6 +191,8 @@
 
 	/* dynamically allocate lan iface's unicast routing rule structure */
 
+	bool is_mode_switch; /* indicate mode switch, need post internal up event */
+
 	int eth_client_len;
 
 	ipa_eth_client *eth_client;
diff --git a/ipacm/inc/IPACM_Wan.h b/ipacm/inc/IPACM_Wan.h
index 407de2e..4d0249e 100644
--- a/ipacm/inc/IPACM_Wan.h
+++ b/ipacm/inc/IPACM_Wan.h
@@ -1,4 +1,4 @@
-/* 
+/*
 Copyright (c) 2013, The Linux Foundation. All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
@@ -62,7 +62,7 @@
 	static bool wan_up;
 	static bool wan_up_v6;
 
-	IPACM_Wan(int iface_index, bool is_sta_mode);
+	IPACM_Wan(int iface_index, int is_sta_mode);
 	virtual ~IPACM_Wan();
 
 	static bool isWanUP()
@@ -84,8 +84,8 @@
 
 	static int num_v4_flt_rule;
 	static int num_v6_flt_rule;
-	
-	bool m_is_sta_mode;
+
+	int m_is_sta_mode;
 	static bool backhaul_is_sta_mode;
 	static bool is_ext_prop_set;
 
@@ -120,23 +120,22 @@
 	int handle_header_add_evt(uint8_t mac_addr[6]);
 
 	int config_dft_firewall_rules(ipa_ip_type iptype);
-	
+
 	int handle_route_del_evt(ipa_ip_type iptype);
-	
+
 	int del_dft_firewall_rules(ipa_ip_type iptype);
-	
+
 	int handle_down_evt();
 
-	
-	
+
 	/*handle wan-iface down event */
 	int handle_down_evt_ex();
 
-	/* wan default route/filter rule delete */	
+	/* wan default route/filter rule delete */
 	int handle_route_del_evt_ex(ipa_ip_type iptype);
 
 	/* configure the initial firewall filter rules */
-	int config_dft_firewall_rules_ex(struct ipa_flt_rule_add* rules, int rule_offset, 
+	int config_dft_firewall_rules_ex(struct ipa_flt_rule_add* rules, int rule_offset,
 		ipa_ip_type iptype);
 
 	/* init filtering rule in wan dl filtering table */
diff --git a/ipacm/src/IPACM_Iface.cpp b/ipacm/src/IPACM_Iface.cpp
index c274a3d..e55ff2f 100644
--- a/ipacm/src/IPACM_Iface.cpp
+++ b/ipacm/src/IPACM_Iface.cpp
@@ -47,6 +47,7 @@
 #include <IPACM_Wan.h>
 #include <IPACM_Wlan.h>
 #include <ifaddrs.h>
+#include <string.h>
 
 const char *IPACM_Iface::DEVICE_NAME = "/dev/ipa";
 IPACM_Routing IPACM_Iface::m_routing;
@@ -61,6 +62,7 @@
 	num_dft_rt_v6 = 0;
 	softwarerouting_act = false;
 	ipa_if_num = iface_index;
+	ipa_if_cate = IPACM_Iface::ipacmcfg->iface_table[iface_index].if_cat;
 
 	iface_query = NULL;
 	tx_prop = NULL;
@@ -832,3 +834,37 @@
 
 	return res;
 }
+
+
+/*  get ipa interface name */
+int IPACM_Iface::ipa_get_if_index
+(
+  char * if_name,
+  int * if_index
+)
+{
+  int fd;
+  struct ifreq ifr;
+
+  if((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
+  {
+    IPACMERR("get interface index socket create failed \n");
+    return IPACM_FAILURE;
+  }
+
+  memset(&ifr, 0, sizeof(struct ifreq));
+  (void)strncpy(ifr.ifr_name, if_name, sizeof(ifr.ifr_name));
+  IPACMDBG("interface name %s\n", ifr.ifr_name);
+
+  if (ioctl(fd,SIOCGIFINDEX , &ifr) < 0)
+  {
+    IPACMERR("call_ioctl_on_dev: ioctl failed:\n");
+    close(fd);
+    return IPACM_FAILURE;
+  }
+
+  *if_index = ifr.ifr_ifindex;
+  IPACMDBG("Interface index %d\n", *if_index);
+  close(fd);
+  return IPACM_SUCCESS;
+}
diff --git a/ipacm/src/IPACM_IfaceManager.cpp b/ipacm/src/IPACM_IfaceManager.cpp
index 5046fa9..535a9c7 100644
--- a/ipacm/src/IPACM_IfaceManager.cpp
+++ b/ipacm/src/IPACM_IfaceManager.cpp
@@ -73,7 +73,7 @@
 			break;
 		case IPA_LINK_UP_EVENT:
 			IPACMDBG("link up %d: \n", evt_data->if_index);
-			create_iface_instance(evt_data->if_index, false);
+			create_iface_instance(evt_data->if_index, 0);
 			break;
 
 		case IPA_USB_LINK_UP_EVENT:
@@ -81,15 +81,16 @@
 			/* check if it's WAN_IF */
 			if(IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].if_cat == WAN_IF)
 			{
+				/* usb-backhaul using sta_mode 2*/
 			IPACMDBG("WAN-usb (%s) link up, iface: %d: \n", IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].iface_name,evt_data->if_index);
-			create_iface_instance(evt_data->if_index, true);
+				create_iface_instance(evt_data->if_index, 2);
 			}
 			else
 			{
-			create_iface_instance(evt_data->if_index, false);
+				create_iface_instance(evt_data->if_index, 0);
 			}
 			break;
-		
+
 		case IPA_WLAN_AP_LINK_UP_EVENT:
 			ipa_interface_index = IPACM_Iface::iface_ipa_index_query(evt_data->if_index);
 			/* change iface category from unknown to WLAN_IF */
@@ -97,7 +98,7 @@
 			{
 			IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].if_cat=WLAN_IF;
 			IPACMDBG("WLAN AP (%s) link up, iface: %d: \n", IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].iface_name,evt_data->if_index);
-			create_iface_instance(evt_data->if_index, false);
+			create_iface_instance(evt_data->if_index, 0);
 			}
 			else
 			{
@@ -110,9 +111,10 @@
 			/* change iface category from unknown to WAN_IF */
 			if(IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].if_cat==UNKNOWN_IF)
 			{
+				/* wlan-backhaul using sta_mode 1 */
 			IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].if_cat=WAN_IF;
 			IPACMDBG("WLAN STA (%s) link up, iface: %d: \n", IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].iface_name,evt_data->if_index);
-			create_iface_instance(evt_data->if_index, true);
+				create_iface_instance(evt_data->if_index, 1);
 			}
 			else
 			{
@@ -126,7 +128,7 @@
 	return;
 }
 
-int IPACM_IfaceManager::create_iface_instance(int if_index, bool is_sta_mode)
+int IPACM_IfaceManager::create_iface_instance(int if_index, int is_sta_mode)
 {
 	int ipa_interface_index;
 	ipa_interface_index = IPACM_Iface::iface_ipa_index_query(if_index);
@@ -161,6 +163,7 @@
 				IPACM_EvtDispatcher::registr(IPA_HANDLE_WAN_DOWN_V6, lan);
 				IPACM_EvtDispatcher::registr(IPA_LINK_DOWN_EVENT, lan);
 				IPACM_EvtDispatcher::registr(IPA_LAN_DELETE_SELF, lan);
+				IPACM_EvtDispatcher::registr(IPA_CFG_CHANGE_EVENT, lan); 		// register for IPA_CFG_CHANGE event
 				IPACMDBG("ipa_LAN (%s):ipa_index (%d) instance open/registr ok\n", lan->dev_name, lan->ipa_if_num);
 				registr(ipa_interface_index, lan);
 				/* solve the new_addr comes earlier issue */
@@ -224,6 +227,7 @@
 				IPACM_EvtDispatcher::registr(IPA_SW_ROUTING_DISABLE, w);
 				IPACM_EvtDispatcher::registr(IPA_LINK_DOWN_EVENT, w);
 				IPACM_EvtDispatcher::registr(IPA_WLAN_LINK_DOWN_EVENT, w); // for STA mode
+				IPACM_EvtDispatcher::registr(IPA_CFG_CHANGE_EVENT, w); 		// register for IPA_CFG_CHANGE event
 				IPACMDBG("ipa_WAN (%s):ipa_index (%d) instance open/registr ok\n", w->dev_name, w->ipa_if_num);
 				registr(ipa_interface_index, w);
 				/* solve the new_addr comes earlier issue */
diff --git a/ipacm/src/IPACM_Lan.cpp b/ipacm/src/IPACM_Lan.cpp
index 008a185..ce813bb 100644
--- a/ipacm/src/IPACM_Lan.cpp
+++ b/ipacm/src/IPACM_Lan.cpp
@@ -92,10 +92,9 @@
 	memset(lan2lan_hdr_hdl_v6, 0, MAX_OFFLOAD_PAIR*sizeof(lan2lan_hdr_hdl));
 
 	is_active = true;
-
 	memset(tcp_ctl_flt_rule_hdl_v4, 0, NUM_TCP_CTL_FLT_RULE*sizeof(uint32_t));
 	memset(tcp_ctl_flt_rule_hdl_v6, 0, NUM_TCP_CTL_FLT_RULE*sizeof(uint32_t));
-
+	is_mode_switch = false;
 	return;
 }
 
@@ -136,6 +135,20 @@
 		}
 		break;
 
+	case IPA_CFG_CHANGE_EVENT:
+		{
+			if ( IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].if_cat != ipa_if_cate)
+			{
+				IPACMDBG("Received IPA_CFG_CHANGE_EVENT and category changed\n");
+				/* delete previous instance */
+				handle_down_evt();
+				IPACM_Iface::ipacmcfg->DelNatIfaces(dev_name); // delete NAT-iface
+				is_mode_switch = true; // need post internal usb-link up event
+				return;
+			}
+		}
+		break;
+
 	case IPA_LAN_DELETE_SELF:
 	{
 		ipacm_event_data_fid *data = (ipacm_event_data_fid *)param;
@@ -143,6 +156,29 @@
 		{
 			IPACMDBG("Received IPA_LAN_DELETE_SELF event.\n");
 			IPACMDBG("ipa_LAN (%s):ipa_index (%d) instance close \n", IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].iface_name, ipa_if_num);
+			/* posting link-up event for cradle use-case */
+			if(is_mode_switch)
+			{
+				IPACMDBG("Posting IPA_USB_LINK_UP_EVENT event for (%s)\n", dev_name);
+				ipacm_cmd_q_data evt_data;
+				memset(&evt_data, 0, sizeof(evt_data));
+
+				ipacm_event_data_fid *data_fid = NULL;
+				data_fid = (ipacm_event_data_fid *)malloc(sizeof(ipacm_event_data_fid));
+				if(data_fid == NULL)
+				{
+					IPACMERR("unable to allocate memory for IPA_USB_LINK_UP_EVENT data_fid\n");
+					return NULL;
+				}
+				if(IPACM_Iface::ipa_get_if_index(dev_name, &(data_fid->if_index)))
+				{
+					IPACMERR("Error while getting interface index for %s device", dev_name);
+				}
+				evt_data.event = IPA_USB_LINK_UP_EVENT;
+				evt_data.evt_data = data_fid;
+				//IPACMDBG("Posting event:%d\n", evt_data.event);
+				IPACM_EvtDispatcher::PostEvt(&evt_data);
+			}
 			delete this;
 		}
 		break;
diff --git a/ipacm/src/IPACM_Netlink.cpp b/ipacm/src/IPACM_Netlink.cpp
index ae3902c..012668e 100644
--- a/ipacm/src/IPACM_Netlink.cpp
+++ b/ipacm/src/IPACM_Netlink.cpp
@@ -1,4 +1,4 @@
-/* 
+/*
 Copyright (c) 2013, The Linux Foundation. All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
@@ -147,8 +147,7 @@
 	if (setsockopt(*p_sk_fd, SOL_SOCKET, SO_RCVBUF, &buf_size, sizeof(int)) == -1) {
     IPACMERR("Error setting socket opts\n");
 	}
-	
-	
+
 	/* Initialize socket addresses to null */
 	memset(p_sk_addr_loc, 0, sizeof(struct sockaddr_nl));
 
@@ -158,7 +157,7 @@
 	p_sk_addr_loc->nl_groups = grps;
 
 	/* Bind socket to the local address, i.e. specified groups. This ensures
-	 that multicast messages for these groups are delivered over this 
+	 that multicast messages for these groups are delivered over this
 	 socket. */
 
 	if(bind(*p_sk_fd,
@@ -394,7 +393,7 @@
 
 	return IPACM_SUCCESS;
 
-/* An error occurred while receiving the message. Free all memory before 
+/* An error occurred while receiving the message. Free all memory before
 				 returning. */
 error:
 	ipa_nl_release_msg(msgh);
@@ -433,7 +432,7 @@
 {
 	struct nlmsghdr *nlh = (struct nlmsghdr *)buffer;  /* NL message header */
 	struct rtattr *rtah = NULL;
-	
+
 	/* Extract the header data */
 	addr_info->metainfo = *((struct ifaddrmsg *)NLMSG_DATA(nlh));
 	buflen -= sizeof(struct nlmsghdr);
@@ -475,7 +474,7 @@
 {
 	struct nlmsghdr *nlh = (struct nlmsghdr *)buffer;  /* NL message header */
 	struct rtattr *rtah = NULL;
-	
+
 	/* Extract the header data */
 	neigh_info->metainfo = *((struct ndmsg *)NLMSG_DATA(nlh));
 	buflen -= sizeof(struct nlmsghdr);
@@ -523,7 +522,7 @@
 {
 	struct nlmsghdr *nlh = (struct nlmsghdr *)buffer;  /* NL message header */
 	struct rtattr *rtah = NULL;
-	
+
 	/* Extract the header data */
 	route_info->metainfo = *((struct rtmsg *)NLMSG_DATA(nlh));
 	buflen -= sizeof(struct nlmsghdr);
@@ -632,7 +631,7 @@
 				{
 					IPACMDBG("\n GOT useful newlink event\n");
 					ret_val = ipa_get_if_name(dev_name, msg_ptr->nl_link_info.metainfo.ifi_index);
-					
+
 					data_fid = (ipacm_event_data_fid *)malloc(sizeof(ipacm_event_data_fid));
 					if(data_fid == NULL)
 					{
@@ -640,7 +639,7 @@
 						return IPACM_FAILURE;
 					}
 					data_fid->if_index = msg_ptr->nl_link_info.metainfo.ifi_index;
-					
+
 					if(msg_ptr->nl_link_info.metainfo.ifi_flags & IFF_UP)
 					{
 						IPACMDBG("Interface %s bring up with IP-family: %d \n", dev_name, msg_ptr->nl_link_info.metainfo.ifi_family);
@@ -662,8 +661,8 @@
 					IPACM_EvtDispatcher::PostEvt(&evt_data);
 
 				}
-				
-				/* Add IPACM support for ECM plug-in/plug_out */                
+
+				/* Add IPACM support for ECM plug-in/plug_out */
 				/*--------------------------------------------------------------------------
                                    Check if the interface is running.If its a RTM_NEWLINK and the interface
                                     is running then it means that its a link up event
@@ -671,7 +670,7 @@
                                 if((msg_ptr->nl_link_info.metainfo.ifi_flags & IFF_RUNNING) &&
                                    (msg_ptr->nl_link_info.metainfo.ifi_flags & IFF_LOWER_UP))
                                 {
-				
+
 					data_fid = (ipacm_event_data_fid *)malloc(sizeof(ipacm_event_data_fid));
 					if(data_fid == NULL)
 					{
@@ -679,17 +678,17 @@
 						return IPACM_FAILURE;
 					}
 					data_fid->if_index = msg_ptr->nl_link_info.metainfo.ifi_index;
-				
+
 				        ret_val = ipa_get_if_name(dev_name, msg_ptr->nl_link_info.metainfo.ifi_index);
 				        IPACMDBG("Got a ECM link_up event (Interface %s) \n", dev_name);
-                  
+
                                         /*--------------------------------------------------------------------------
                                            Post LAN iface (ECM) link up event
                                          ---------------------------------------------------------------------------*/
                                         evt_data.event = IPA_USB_LINK_UP_EVENT;
 					evt_data.evt_data = data_fid;
 					IPACM_EvtDispatcher::PostEvt(&evt_data);
-                                }				
+                                }
                                 else if(!(msg_ptr->nl_link_info.metainfo.ifi_flags & IFF_LOWER_UP))
                                 {
 					data_fid = (ipacm_event_data_fid *)malloc(sizeof(ipacm_event_data_fid));
@@ -703,14 +702,14 @@
 					ret_val = ipa_get_if_name(dev_name, msg_ptr->nl_link_info.metainfo.ifi_index);
          		                IPACMDBG("Got a ECM link_down event (Interface %s) \n", dev_name);
 
-                                        /*--------------------------------------------------------------------------
-                                           Post LAN iface (ECM) link down event
-                                         ---------------------------------------------------------------------------*/
-                                        evt_data.event = IPA_LINK_DOWN_EVENT;
+                    /*--------------------------------------------------------------------------
+                       Post LAN iface (ECM) link down event
+                     ---------------------------------------------------------------------------*/
+                    evt_data.event = IPA_LINK_DOWN_EVENT;
 					evt_data.evt_data = data_fid;
-					IPACM_EvtDispatcher::PostEvt(&evt_data);                     
-                                }							
-				
+					IPACM_EvtDispatcher::PostEvt(&evt_data);
+                                }
+
 			}
 			break;
 
@@ -783,7 +782,7 @@
 					data_addr->ipv6_addr[0] = ntohl(data_addr->ipv6_addr[0]);
 					data_addr->ipv6_addr[1] = ntohl(data_addr->ipv6_addr[1]);
 					data_addr->ipv6_addr[2] = ntohl(data_addr->ipv6_addr[2]);
-					data_addr->ipv6_addr[3] = ntohl(data_addr->ipv6_addr[3]);								 
+					data_addr->ipv6_addr[3] = ntohl(data_addr->ipv6_addr[3]);
 				}
 				else
 				{
@@ -791,7 +790,7 @@
 					IPACM_NL_REPORT_ADDR( "IFA_ADDRESS:", msg_ptr->nl_addr_info.attr_info.prefix_addr );
 					IPACM_EVENT_COPY_ADDR_v4( data_addr->ipv4_addr, msg_ptr->nl_addr_info.attr_info.prefix_addr);
 					data_addr->ipv4_addr = ntohl(data_addr->ipv4_addr);
-         
+
 				}
 
 				evt_data.event = IPA_ADDR_ADD_EVENT;
@@ -803,7 +802,7 @@
 								 data_addr->ipv6_addr[0],
 								 data_addr->ipv6_addr[1],
 								 data_addr->ipv6_addr[2],
-								 data_addr->ipv6_addr[3]);				
+								 data_addr->ipv6_addr[3]);
                 }
 				else
 				{
@@ -832,11 +831,11 @@
 			IPACMDBG("rtm_table: %d\n", msg_ptr->nl_route_info.metainfo.rtm_table);
 			IPACMDBG("rtm_family: %d\n", msg_ptr->nl_route_info.metainfo.rtm_family);
 			IPACMDBG("param_mask: 0x%x\n", msg_ptr->nl_route_info.attr_info.param_mask);
-			
+
 			/* take care of route add default route & uniroute */
-			if((msg_ptr->nl_route_info.metainfo.rtm_type == RTN_UNICAST) && 
-				 (msg_ptr->nl_route_info.metainfo.rtm_protocol == RTPROT_BOOT) && 
-				 (msg_ptr->nl_route_info.metainfo.rtm_scope == RT_SCOPE_UNIVERSE) && 
+			if((msg_ptr->nl_route_info.metainfo.rtm_type == RTN_UNICAST) &&
+				 (msg_ptr->nl_route_info.metainfo.rtm_protocol == RTPROT_BOOT) &&
+				 (msg_ptr->nl_route_info.metainfo.rtm_scope == RT_SCOPE_UNIVERSE) &&
 				 (msg_ptr->nl_route_info.metainfo.rtm_table == RT_TABLE_MAIN))
 			{
 				IPACMDBG("\n GOT RTM_NEWROUTE event\n");
@@ -849,8 +848,8 @@
 						IPACMERR("Error while getting interface name\n");
 					}
 
-					IPACM_NL_REPORT_ADDR( "route add -host", msg_ptr->nl_route_info.attr_info.dst_addr );				 
-					IPACM_NL_REPORT_ADDR( "gw", msg_ptr->nl_route_info.attr_info.gateway_addr );				 
+					IPACM_NL_REPORT_ADDR( "route add -host", msg_ptr->nl_route_info.attr_info.dst_addr );
+					IPACM_NL_REPORT_ADDR( "gw", msg_ptr->nl_route_info.attr_info.gateway_addr );
 					IPACMDBG("dev %s\n",dev_name );
 					/* insert to command queue */
 					IPACM_EVENT_COPY_ADDR_v4( if_ipv4_addr, msg_ptr->nl_route_info.attr_info.dst_addr);
@@ -917,13 +916,13 @@
 						data_addr->ipv6_addr_mask[0] = ntohl(data_addr->ipv6_addr_mask[0]);
 						data_addr->ipv6_addr_mask[1] = ntohl(data_addr->ipv6_addr_mask[1]);
 						data_addr->ipv6_addr_mask[2] = ntohl(data_addr->ipv6_addr_mask[2]);
-						data_addr->ipv6_addr_mask[3] = ntohl(data_addr->ipv6_addr_mask[3]);		
+						data_addr->ipv6_addr_mask[3] = ntohl(data_addr->ipv6_addr_mask[3]);
 
 						evt_data.event = IPA_ROUTE_ADD_EVENT;
 						data_addr->if_index = msg_ptr->nl_route_info.attr_info.oif_index;
 						data_addr->iptype = IPA_IP_v6;
 
-						IPACMDBG("Posting IPA_ROUTE_ADD_EVENT with if index:%d, ipv6 address\n", 
+						IPACMDBG("Posting IPA_ROUTE_ADD_EVENT with if index:%d, ipv6 address\n",
 										 data_addr->if_index);
 						evt_data.evt_data = data_addr;
 						IPACM_EvtDispatcher::PostEvt(&evt_data);
@@ -932,8 +931,8 @@
 					}
 					else
 					{
-						IPACM_NL_REPORT_ADDR( "route add default gw", msg_ptr->nl_route_info.attr_info.gateway_addr );
-						IPACMDBG("dev %s", dev_name);
+						IPACM_NL_REPORT_ADDR( "route add default gw \n", msg_ptr->nl_route_info.attr_info.gateway_addr );
+						IPACMDBG("dev %s \n", dev_name);
 						IPACM_NL_REPORT_ADDR( "dstIP:", msg_ptr->nl_route_info.attr_info.dst_addr );
 
 						/* insert to command queue */
@@ -944,8 +943,8 @@
 							return IPACM_FAILURE;
 						}
 
-						IPACM_EVENT_COPY_ADDR_v4( if_ipv4_addr, msg_ptr->nl_route_info.attr_info.dst_addr);			 
-						IPACM_EVENT_COPY_ADDR_v4( if_ipipv4_addr_mask, msg_ptr->nl_route_info.attr_info.dst_addr);			 
+						IPACM_EVENT_COPY_ADDR_v4( if_ipv4_addr, msg_ptr->nl_route_info.attr_info.dst_addr);
+						IPACM_EVENT_COPY_ADDR_v4( if_ipipv4_addr_mask, msg_ptr->nl_route_info.attr_info.dst_addr);
 
 						evt_data.event = IPA_ROUTE_ADD_EVENT;
 						data_addr->if_index = msg_ptr->nl_route_info.attr_info.oif_index;
@@ -965,9 +964,9 @@
 			}
 
 			/* ipv6 routing table */
-			if((AF_INET6 == msg_ptr->nl_route_info.metainfo.rtm_family) && 
-				 (msg_ptr->nl_route_info.metainfo.rtm_type == RTN_UNICAST) && 
-				 (msg_ptr->nl_route_info.metainfo.rtm_protocol == RTPROT_KERNEL) && 
+			if((AF_INET6 == msg_ptr->nl_route_info.metainfo.rtm_family) &&
+				 (msg_ptr->nl_route_info.metainfo.rtm_type == RTN_UNICAST) &&
+				 (msg_ptr->nl_route_info.metainfo.rtm_protocol == RTPROT_KERNEL) &&
 				 (msg_ptr->nl_route_info.metainfo.rtm_table == RT_TABLE_MAIN))
 			{
 				IPACMDBG("\n GOT valid v6-RTM_NEWROUTE event\n");
@@ -985,7 +984,7 @@
 									 msg_ptr->nl_route_info.metainfo.rtm_dst_len,
 									 msg_ptr->nl_route_info.attr_info.priority,
 									 dev_name);
-					
+
 					/* insert to command queue */
 					data_addr = (ipacm_event_data_addr *)malloc(sizeof(ipacm_event_data_addr));
 					if(data_addr == NULL)
@@ -999,7 +998,7 @@
 					data_addr->ipv6_addr[0] = ntohl(data_addr->ipv6_addr[0]);
 					data_addr->ipv6_addr[1] = ntohl(data_addr->ipv6_addr[1]);
 					data_addr->ipv6_addr[2] = ntohl(data_addr->ipv6_addr[2]);
-					data_addr->ipv6_addr[3] = ntohl(data_addr->ipv6_addr[3]);								 
+					data_addr->ipv6_addr[3] = ntohl(data_addr->ipv6_addr[3]);
 
 					mask_value_v6 = msg_ptr->nl_route_info.metainfo.rtm_dst_len;
 					for(mask_index = 0; mask_index < 4; mask_index++)
@@ -1026,8 +1025,8 @@
 					data_addr->ipv6_addr_mask[0] = ntohl(data_addr->ipv6_addr_mask[0]);
 					data_addr->ipv6_addr_mask[1] = ntohl(data_addr->ipv6_addr_mask[1]);
 					data_addr->ipv6_addr_mask[2] = ntohl(data_addr->ipv6_addr_mask[2]);
-					data_addr->ipv6_addr_mask[3] = ntohl(data_addr->ipv6_addr_mask[3]);		
-									 
+					data_addr->ipv6_addr_mask[3] = ntohl(data_addr->ipv6_addr_mask[3]);
+
 					evt_data.event = IPA_ROUTE_ADD_EVENT;
 					data_addr->if_index = msg_ptr->nl_route_info.attr_info.oif_index;
 					data_addr->iptype = IPA_IP_v6;
@@ -1044,7 +1043,7 @@
 					IPACMDBG(" metric %d, dev %s\n",
 									 msg_ptr->nl_route_info.attr_info.priority,
 									 dev_name);
-					
+
 					/* insert to command queue */
 					data_addr = (ipacm_event_data_addr *)malloc(sizeof(ipacm_event_data_addr));
 					if(data_addr == NULL)
@@ -1055,17 +1054,17 @@
 
 					IPACM_EVENT_COPY_ADDR_v6( data_addr->ipv6_addr, msg_ptr->nl_route_info.attr_info.dst_addr);
 
-                    data_addr->ipv6_addr[0]=ntohl(data_addr->ipv6_addr[0]);								 
-                    data_addr->ipv6_addr[1]=ntohl(data_addr->ipv6_addr[1]);								 
-                    data_addr->ipv6_addr[2]=ntohl(data_addr->ipv6_addr[2]);								 
-                    data_addr->ipv6_addr[3]=ntohl(data_addr->ipv6_addr[3]);								 
+                    data_addr->ipv6_addr[0]=ntohl(data_addr->ipv6_addr[0]);
+                    data_addr->ipv6_addr[1]=ntohl(data_addr->ipv6_addr[1]);
+                    data_addr->ipv6_addr[2]=ntohl(data_addr->ipv6_addr[2]);
+                    data_addr->ipv6_addr[3]=ntohl(data_addr->ipv6_addr[3]);
 
 					IPACM_EVENT_COPY_ADDR_v6( data_addr->ipv6_addr_mask, msg_ptr->nl_route_info.attr_info.dst_addr);
 
-					data_addr->ipv6_addr_mask[0]=ntohl(data_addr->ipv6_addr_mask[0]);								 
-                    data_addr->ipv6_addr_mask[1]=ntohl(data_addr->ipv6_addr_mask[1]);								 
-                    data_addr->ipv6_addr_mask[2]=ntohl(data_addr->ipv6_addr_mask[2]);								 
-                    data_addr->ipv6_addr_mask[3]=ntohl(data_addr->ipv6_addr_mask[3]);		
+					data_addr->ipv6_addr_mask[0]=ntohl(data_addr->ipv6_addr_mask[0]);
+                    data_addr->ipv6_addr_mask[1]=ntohl(data_addr->ipv6_addr_mask[1]);
+                    data_addr->ipv6_addr_mask[2]=ntohl(data_addr->ipv6_addr_mask[2]);
+                    data_addr->ipv6_addr_mask[3]=ntohl(data_addr->ipv6_addr_mask[3]);
 
 					evt_data.event = IPA_ROUTE_ADD_EVENT;
 					data_addr->if_index = msg_ptr->nl_route_info.attr_info.oif_index;
@@ -1087,9 +1086,9 @@
 				return IPACM_FAILURE;
 			}
 			/* take care of route delete of default route & uniroute */
-			if((msg_ptr->nl_route_info.metainfo.rtm_type == RTN_UNICAST) && 
-				 (msg_ptr->nl_route_info.metainfo.rtm_protocol == RTPROT_BOOT) && 
-				 (msg_ptr->nl_route_info.metainfo.rtm_scope == 0) && 
+			if((msg_ptr->nl_route_info.metainfo.rtm_type == RTN_UNICAST) &&
+				 (msg_ptr->nl_route_info.metainfo.rtm_protocol == RTPROT_BOOT) &&
+				 (msg_ptr->nl_route_info.metainfo.rtm_scope == 0) &&
 				 (msg_ptr->nl_route_info.metainfo.rtm_table == RT_TABLE_MAIN))
 			{
 
@@ -1162,19 +1161,19 @@
 						data_addr->ipv6_addr[0] = ntohl(data_addr->ipv6_addr[0]);
 						data_addr->ipv6_addr[1] = ntohl(data_addr->ipv6_addr[1]);
 						data_addr->ipv6_addr[2] = ntohl(data_addr->ipv6_addr[2]);
-						data_addr->ipv6_addr[3] = ntohl(data_addr->ipv6_addr[3]);								 
+						data_addr->ipv6_addr[3] = ntohl(data_addr->ipv6_addr[3]);
 
 						IPACM_EVENT_COPY_ADDR_v6( data_addr->ipv6_addr_mask, msg_ptr->nl_route_info.attr_info.dst_addr);
 
 						data_addr->ipv6_addr_mask[0] = ntohl(data_addr->ipv6_addr_mask[0]);
 						data_addr->ipv6_addr_mask[1] = ntohl(data_addr->ipv6_addr_mask[1]);
 						data_addr->ipv6_addr_mask[2] = ntohl(data_addr->ipv6_addr_mask[2]);
-						data_addr->ipv6_addr_mask[3] = ntohl(data_addr->ipv6_addr_mask[3]);								
+						data_addr->ipv6_addr_mask[3] = ntohl(data_addr->ipv6_addr_mask[3]);
 						data_addr->iptype = IPA_IP_v6;
 					}
 					else
 					{
-						IPACM_NL_REPORT_ADDR( "route del default gw", msg_ptr->nl_route_info.attr_info.gateway_addr);				 
+						IPACM_NL_REPORT_ADDR( "route del default gw", msg_ptr->nl_route_info.attr_info.gateway_addr);
 						IPACMDBG("dev %s\n", dev_name);
 
 						IPACM_EVENT_COPY_ADDR_v4( data_addr->ipv4_addr, msg_ptr->nl_route_info.attr_info.dst_addr);
@@ -1198,9 +1197,9 @@
 			}
 
 			/* ipv6 routing table */
-			if((AF_INET6 == msg_ptr->nl_route_info.metainfo.rtm_family) && 
-				 (msg_ptr->nl_route_info.metainfo.rtm_type == RTN_UNICAST) && 
-				 (msg_ptr->nl_route_info.metainfo.rtm_protocol == RTPROT_KERNEL) && 
+			if((AF_INET6 == msg_ptr->nl_route_info.metainfo.rtm_family) &&
+				 (msg_ptr->nl_route_info.metainfo.rtm_type == RTN_UNICAST) &&
+				 (msg_ptr->nl_route_info.metainfo.rtm_protocol == RTPROT_KERNEL) &&
 				 (msg_ptr->nl_route_info.metainfo.rtm_table == RT_TABLE_MAIN))
 			{
 				IPACMDBG("\n GOT valid v6-RTM_DELROUTE event\n");
@@ -1231,7 +1230,7 @@
 					data_addr->ipv6_addr[0] = ntohl(data_addr->ipv6_addr[0]);
 					data_addr->ipv6_addr[1] = ntohl(data_addr->ipv6_addr[1]);
 					data_addr->ipv6_addr[2] = ntohl(data_addr->ipv6_addr[2]);
-					data_addr->ipv6_addr[3] = ntohl(data_addr->ipv6_addr[3]);	
+					data_addr->ipv6_addr[3] = ntohl(data_addr->ipv6_addr[3]);
 
 					mask_value_v6 = msg_ptr->nl_route_info.metainfo.rtm_dst_len;
 					for(mask_index = 0; mask_index < 4; mask_index++)
@@ -1269,8 +1268,8 @@
 					data_addr->ipv6_addr_mask[0] = ntohl(data_addr->ipv6_addr_mask[0]);
 					data_addr->ipv6_addr_mask[1] = ntohl(data_addr->ipv6_addr_mask[1]);
 					data_addr->ipv6_addr_mask[2] = ntohl(data_addr->ipv6_addr_mask[2]);
-					data_addr->ipv6_addr_mask[3] = ntohl(data_addr->ipv6_addr_mask[3]); 
-						
+					data_addr->ipv6_addr_mask[3] = ntohl(data_addr->ipv6_addr_mask[3]);
+
 					evt_data.event = IPA_ROUTE_DEL_EVENT;
 					data_addr->if_index = msg_ptr->nl_route_info.attr_info.oif_index;
 					data_addr->iptype = IPA_IP_v6;
@@ -1310,21 +1309,21 @@
 						return IPACM_FAILURE;
 					}
 
-		    memset(data_all, 0, sizeof(ipacm_event_data_all));				
+		    memset(data_all, 0, sizeof(ipacm_event_data_all));
 		    if(msg_ptr->nl_neigh_info.attr_info.local_addr.ss_family == AF_INET6)
 		    {
 				IPACM_NL_REPORT_ADDR( " ", msg_ptr->nl_neigh_info.attr_info.local_addr);
 				IPACM_EVENT_COPY_ADDR_v6( data_all->ipv6_addr, msg_ptr->nl_neigh_info.attr_info.local_addr);
-                  
-                      data_all->ipv6_addr[0]=ntohl(data_all->ipv6_addr[0]);								 
-                      data_all->ipv6_addr[1]=ntohl(data_all->ipv6_addr[1]);								 
-                      data_all->ipv6_addr[2]=ntohl(data_all->ipv6_addr[2]);								 
-                      data_all->ipv6_addr[3]=ntohl(data_all->ipv6_addr[3]);	
+
+                      data_all->ipv6_addr[0]=ntohl(data_all->ipv6_addr[0]);
+                      data_all->ipv6_addr[1]=ntohl(data_all->ipv6_addr[1]);
+                      data_all->ipv6_addr[2]=ntohl(data_all->ipv6_addr[2]);
+                      data_all->ipv6_addr[3]=ntohl(data_all->ipv6_addr[3]);
 		    	data_all->iptype = IPA_IP_v6;
 		    }
 		    else if (msg_ptr->nl_neigh_info.attr_info.local_addr.ss_family == AF_INET)
 		    {
-   				IPACM_NL_REPORT_ADDR( " ", msg_ptr->nl_neigh_info.attr_info.local_addr);  
+   				IPACM_NL_REPORT_ADDR( " ", msg_ptr->nl_neigh_info.attr_info.local_addr);
 				IPACM_EVENT_COPY_ADDR_v4( data_all->ipv4_addr, msg_ptr->nl_neigh_info.attr_info.local_addr);
 		    	data_all->ipv4_addr = ntohl(data_all->ipv4_addr);
 		    	data_all->iptype = IPA_IP_v4;
@@ -1375,7 +1374,7 @@
 			{
 				IPACMDBG("\n GOT RTM_DELNEIGH event (%s) ip %d\n",dev_name,msg_ptr->nl_neigh_info.attr_info.local_addr.ss_family);
 			}
-				
+
 				/* insert to command queue */
 				data_all = (ipacm_event_data_all *)malloc(sizeof(ipacm_event_data_all));
 				if(data_all == NULL)
@@ -1384,21 +1383,21 @@
 					return IPACM_FAILURE;
 				}
 
-		    memset(data_all, 0, sizeof(ipacm_event_data_all));				
+		    memset(data_all, 0, sizeof(ipacm_event_data_all));
 		    if(msg_ptr->nl_neigh_info.attr_info.local_addr.ss_family == AF_INET6)
 				{
-					IPACM_NL_REPORT_ADDR( " ", msg_ptr->nl_neigh_info.attr_info.local_addr);  	
+					IPACM_NL_REPORT_ADDR( " ", msg_ptr->nl_neigh_info.attr_info.local_addr);
 					IPACM_EVENT_COPY_ADDR_v6( data_all->ipv6_addr, msg_ptr->nl_neigh_info.attr_info.local_addr);
 
 					data_all->ipv6_addr[0] = ntohl(data_all->ipv6_addr[0]);
 					data_all->ipv6_addr[1] = ntohl(data_all->ipv6_addr[1]);
 					data_all->ipv6_addr[2] = ntohl(data_all->ipv6_addr[2]);
-					data_all->ipv6_addr[3] = ntohl(data_all->ipv6_addr[3]);	
+					data_all->ipv6_addr[3] = ntohl(data_all->ipv6_addr[3]);
 					data_all->iptype = IPA_IP_v6;
 				}
 		    else if (msg_ptr->nl_neigh_info.attr_info.local_addr.ss_family == AF_INET)
 				{
-					IPACM_NL_REPORT_ADDR( " ", msg_ptr->nl_neigh_info.attr_info.local_addr);  
+					IPACM_NL_REPORT_ADDR( " ", msg_ptr->nl_neigh_info.attr_info.local_addr);
 					IPACM_EVENT_COPY_ADDR_v4( data_all->ipv4_addr, msg_ptr->nl_neigh_info.attr_info.local_addr);
 					data_all->ipv4_addr = ntohl(data_all->ipv4_addr);
 					data_all->iptype = IPA_IP_v4;
@@ -1407,7 +1406,7 @@
 		    {
 		        data_all->iptype = IPA_IP_v6;
 		    }
-                  
+
 		    IPACMDBG("NDA_LLADDR:MAC %02x:%02x:%02x:%02x:%02x:%02x\n",
 		     (unsigned char)(msg_ptr->nl_neigh_info.attr_info.lladdr_hwaddr).sa_data[0],
 		     (unsigned char)(msg_ptr->nl_neigh_info.attr_info.lladdr_hwaddr).sa_data[1],
@@ -1415,7 +1414,6 @@
 		     (unsigned char)(msg_ptr->nl_neigh_info.attr_info.lladdr_hwaddr).sa_data[3],
 		     (unsigned char)(msg_ptr->nl_neigh_info.attr_info.lladdr_hwaddr).sa_data[4],
 		     (unsigned char)(msg_ptr->nl_neigh_info.attr_info.lladdr_hwaddr).sa_data[5]);
-                  
 
 				memcpy(data_all->mac_addr,
 							 msg_ptr->nl_neigh_info.attr_info.lladdr_hwaddr.sa_data,
@@ -1553,7 +1551,7 @@
 		return IPACM_FAILURE;
 	}
 
-	/* Add NETLINK socket to the list of sockets that the listener 
+	/* Add NETLINK socket to the list of sockets that the listener
 					 thread should listen on. */
 
 	if(ipa_nl_addfd_map(sk_fdset, sk_info.sk_fd, read_f) != IPACM_SUCCESS)
diff --git a/ipacm/src/IPACM_Wan.cpp b/ipacm/src/IPACM_Wan.cpp
index 4df0467..54e5c82 100644
--- a/ipacm/src/IPACM_Wan.cpp
+++ b/ipacm/src/IPACM_Wan.cpp
@@ -61,7 +61,7 @@
 bool IPACM_Wan::backhaul_is_sta_mode = false;
 bool IPACM_Wan::is_ext_prop_set = false;
 
-IPACM_Wan::IPACM_Wan(int iface_index, bool is_sta_mode) : IPACM_Iface(iface_index)
+IPACM_Wan::IPACM_Wan(int iface_index, int is_sta_mode) : IPACM_Iface(iface_index)
 {
 	num_firewall_v4 = 0;
 	num_firewall_v6 = 0;
@@ -81,7 +81,7 @@
 	hdr_hdl_sta_v4 = 0;
 	hdr_hdl_sta_v6 = 0;
 
-	if(m_is_sta_mode == false)
+	if(m_is_sta_mode == 0)
 	{
 		IPACMDBG("The new WAN interface is modem.\n");
 		query_ext_prop();
@@ -198,7 +198,7 @@
 
         if (num_dft_rt_v6 == 0)
 	    {
-			if(m_is_sta_mode == false)
+			if(m_is_sta_mode == 0)
 			{
 				init_fl_rule_ex(data->iptype);
 			}
@@ -249,7 +249,7 @@
         IPACMDBG("ipv4 wan iface rt-rule hdll=0x%x\n", dft_rt_rule_hdl[0]);
 			/* initial multicast/broadcast/fragment filter rule */
 
-		if(m_is_sta_mode == false)
+		if(m_is_sta_mode == 0)
 		{
 			init_fl_rule_ex(data->iptype);
 		}
@@ -278,7 +278,7 @@
 	{
 	case IPA_WLAN_LINK_DOWN_EVENT:
 		{
-			if(m_is_sta_mode == true)
+			if(m_is_sta_mode == 1)
 			{
 				ipacm_event_data_fid *data = (ipacm_event_data_fid *)param;
 				ipa_interface_index = iface_ipa_index_query(data->if_index);
@@ -297,9 +297,44 @@
 		}
 		break;
 
+	case IPA_CFG_CHANGE_EVENT:
+		{
+			if ( (IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].if_cat != ipa_if_cate) &&
+					(m_is_sta_mode ==2))
+			{
+				IPACMDBG("Received IPA_CFG_CHANGE_EVENT and category changed(sta_mode:%d)\n", m_is_sta_mode);
+				/* posting link-up event for cradle use-case */
+				ipacm_cmd_q_data evt_data;
+				memset(&evt_data, 0, sizeof(evt_data));
+
+				ipacm_event_data_fid *data_fid = NULL;
+				data_fid = (ipacm_event_data_fid *)malloc(sizeof(ipacm_event_data_fid));
+				if(data_fid == NULL)
+				{
+					IPACMERR("unable to allocate memory for IPA_USB_LINK_UP_EVENT data_fid\n");
+					return NULL;
+				}
+				if(IPACM_Iface::ipa_get_if_index(dev_name, &(data_fid->if_index)))
+				{
+					IPACMERR("Error while getting interface index for %s device", dev_name);
+				}
+				evt_data.event = IPA_USB_LINK_UP_EVENT;
+				evt_data.evt_data = data_fid;
+				IPACMDBG("Posting event:%d\n", evt_data.event);
+				IPACM_EvtDispatcher::PostEvt(&evt_data);
+
+				/* delete previous instance */
+				handle_down_evt();
+				IPACM_Iface::ipacmcfg->DelNatIfaces(dev_name); // delete NAT-iface
+				delete this;
+				return;
+			}
+		}
+		break;
+
 	case IPA_LINK_DOWN_EVENT:
 		{
-			if(m_is_sta_mode == false)
+			if(m_is_sta_mode == 0)
 			{
 				ipacm_event_data_fid *data = (ipacm_event_data_fid *)param;
 				ipa_interface_index = iface_ipa_index_query(data->if_index);
@@ -383,7 +418,7 @@
 				{
 					IPACMDBG("get del default v4 route (dst:0.0.0.0)\n");
 
-					if(m_is_sta_mode == false)
+					if(m_is_sta_mode == 0)
 					{
 						del_wan_firewall_rule(IPA_IP_v4);
 						install_wan_filtering_rule();
@@ -399,7 +434,7 @@
 				{
 					IPACMDBG("get del default v6 route (dst:00.00.00.00)\n");
 
-					if(m_is_sta_mode == false)
+					if(m_is_sta_mode == 0)
 					{
 						del_wan_firewall_rule(IPA_IP_v6);
 						install_wan_filtering_rule();
@@ -442,7 +477,7 @@
 	case IPA_FIREWALL_CHANGE_EVENT:
 		IPACMDBG("Received IPA_FIREWALL_CHANGE_EVENT\n");
 
-		if(m_is_sta_mode == false)
+		if(m_is_sta_mode == 0)
 		{
 			if(ip_type == IPA_IP_v4)
 			{
@@ -517,7 +552,22 @@
 		return IPACM_SUCCESS;
 	}
 
-	IPACM_Wan::backhaul_is_sta_mode	= m_is_sta_mode;
+	if (m_is_sta_mode !=0)
+	{
+		IPACM_Wan::backhaul_is_sta_mode	= true;
+		if((iptype==IPA_IP_v4) && (header_set_v4 != true))
+		{
+			header_partial_default_wan_v4 = true;
+			IPACMDBG("STA ipv4-header haven't constructed \n");
+			return IPACM_SUCCESS;
+		}
+		else if((iptype==IPA_IP_v6) && (header_set_v6 != true))
+		{
+			header_partial_default_wan_v6 = true;
+			IPACMDBG("STA ipv6-header haven't constructed \n");
+			return IPACM_SUCCESS;
+		}
+	}
 
     for (cnt=0; cnt<tx_prop->num_tx_props; cnt++)
 	{
@@ -584,7 +634,7 @@
 	rt_rule_entry = &rt_rule->rules[0];
 	rt_rule_entry->at_rear = true;
 
-	if(m_is_sta_mode == true)
+	if(m_is_sta_mode != 0)
 	{
 		IPACMDBG(" WAN instance is in STA mode \n");
 		for (tx_index = 0; tx_index < iface_query->num_tx_props; tx_index++)
@@ -715,7 +765,7 @@
 	    IPACM_Wan::wan_up = true;
 		active_v4 = true;
 
-		if(m_is_sta_mode == false)
+		if(m_is_sta_mode == 0)
 		{
 			config_wan_firewall_rule(IPA_IP_v4);
 			install_wan_filtering_rule();
@@ -727,7 +777,14 @@
 
 		memcpy(wanup_data->ifname, dev_name, sizeof(wanup_data->ifname));
 		wanup_data->ipv4_addr = wan_v4_addr;
-		wanup_data->is_sta = m_is_sta_mode;
+		if (m_is_sta_mode!=0)
+		{
+			wanup_data->is_sta = true;
+		}
+		else
+		{
+			wanup_data->is_sta = false;
+		}
 		IPACMDBG("Posting IPA_HANDLE_WAN_UP with below information:\n");
 		IPACMDBG("if_name:%s, ipv4_address:0x%x, is sta mode:%d\n",
 			wanup_data->ifname, wanup_data->ipv4_addr,  wanup_data->is_sta);
@@ -741,7 +798,7 @@
 		IPACM_Wan::wan_up_v6 = true;
 		active_v6 = true;
 
-		if(m_is_sta_mode == false)
+		if(m_is_sta_mode == 0)
 		{
 			config_wan_firewall_rule(IPA_IP_v6);
 			install_wan_filtering_rule();
@@ -752,7 +809,15 @@
 		}
 
 		memcpy(wanup_data->ifname, dev_name, sizeof(wanup_data->ifname));
-		wanup_data->is_sta = m_is_sta_mode;
+		if (m_is_sta_mode!=0)
+		{
+			wanup_data->is_sta = true;
+		}
+		else
+		{
+			wanup_data->is_sta = false;
+		}
+
 		IPACMDBG("Posting IPA_HANDLE_WAN_UP_V6 with below information:\n");
 		IPACMDBG("if_name:%s, is sta mode: %d\n", wanup_data->ifname, wanup_data->is_sta);
 
@@ -2772,7 +2837,14 @@
 		if (iptype == IPA_IP_v4)
 		{
 			wandown_data->ipv4_addr = wan_v4_addr;
-			wandown_data->is_sta = m_is_sta_mode;
+			if (m_is_sta_mode!=0)
+			{
+				wandown_data->is_sta = true;
+			}
+			else
+			{
+				wandown_data->is_sta = false;
+			}
 			evt_data.event = IPA_HANDLE_WAN_DOWN;
 			evt_data.evt_data = (void *)wandown_data;
 			/* Insert IPA_HANDLE_WAN_DOWN to command queue */
@@ -2784,7 +2856,14 @@
 		}
 		else
 		{
-			wandown_data->is_sta = m_is_sta_mode;
+			if (m_is_sta_mode!=0)
+			{
+				wandown_data->is_sta = true;
+			}
+			else
+			{
+				wandown_data->is_sta = false;
+			}
 			evt_data.event = IPA_HANDLE_WAN_DOWN_V6;
 			evt_data.evt_data = (void *)wandown_data;
 			/* Insert IPA_HANDLE_WAN_DOWN to command queue */
@@ -2845,7 +2924,14 @@
 		if (iptype == IPA_IP_v4)
 		{
 			wandown_data->ipv4_addr = wan_v4_addr;
-			wandown_data->is_sta = m_is_sta_mode;
+			if (m_is_sta_mode!=0)
+			{
+				wandown_data->is_sta = true;
+			}
+			else
+			{
+				wandown_data->is_sta = false;
+			}
 			evt_data.event = IPA_HANDLE_WAN_DOWN;
 			evt_data.evt_data = (void *)wandown_data;
 			/* Insert IPA_HANDLE_WAN_DOWN to command queue */
@@ -2858,7 +2944,14 @@
 		}
 		else
 		{
-			wandown_data->is_sta = m_is_sta_mode;
+			if (m_is_sta_mode!=0)
+			{
+				wandown_data->is_sta = true;
+			}
+			else
+			{
+				wandown_data->is_sta = false;
+			}
 			evt_data.event = IPA_HANDLE_WAN_DOWN_V6;
 			evt_data.evt_data = (void *)wandown_data;
 			IPACMDBG("posting IPA_HANDLE_WAN_DOWN_V6 for IPv6 \n");
