diff --git a/src/ip.c b/src/ip.c
index 40953fb5778016bf0dcc310e56addad9f4bebbef..49defbe9082f1af1f4597f2ecfb3bb3b971b11a5 100644
--- a/src/ip.c
+++ b/src/ip.c
@@ -1257,10 +1257,34 @@ static int set_IPInterface_ULAEnable(char *refparam, struct dmctx *ctx, void *da
 	return 0;
 }
 
+// ifstatus = Down and devstatus = Down => Status=Down
+// ifstatus = Down and devstatus = Up => Status=Dormant
+// ifstatus = Up and devstatus = Up => Status=Up
+// ifstatus not available => Status=Unknown
+// devstatus != Up => Status=LowerLayerDown
 static int get_IPInterface_Status(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
 {
-	char *device = get_device(section_name(((struct dm_data *)data)->config_section));
-	return get_net_device_status(device, value);
+	json_object *res = NULL;
+	char *if_name = section_name(((struct dm_data *)data)->config_section);
+	char *device = get_device(if_name);
+	char *devstatus = NULL;
+	bool ifstatus = false;
+
+	dmubus_call("network.interface", "status", UBUS_ARGS{{"interface", if_name, String}}, 1, &res);
+	DM_ASSERT(res, *value = dmstrdup("Unknown"));
+	string_to_bool(dmjson_get_value(res, 1, "up"), &ifstatus);
+
+	get_net_device_status(device, &devstatus);
+
+	if ((ifstatus == false) && (DM_STRNCMP(devstatus, "Up", 2) == 0)) {
+		*value = dmstrdup("Dormant");
+	} else if (DM_STRNCMP(devstatus, "Up", 2) != 0) {
+		*value = dmstrdup("LowerLayerDown");
+	} else {
+		*value = devstatus;
+	}
+
+	return 0;
 }
 
 /*#Device.IP.Interface.{i}.Alias!UCI:dmmap_network/interface,@i-1/ip_int_alias*/