diff --git a/lib/obex_transport.c b/lib/obex_transport.c
index e2da96f..690a79f 100644
--- a/lib/obex_transport.c
+++ b/lib/obex_transport.c
@@ -433,7 +433,7 @@ int obex_transport_write(obex_t *self, buf_t *msg)
 		if (self->trans.connected != TRUE)
 			break;
 		DEBUG(4, "Endpoint %d\n", self->trans.self.usb.data_endpoint_write);
-		actual = usb_bulk_write(self->trans.self.usb.dev_data,
+		actual = usb_bulk_write(self->trans.self.usb.dev,
 					self->trans.self.usb.data_endpoint_write,
 					(char *) msg->data, msg->data_size,
 					USB_OBEX_TIMEOUT);
@@ -493,7 +493,7 @@ int obex_transport_read(obex_t *self, int max, uint8_t *buf, int buflen)
 		if (self->trans.connected != TRUE)
 			break;
 		DEBUG(4, "Endpoint %d\n", self->trans.self.usb.data_endpoint_read);
-		actual = usb_bulk_read(self->trans.self.usb.dev_data,
+		actual = usb_bulk_read(self->trans.self.usb.dev,
 					self->trans.self.usb.data_endpoint_read,
 					buf_reserve_end(msg, self->mtu_rx),
 					self->mtu_rx, USB_OBEX_TIMEOUT);
diff --git a/lib/usbobex.c b/lib/usbobex.c
index b12131b..b87458d 100644
--- a/lib/usbobex.c
+++ b/lib/usbobex.c
@@ -392,32 +392,31 @@ int usbobex_connect_request(obex_t *self)
 
 	DEBUG(4, "\n");
 
-	self->trans.self.usb.dev_control = usb_open(self->trans.self.usb.device);
-	self->trans.self.usb.dev_data = usb_open(self->trans.self.usb.device);
+	self->trans.self.usb.dev = usb_open(self->trans.self.usb.device);
 
-	ret = usb_set_configuration(self->trans.self.usb.dev_control, self->trans.self.usb.configuration);
+	ret = usb_set_configuration(self->trans.self.usb.dev, self->trans.self.usb.configuration);
 	if (ret < 0)
 		DEBUG(4, "Can't set configuration %d", ret);
 
-	ret = usb_claim_interface(self->trans.self.usb.dev_control, self->trans.self.usb.control_interface);
+	ret = usb_claim_interface(self->trans.self.usb.dev, self->trans.self.usb.control_interface);
 	if (ret < 0) {
 		DEBUG(4, "Can't claim control interface %d", ret);
 		goto err1;
 	}
 
-	ret = usb_set_altinterface(self->trans.self.usb.dev_control, self->trans.self.usb.control_setting);
+	ret = usb_set_altinterface(self->trans.self.usb.dev, self->trans.self.usb.control_setting);
 	if (ret < 0) {
 		DEBUG(4, "Can't set control setting %d", ret);
 		goto err2;
 	}
 
-	ret = usb_claim_interface(self->trans.self.usb.dev_data, self->trans.self.usb.data_interface);
+	ret = usb_claim_interface(self->trans.self.usb.dev, self->trans.self.usb.data_interface);
 	if (ret < 0) {
 		DEBUG(4, "Can't claim data interface %d", ret);
 		goto err2;
 	}
 
-	ret = usb_set_altinterface(self->trans.self.usb.dev_data, self->trans.self.usb.data_active_setting);
+	ret = usb_set_altinterface(self->trans.self.usb.dev, self->trans.self.usb.data_active_setting);
 	if (ret < 0) {
 		DEBUG(4, "Can't set data active setting %d", ret);
 		goto err3;
@@ -428,12 +427,11 @@ int usbobex_connect_request(obex_t *self)
 	return 1;
 
 err3:
-	usb_release_interface(self->trans.self.usb.dev_data, self->trans.self.usb.data_interface);
+	usb_release_interface(self->trans.self.usb.dev, self->trans.self.usb.data_interface);
 err2:
-	usb_release_interface(self->trans.self.usb.dev_control, self->trans.self.usb.control_interface);
+	usb_release_interface(self->trans.self.usb.dev, self->trans.self.usb.control_interface);
 err1:
-	usb_close(self->trans.self.usb.dev_data);
-	usb_close(self->trans.self.usb.dev_control);
+	usb_close(self->trans.self.usb.dev);
 	return ret;
 }
 
@@ -450,21 +448,22 @@ int usbobex_disconnect_request(obex_t *self)
 		return 0;
 
 	DEBUG(4, "\n");
-	ret = usb_set_altinterface(self->trans.self.usb.dev_data, self->trans.self.usb.data_idle_setting);
+
+	usb_clear_halt(self->trans.self.usb.dev, self->trans.self.usb.data_endpoint_read);
+	usb_clear_halt(self->trans.self.usb.dev, self->trans.self.usb.data_endpoint_write);
+
+	ret = usb_set_altinterface(self->trans.self.usb.dev, self->trans.self.usb.data_idle_setting);
 	if (ret < 0)
 		DEBUG(4, "Can't set data idle setting %d", ret);
-	ret = usb_release_interface(self->trans.self.usb.dev_data, self->trans.self.usb.data_interface);
+	ret = usb_release_interface(self->trans.self.usb.dev, self->trans.self.usb.data_interface);
 	if (ret < 0)
 		DEBUG(4, "Can't release data interface %d", ret);
-	ret = usb_release_interface(self->trans.self.usb.dev_control, self->trans.self.usb.control_interface);
+	ret = usb_release_interface(self->trans.self.usb.dev, self->trans.self.usb.control_interface);
 	if (ret < 0)
 		DEBUG(4, "Can't release control interface %d", ret);
-	ret = usb_close(self->trans.self.usb.dev_data);
-	if (ret < 0)
-		DEBUG(4, "Can't close data interface %d", ret);
-	ret = usb_close(self->trans.self.usb.dev_control);
+	ret = usb_close(self->trans.self.usb.dev);
 	if (ret < 0)
-		DEBUG(4, "Can't close control interface %d", ret);
+		DEBUG(4, "Can't close interface %d", ret);
 
 	return ret;
 }
diff --git a/lib/usbobex.h b/lib/usbobex.h
index efd7a38..9fb1797 100644
--- a/lib/usbobex.h
+++ b/lib/usbobex.h
@@ -48,8 +48,7 @@ struct obex_usb_intf_transport_t {
 						 * in active setting */
 	int data_endpoint_read;			/* OBEX data/slave interface read endpoint */
 	int data_endpoint_write;		/* OBEX data/slave interface write endpoint */
-	usb_dev_handle *dev_control;		/* libusb handler for control interace */
-	usb_dev_handle *dev_data;		/* libusb handler for data interface */
+	usb_dev_handle *dev;			/* libusb handler */
 };
 
 /* "Union Functional Descriptor" from CDC spec 5.2.3.X
