diff --git a/src/agent.c b/src/agent.c
index af436895ea0faf032227fc25f69da017fe0cb31f..1f41c13db42c6cde3776a8c71a4c7f64c7bbf962 100644
--- a/src/agent.c
+++ b/src/agent.c
@@ -4076,6 +4076,19 @@ static int run_agent(struct agent *a)
 }
 #endif
 
+static struct netif_eth *netif_alloc_eth(const char *ifname)
+{
+	struct netif_eth *e;
+
+	e = calloc(1, sizeof(struct netif_eth));
+	if (!e)
+		return NULL;
+
+	snprintf(e->name, 15, "%s", ifname);
+
+	return e;
+}
+
 static void parse_i1905_info(struct ubus_request *req, int type,
 		struct blob_attr *msg)
 {
@@ -4107,6 +4120,7 @@ static void parse_i1905_info(struct ubus_request *req, int type,
 			};
 			char *ifname;
 			char fmt[64] = {0};
+			struct netif_eth *eth;
 
 			if (blobmsg_type(cur) != BLOBMSG_TYPE_TABLE)
 				continue;
@@ -4123,6 +4137,14 @@ static void parse_i1905_info(struct ubus_request *req, int type,
 
 			snprintf(fmt, sizeof(fmt), "ts multicast %s", ifname);
 			agent_exec_platform_scripts(fmt);
+
+			if (strncmp(ifname, "lei_lan", sizeof("lei_lan"))) {
+				eth = netif_alloc_eth(ifname);
+				if (eth)
+					list_add_tail(&eth->list, &a->ethlist);
+				else
+					err("eth alloc fail");
+			}
 		}
 	}
 }
@@ -5554,6 +5576,7 @@ int agent_init_defaults(struct agent *a)
 {
 	INIT_LIST_HEAD(&a->fhlist);
 	INIT_LIST_HEAD(&a->bklist);
+	INIT_LIST_HEAD(&a->ethlist);
 	INIT_LIST_HEAD(&a->framelist);
 
 	a->cntlr_select.local = CONTROLLER_SELECT_LOCAL;
diff --git a/src/agent.h b/src/agent.h
index 58b213bf73b695f94f2a4c95f4e27d4e08c5e39f..715987e3e6b52a6951fd7482e46af6b6fe7942e6 100644
--- a/src/agent.h
+++ b/src/agent.h
@@ -299,6 +299,11 @@ struct netif_bk {
 	unsigned int vid;
 };
 
+struct netif_eth {
+	char name[16];
+	struct list_head list;
+};
+
 #if 0
 struct agent_msg {
 	void *ctx;
@@ -563,6 +568,8 @@ struct agent {
 	struct list_head fhlist;
 	struct list_head bklist;
 	struct list_head framelist;
+	struct list_head ethlist;
+
 	wifi_object_t wifi;
 	int num_radios;
 	struct wifi_radio_element radios[WIFI_DEVICE_MAX_NUM];
diff --git a/src/agent_map.c b/src/agent_map.c
index 46a1022c304882d9f40149e92577626d88f1aa02..69b157ae65888f2521349385904bd79565403b23 100644
--- a/src/agent_map.c
+++ b/src/agent_map.c
@@ -1379,10 +1379,14 @@ int agent_apply_traffic_separation(struct agent *a)
 	struct policy_cfg *c;
 	struct netif_fh *fh;
 	struct netif_bk *bk;
+	struct netif_eth *eth;
 	bool diff = false;
 	bool dhcp_reload = false;
 	char cmd[128] = {0};
-
+	char vids[64] = {0};
+	char *vids_buf = vids;
+	int vids_len = sizeof(vids) - 1;
+	int len;
 
 	if (!a)
 		return -1;
@@ -1493,21 +1497,33 @@ int agent_apply_traffic_separation(struct agent *a)
 	if (!diff && a->ts.active)
 		return 0;
 
+	/* secondary networks vlan id's*/
+	list_for_each_entry(fh, &a->fhlist, list) {
+		if (!is_vid_valid(fh->vid))
+			continue;
+		if (fh->vid == c->pvid)
+			continue;
+
+		len = snprintf(vids_buf, vids_len, " %u", fh->vid);
+		if (len < 0) {
+			err("Fail to add secondary vlan id");
+			break;
+		}
+
+		vids_buf += len;
+		vids_len -= len;
+	}
+
 	/* Logical Ethernet Interface */
 	/* Note: setup of LEI is already handled by init script */
 	snprintf(cmd, sizeof(cmd), "ts create eth %s %u %u %s %s",
 		 VLAN_IFACE, c->pvid, c->pcp_default, cfg->al_bridge, "br-lan");
 	agent_exec_platform_scripts(cmd);
 
-	list_for_each_entry(fh, &a->fhlist, list) {
-		if (is_vid_valid(fh->vid)) {
-			if (fh->vid == c->pvid)
-				continue;
-			/* secondary networks */
-			snprintf(cmd, sizeof(cmd), "ts populate eth %s %u",
-				 VLAN_IFACE, fh->vid);
-			agent_exec_platform_scripts(cmd);
-		}
+	list_for_each_entry(eth, &a->ethlist, list) {
+		snprintf(cmd, sizeof(cmd), "ts create eth_lei %s %u %s %s",
+			 eth->name, c->pvid, cfg->al_bridge, vids);
+		agent_exec_platform_scripts(cmd);
 	}
 
 	a->ts.active = true;