diff --git a/dongle.c b/dongle.c
index f2d63286332dfdc7b2a80baf1d2e71d345fced9a..c4d9b9a30fdf0c9896afca559ef3d6f50a639f52 100644
--- a/dongle.c
+++ b/dongle.c
@@ -90,8 +90,11 @@ int tag_missing_devices(void)
 		}
 
 		dev->missing++;
-		if (dev->missing == 1)
+		if (dev->missing == 1) {
+			/* TEMPORARY FIX -- TODO: HOW TO CHECK IF IT CONTAINS ELEMENT */
+			list_del(&dev->list);
 			delete_device(dev);
+		}
 	}
 
 	return 0;
@@ -100,34 +103,35 @@ int tag_missing_devices(void)
 int add_device(struct device *new_dev)
 {
 	struct device *dev;
-
 	dev = search_list(new_dev->usb.if_name);
 	if (dev) {
 		if (dev->ip)
 			free(dev->ip);
-		dev->ip = new_dev->ip;
-
-		if (!dev->ubus_obj && dev->ip)
-			dev->ubus_obj = dongle_create_dynamic_object(new_dev);
-		else if (dev->ubus_obj && !dev->ip) {
+		if (new_dev->ip)
+			dev->ip = strdup(new_dev->ip);
+		else
+			dev->ip = NULL;
+		if (!dev->ubus_obj && dev->ip) {
+			dev->ubus_obj = dongle_create_dynamic_object(dev);
+			if (dev->ubus_obj)
+				publish_ubus_object(global_ctx, dev->ubus_obj);
+		} else if (dev->ubus_obj && !dev->ip) {
 			unpublish_ubus_object(global_ctx, dev->ubus_obj);
 			dongle_destroy_dynamic_object(dev->ubus_obj);
 		}
 		dev->present = true;
+		delete_device(new_dev);
 		goto already_present;
 	}
-
 	new_dev->present = true;
 	if (list_empty(&devices))
 		INIT_LIST_HEAD(&devices);
-
 	list_add_tail(&new_dev->list, &devices);
 	if (new_dev->ip) {
 		new_dev->ubus_obj = dongle_create_dynamic_object(new_dev);
 		if (new_dev->ubus_obj)
 			publish_ubus_object(global_ctx, new_dev->ubus_obj);
 	}
-
 	return 0;
 already_present:
 	return -1;
@@ -138,6 +142,8 @@ int delete_all_devices(void)
 	struct device *dev, *tmp;
 
 	list_for_each_entry_safe(dev, tmp, &devices, list) {
+		/* TEMPORARY FIX -- TODO: HOW TO CHECK IF IT CONTAINS ELEMENT */
+		list_del(&dev->list);
 		delete_device(dev);
 	}
 
@@ -151,7 +157,8 @@ int delete_device_by_name(char *name)
 	list_for_each_entry_safe(dev, tmp, &devices, list) {
 		if (strncmp(dev->usb.if_name, name, 128) != 0)
 			continue;
-
+		/* TEMPORARY FIX -- TODO: HOW TO CHECK IF IT CONTAINS ELEMENT */
+		list_del(&dev->list);
 		delete_device(dev);
 		return 0;
 	}
@@ -166,7 +173,8 @@ int delete_device(struct device *dev)
 		dongle_destroy_dynamic_object(dev->ubus_obj);
 	}
 
-	list_del(&dev->list);
+	/*if (dev->list) // how to check if list contains this element?
+		list_del(&dev->list);*/
 	free_device(dev);
 	return 0;
 }
@@ -367,32 +375,28 @@ int get_devices(void)
 		perror("opendir");
 		goto fail_dr;
 	}
+
 	while ((de = readdir(dir)) != NULL) {
 		if (strcmp(de->d_name, ".") == 0 || strcmp(de->d_name, "..") == 0)
 			continue;
 		if (strstr(de->d_name, ":") || strstr(de->d_name, "usb"))
 			continue;
-
 		snprintf(product_path, PATH_MAX, "%s%s/product", usb_path, de->d_name);
 		memset(&st, 0, sizeof(st));
-
 		rv = stat(product_path, &st);
 		if (rv < 0) {
 			//perror("stat");
 			continue;
 		}
-
 		snprintf(path, PATH_MAX, "%s%s/", usb_path, de->d_name);
 		name = get_device_name(path);
 		if (!name)
 			continue;
-
 		dev = (struct device *)calloc(1, sizeof(*dev));
 		if (!dev) {
 			perror("calloc");
 			goto fail_dev;
 		}
-
 		dev->usb.product = get_usb_stat(usb_path, de->d_name, "product");
 		dev->usb.product_id = get_usb_stat(usb_path, de->d_name, "idProduct");
 		dev->usb.vendor_id = get_usb_stat(usb_path, de->d_name, "idVendor");
@@ -401,7 +405,6 @@ int get_devices(void)
 
 		add_device(dev);
 	}
-
 	closedir(dir);
 	return 0;
 fail_dev: