diff --git a/src/hostmngr.c b/src/hostmngr.c
index 8f7a2cd4a4e47fff4c02247bf0d9d7dc1a7e9d7b..fed6a85fc09d1cab98763375e0e2421e3ae499c8 100644
--- a/src/hostmngr.c
+++ b/src/hostmngr.c
@@ -350,6 +350,7 @@ void topology_update_hostname_of_neighbors(struct topologyd_private *priv,
 			inet_aton(h->ipv4, &e->ipv4.addr.ip4);
 			e->ipv4.family = AF_INET;
 			e->leasetime = h->leasetime;
+			e->ipv4_type_dhcp = 1;
 
 			ipn = neigh_ip_entry_lookup2(priv, &e->ipv4);
 			if (ipn) {
@@ -396,6 +397,7 @@ int topology_get_neigh_hostname(struct neigh_queue *q, uint8_t *macaddr)
 			inet_aton(h->ipv4, &e->ipv4.addr.ip4);
 			e->ipv4.family = AF_INET;
 			e->leasetime = h->leasetime;
+			e->ipv4_type_dhcp = 1;
 
 			ipn = neigh_ip_entry_lookup2(priv, &e->ipv4);
 			if (ipn) {
diff --git a/src/neigh.c b/src/neigh.c
index 4018b25ab90debbc10631820e6486779a79be276..abe661e4a57dbb65ed2879c0e7cef6c7f32dc0f3 100644
--- a/src/neigh.c
+++ b/src/neigh.c
@@ -835,6 +835,9 @@ struct neigh_entry *neigh_enqueue(void *nq, uint8_t *macaddr, uint16_t state,
 		}
 
 		if (ip) {
+			/* can get overridden by dhcp lease entry */
+			memcpy(&e->ipv4, ip, sizeof(*ip));
+
 			list_for_each_entry(ipaddr, &e->iplist, list) {
 				if (ipaddr_equal(&ipaddr->ip, ip))
 					ipknown = true;
@@ -908,6 +911,9 @@ struct neigh_entry *neigh_enqueue(void *nq, uint8_t *macaddr, uint16_t state,
 		}
 
 		if (ip) {
+			/* can get overridden by dhcp lease entry */
+			memcpy(&e->ipv4, ip, sizeof(*ip));
+
 			list_for_each_entry(ipaddr, &e->iplist, list) {
 				if (ipaddr_equal(&ipaddr->ip, ip))
 					ipknown = true;
diff --git a/src/neigh.h b/src/neigh.h
index 2fa923bb4b91d559257be8cec4b6c967c0c323e7..e5f68030190a5ebea25bd63d16dcf2ff917b1bb1 100644
--- a/src/neigh.h
+++ b/src/neigh.h
@@ -63,6 +63,7 @@ struct neigh_entry {
 	void *cookie;
 	char hostname[256];
 	struct ip_address ipv4;		/* from dhcp-lease table or neigh cache */
+	int ipv4_type_dhcp;		/* set 1 when dhcp assigned ipv4 address */
 	unsigned long leasetime;	/* lease time() end if dhcp addresses */
 	struct list_head iplist;	/* list of struct ip_address_entry */
 	struct hlist_node hlist;
diff --git a/src/ubus.c b/src/ubus.c
index f909fd25a01eb0da7874854c025e3caacbc18b45..4d21ce8852e06d956c0a574d54d6c11ae65ce0ca 100644
--- a/src/ubus.c
+++ b/src/ubus.c
@@ -359,7 +359,7 @@ int topologyd_ubus_show_hosts(struct ubus_context *ctx, struct ubus_object *obj,
 
 		hlist_for_each_entry(e, &q->table[i], hlist) {
 			struct ip_address_entry *ipv4, *ipv6;
-			unsigned long leasetime_rem;
+			long leasetime_rem;
 			char statestr[128] = {0};
 			char ip4buf[32] = {0};
 			char *ifname = NULL;
@@ -378,7 +378,11 @@ int topologyd_ubus_show_hosts(struct ubus_context *ctx, struct ubus_object *obj,
 			inet_ntop(e->ipv4.family, &e->ipv4.addr, ip4buf, sizeof(ip4buf));
 			blobmsg_add_string(&bb, "ipv4addr", ip4buf);
 			leasetime_rem = e->leasetime ? e->leasetime - (unsigned long)time(NULL) : 0;
-			blobmsg_add_string(&bb, "address_source", leasetime_rem ? "DHCP": "Static");
+			if (leasetime_rem < 0) {
+				leasetime_rem = 0;
+				topology_get_neigh_hostname(q, e->macaddr); //TODO: move to inotify cb
+			}
+			blobmsg_add_string(&bb, "address_source", e->ipv4_type_dhcp ? "DHCP": "Static");
 			blobmsg_add_u32(&bb, "lease_time_remaining", leasetime_rem);
 			blobmsg_add_u8(&bb, "iswifi", e->type == NEIGH_TYPE_WIFI ? true : false);
 			blobmsg_add_u8(&bb, "is1905", e->is1905 ? true : false);