Index: uspace/lib/usbhost/src/usb_bus.c
===================================================================
--- uspace/lib/usbhost/src/usb_bus.c	(revision b4b534ac1d1515633baff0d563e9c16938bfe19f)
+++ uspace/lib/usbhost/src/usb_bus.c	(revision 5550323d13801b8ca180d4c199c9dc172a329050)
@@ -242,4 +242,6 @@
 		return EEXIST;
 	}
+	/* Add endpoint list's reference to ep. */
+	endpoint_add_ref(ep);
 	list_append(&ep->link, get_list(instance, ep->address));
 
@@ -274,4 +276,6 @@
 	    ep->endpoint, usb_str_transfer_type_short(ep->transfer_type),
 	    usb_str_direction(ep->direction));
+	/* Drop endpoint list's reference to ep. */
+	endpoint_del_ref(ep);
 	fibril_mutex_unlock(&instance->guard);
 	return EOK;
@@ -289,4 +293,8 @@
 	fibril_mutex_lock(&instance->guard);
 	endpoint_t *ep = find_locked(instance, address, endpoint, direction);
+	if (ep) {
+		/* We are exporting ep to the outside world, add reference. */
+		endpoint_add_ref(ep);
+	}
 	fibril_mutex_unlock(&instance->guard);
 	return ep;
@@ -350,16 +358,26 @@
 	}
 
+	/* Add our reference to ep. */
+	endpoint_add_ref(ep);
+
 	if (callback) {
 		const int ret = callback(ep, arg);
 		if (ret != EOK) {
 			fibril_mutex_unlock(&instance->guard);
-			endpoint_destroy(ep);
+			endpoint_del_ref(ep);
 			return ret;
 		}
 	}
+	
+	/* Add endpoint list's reference to ep. */
+	endpoint_add_ref(ep);
 	list_append(&ep->link, get_list(instance, ep->address));
 
 	instance->free_bw -= ep->bandwidth;
 	fibril_mutex_unlock(&instance->guard);
+
+	/* Drop our reference to ep. */
+	endpoint_del_ref(ep);
+
 	return EOK;
 }
@@ -392,5 +410,6 @@
 		callback(ep, arg);
 	}
-	endpoint_destroy(ep);
+	/* Drop endpoint list's reference to ep. */
+	endpoint_del_ref(ep);
 	return EOK;
 }
@@ -445,5 +464,6 @@
 			if (callback)
 				callback(ep, arg);
-			endpoint_destroy(ep);
+			/* Drop endpoint list's reference to ep. */
+			endpoint_del_ref(ep);
 		}
 	}
