diff --git a/dongle.c b/dongle.c
index 24717aa855e89103b9a36f05b479c9826979e820..0ca5b30c7aa79c11984622ff0f5ae77e872b3b82 100644
--- a/dongle.c
+++ b/dongle.c
@@ -104,57 +104,72 @@ int tag_missing_devices(void)
 	return 0;
 }
 
-int add_device(struct device *new_dev)
+int update_device(struct device *dev)
 {
-	struct device *dev;
+	struct device *prev_dev;
 	int rv;
 
-	dev = search_list(new_dev->usb.if_name);
-	if (dev) {
-		if (dev->ip)
-			free(dev->ip);
+	prev_dev = search_list(dev->usb.if_name);
+	if (prev_dev) {
+		if (prev_dev->ip)
+			free(prev_dev->ip);
 
-		if (new_dev->ip)
-			dev->ip = strdup(new_dev->ip);
+		if (dev->ip)
+			prev_dev->ip = strdup(dev->ip);
 		else
-			dev->ip = NULL;
+			prev_dev->ip = NULL;
 
-		if (!dev->ubus_obj && dev->ip) {
-			dev->ubus_obj = dongle_create_dynamic_object(dev);
-			if (!dev->ubus_obj)
+		if (!prev_dev->ubus_obj && prev_dev->ip) {
+			prev_dev->ubus_obj = dongle_create_dynamic_object(prev_dev);
+			if (!prev_dev->ubus_obj)
 				goto fail;
 
-			rv = publish_ubus_object(global_ctx, dev->ubus_obj);
+			rv = publish_ubus_object(global_ctx, prev_dev->ubus_obj);
 			if (rv)
 				goto fail;
 
-			global_dev= dev;
+			global_dev = prev_dev;
 
-		} else if (dev->ubus_obj && !dev->ip) {
-			unpublish_ubus_object(global_ctx, dev->ubus_obj);
-			dongle_destroy_dynamic_object(&(dev->ubus_obj));
+		} else if (prev_dev->ubus_obj && !prev_dev->ip) {
+			unpublish_ubus_object(global_ctx, prev_dev->ubus_obj);
+			dongle_destroy_dynamic_object(&(prev_dev->ubus_obj));
 		}
-		dev->present = true;
+		prev_dev->present = true;
+
+		delete_device(dev);
+	} else
+		goto not_present;
 
-		delete_device(new_dev);
+	return 0;
+not_present:
+	return -1;
+fail:
+	return -2;
+}
+
+int add_device(struct device *dev)
+{
+	int rv;
+
+	rv = update_device(dev);
+	if (rv == 0)
 		goto already_present;
-	}
 
-	new_dev->present = true;
+	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)
+	list_add_tail(&dev->list, &devices);
+	if (dev->ip) {
+		dev->ubus_obj = dongle_create_dynamic_object(dev);
+		if (!dev->ubus_obj)
 			goto fail;
 
-		rv = publish_ubus_object(global_ctx, new_dev->ubus_obj);
+		rv = publish_ubus_object(global_ctx, dev->ubus_obj);
 		if (rv)
 			goto fail;
 
-		global_dev = new_dev;
+		global_dev = dev;
 	}
 
 	return 0;