diff --git a/firmware/osmosdr-project/main.c b/firmware/osmosdr-project/main.c
index 62fb0c5..f4af51e 100644
--- a/firmware/osmosdr-project/main.c
+++ b/firmware/osmosdr-project/main.c
@@ -392,8 +392,6 @@ int main(void)
     // Initialize the DBGU
     TRACE_CONFIGURE(DBGU_STANDARD, 115200, BOARD_MCK);
 
-    printf("trace configured!!\n");
-
     // Switch to Main clock
     AT91C_BASE_PMC->PMC_MCKR = (AT91C_BASE_PMC->PMC_MCKR & ~AT91C_PMC_CSS) | AT91C_PMC_CSS_MAIN_CLK;
     while ((AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY) == 0);
@@ -418,11 +416,10 @@ int main(void)
     TWI_ConfigureMaster(AT91C_BASE_TWI0, TWI_CLOCK, SSC_MCK);
     TWID_Initialize(&twid, AT91C_BASE_TWI0);
 
-    printf("-- osmo-sdr testing project %s --\n\r", SOFTPACK_VERSION);
+    printf("-- osmo-sdr project %s --\n\r", SOFTPACK_VERSION);
     printf("-- %s\n\r", BOARD_NAME);
     printf("-- Compiled: %s %s --\n\r", __DATE__, __TIME__);
 
-
 	req_ctx_init();
 	PIO_InitializeInterrupts(0);
 
@@ -449,18 +446,15 @@ int main(void)
     // Enter menu loop
     while (1) {
 
-	if (DBGU_IsRxReady()) {
+    	if (DBGU_IsRxReady()) {
         	key = DBGU_GetChar();
         	// Process user input
-		if (uart_cmd_char(&cmd_state, key) == 1) {
-			//ssc_stats();
-		}
-	}
-
-	/* Try to (re-)start the SSC DMA if the IN ISO EP is open but the
-	 * SSC DMA is not active */
-	if (fastsource_interfaces[2] == 1 && !ssc_active())
-		ssc_dma_start();
+        	if (uart_cmd_char(&cmd_state, key) == 1) {
+        		//ssc_stats();
+        	}
+    	}
+    	ssc_dma_start();
+    	fastsource_start();
     }
 }
 
diff --git a/firmware/src/fast_source.c b/firmware/src/fast_source.c
index 9ebcf1d..7d32044 100644
--- a/firmware/src/fast_source.c
+++ b/firmware/src/fast_source.c
@@ -17,7 +17,6 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-
 #include <stdlib.h>
 #include <stdint.h>
 #include <errno.h>
@@ -152,6 +151,7 @@ void fastsource_req_hdlr(const USBGenericRequest *request)
 void fastsource_init(void)
 {
 	memset(&usb_state, 0, sizeof(usb_state));
+	memset(fastsource_interfaces, 0x00, sizeof(fastsource_interfaces));
 
 	INIT_LLIST_HEAD(&usb_state.queue);
 
@@ -184,6 +184,7 @@ static void wr_compl_cb(void *arg, unsigned char status, unsigned int transferre
 static int refill_dma(void)
 {
 	struct req_ctx *rctx;
+	int res;
 
 	rctx = req_ctx_dequeue(&usb_state.queue);
 	if (!rctx) {
@@ -194,9 +195,9 @@ static int refill_dma(void)
 
 	req_ctx_set_state(rctx, RCTX_STATE_UDP_EP2_BUSY);
 
-	if (USBD_Write(EP_NR, rctx->data, rctx->tot_len, wr_compl_cb,
-			rctx) != USBD_STATUS_SUCCESS) {
-		TRACE_WARNING("USB EP busy while re-filling USB DMA\n\r");
+	if ((res = USBD_Write(EP_NR, rctx->data, rctx->tot_len, wr_compl_cb, rctx)) != USBD_STATUS_SUCCESS) {
+		TRACE_WARNING("USB EP busy while re-filling USB DMA: %d\n\r", res);
+		req_ctx_set_state(rctx, RCTX_STATE_FREE);
 		usb_state.active = 0;
 		return -EBUSY;
 	}
@@ -208,6 +209,9 @@ static int refill_dma(void)
 /* user API: requests us to start transmitting data via USB IN EP */
 void fastsource_start(void)
 {
+	if(USBD_GetState() != USBD_STATE_CONFIGURED)
+		return;
+
 	if (!usb_state.active) {
 		usb_state.active = 1;
 		refill_dma();
@@ -300,6 +304,7 @@ void USBDDriverCallbacks_InterfaceSettingChanged(unsigned char interface,
 						 unsigned char setting)
 {
 	printf("USB_IF_CHANGED(%u, %u)\n\r", interface, setting);
+
 	if ((interface == AUDDLoopRecDriverDescriptors_STREAMINGIN)
 	    && (setting == 0))
 		LED_Clear(USBD_LEDOTHER);
diff --git a/firmware/src/fast_source_descr.c b/firmware/src/fast_source_descr.c
index 792056e..b4e60e9 100644
--- a/firmware/src/fast_source_descr.c
+++ b/firmware/src/fast_source_descr.c
@@ -53,6 +53,9 @@
 
 #include <usb/device/dfu/dfu.h>
 
+#define AUDIOSOURCE 1
+
+
 //------------------------------------------------------------------------------
 //         Definitions
 //------------------------------------------------------------------------------
@@ -76,6 +79,8 @@
 #define AUDDLoopRecDriverDescriptors_RELEASE             0x0100
 //------------------------------------------------------------------------------
 
+
+#ifdef AUDIOSOURCE
 //------------------------------------------------------------------------------
 //         Internal types
 //------------------------------------------------------------------------------
@@ -1460,3 +1465,212 @@ const USBDDriverDescriptors auddFastSourceDriverDescriptors = {
     4 // Number of string descriptors
 };
 
+#else
+
+typedef struct {
+   /// Size of the descriptor in bytes.
+   unsigned char bLength;
+   /// Descriptor type (USBGenericDescriptor_ENDPOINT).
+   unsigned char bDescriptorType;
+   /// Address and direction of the endpoint.
+   unsigned char bEndpointAddress;
+   /// Endpoint type and additional characteristics (for isochronous endpoints).
+   unsigned char bmAttributes;
+   /// Maximum packet size (in bytes) of the endpoint.
+   unsigned short wMaxPacketSize;
+   /// Polling rate of the endpoint.
+   unsigned char bInterval;
+} __attribute__ ((packed)) BulkEndpointDescriptor; // GCC
+
+typedef struct {
+
+    /// Standard configuration.
+    USBConfigurationDescriptor configuration;
+    /// Audio stream interface.
+    USBInterfaceDescriptor stream;
+    /// Streaming out endpoint descriptor.
+    BulkEndpointDescriptor bulkInEndpoint;
+} __attribute__ ((packed)) BulkDriverConfigurationDescriptors; // GCC
+
+
+const USBDeviceDescriptor deviceDescriptor = {
+    sizeof(USBDeviceDescriptor),
+    USBGenericDescriptor_DEVICE,
+    USBDeviceDescriptor_USB2_00,
+    0, // class - all defined at interface level
+    0, // subclass
+    0, // protocol
+    CHIP_USB_ENDPOINTS_MAXPACKETSIZE(0),
+    AUDDLoopRecDriverDescriptors_VENDORID,
+    AUDDLoopRecDriverDescriptors_PRODUCTID,
+    AUDDLoopRecDriverDescriptors_RELEASE,
+    1, // Manufacturer string descriptor index
+    2, // Product string descriptor index
+    3, // Index of serial number string descriptor
+    1  // One possible configuration
+};
+
+/// configuration descriptors for bulk
+const BulkDriverConfigurationDescriptors configurationDescriptors = {
+
+    // Configuration descriptor
+    {
+        sizeof(USBConfigurationDescriptor),
+        USBGenericDescriptor_CONFIGURATION,
+        sizeof(BulkDriverConfigurationDescriptors),
+        1, // This configuration has 1 interfaces
+        1, // This is configuration #1
+        0, // No string descriptor
+        BOARD_USB_BMATTRIBUTES,
+        USBConfigurationDescriptor_POWER(100)
+    },
+    // Bulk interface standard descriptor
+    {
+        sizeof(USBInterfaceDescriptor),
+        USBGenericDescriptor_INTERFACE,
+        0, // interface number
+        0, // This is alternate setting #0
+        1, // This interface uses one endpoint
+        254, // class
+        0, // subclass
+        0, // protocol
+        0 // No string descriptor
+    },
+    {
+        sizeof(BulkEndpointDescriptor),
+        USBGenericDescriptor_ENDPOINT,
+        USBEndpointDescriptor_ADDRESS(
+            USBEndpointDescriptor_IN,
+            AUDDLoopRecDriverDescriptors_DATAIN),
+        USBEndpointDescriptor_BULK,
+        0x200, // packet size
+        0 // Polling interval = 0 ms
+    },
+};
+
+/// configuration descriptors for bulk
+const BulkDriverConfigurationDescriptors otherConfigurationDescriptors = {
+
+    // Configuration descriptor
+    {
+        sizeof(USBConfigurationDescriptor),
+        USBGenericDescriptor_OTHERSPEEDCONFIGURATION,
+        sizeof(BulkDriverConfigurationDescriptors),
+        1, // This configuration has 1 interface
+        1, // This is configuration #1
+        0, // No string descriptor
+        BOARD_USB_BMATTRIBUTES,
+        USBConfigurationDescriptor_POWER(100)
+    },
+    // Bulk interface standard descriptor
+    {
+        sizeof(USBInterfaceDescriptor),
+        USBGenericDescriptor_INTERFACE,
+        0, // interface number
+        0, // This is alternate setting #0
+        1, // This interface uses one endpoint
+        254, // class
+        0, // subclass
+        0, // protocol
+        0 // No string descriptor
+    },
+    {
+        sizeof(BulkEndpointDescriptor),
+        USBGenericDescriptor_ENDPOINT,
+        USBEndpointDescriptor_ADDRESS(
+            USBEndpointDescriptor_IN,
+            AUDDLoopRecDriverDescriptors_DATAIN),
+        USBEndpointDescriptor_BULK,
+        0x200, // packet size
+        0 // Polling interval = 0 ms
+    },
+};
+
+
+/// String descriptor with the supported languages.
+const unsigned char languageIdDescriptor[] = {
+
+    USBStringDescriptor_LENGTH(1),
+    USBGenericDescriptor_STRING,
+    USBStringDescriptor_ENGLISH_US
+};
+
+/// USB device qualifier descriptor.
+const USBDeviceQualifierDescriptor qualifierDescriptor = {
+
+    sizeof(USBDeviceQualifierDescriptor),
+    USBGenericDescriptor_DEVICEQUALIFIER,
+    USBDeviceDescriptor_USB2_00,
+    0, // class
+    0, // subclass
+    0, // protocol
+    CHIP_USB_ENDPOINTS_MAXPACKETSIZE(0),
+    1, // Device has one possible configuration
+    0 // Reserved
+};
+
+/// Manufacturer name.
+const unsigned char manufacturerDescriptor[] = {
+
+    USBStringDescriptor_LENGTH(8),
+    USBGenericDescriptor_STRING,
+    USBStringDescriptor_UNICODE('s'),
+    USBStringDescriptor_UNICODE('y'),
+    USBStringDescriptor_UNICODE('s'),
+    USBStringDescriptor_UNICODE('m'),
+    USBStringDescriptor_UNICODE('o'),
+    USBStringDescriptor_UNICODE('c'),
+    USBStringDescriptor_UNICODE('o'),
+    USBStringDescriptor_UNICODE('m'),
+};
+
+/// Product name.
+const unsigned char productDescriptor[] = {
+
+    USBStringDescriptor_LENGTH(7),
+    USBGenericDescriptor_STRING,
+    USBStringDescriptor_UNICODE('O'),
+    USBStringDescriptor_UNICODE('s'),
+    USBStringDescriptor_UNICODE('m'),
+    USBStringDescriptor_UNICODE('o'),
+    USBStringDescriptor_UNICODE('S'),
+    USBStringDescriptor_UNICODE('D'),
+    USBStringDescriptor_UNICODE('R'),
+};
+
+/// Product serial number.
+const unsigned char serialNumberDescriptor[] = {
+
+    USBStringDescriptor_LENGTH(3),
+    USBGenericDescriptor_STRING,
+    USBStringDescriptor_UNICODE('6'),
+    USBStringDescriptor_UNICODE('6'),
+    USBStringDescriptor_UNICODE('6')
+};
+
+/// Array of pointers to the four string descriptors.
+const unsigned char *stringDescriptors[] = {
+
+    languageIdDescriptor,
+    manufacturerDescriptor,
+    productDescriptor,
+    serialNumberDescriptor,
+};
+
+const USBDDriverDescriptors auddFastSourceDriverDescriptors = {
+    &deviceDescriptor,
+    (const USBConfigurationDescriptor *) &configurationDescriptors,
+#if defined (CHIP_USB_UDPHS) || defined(CHIP_USB_OTGHS)
+    &qualifierDescriptor,
+    (const USBConfigurationDescriptor *) &otherConfigurationDescriptors,
+    &deviceDescriptor,
+    (const USBConfigurationDescriptor *) &configurationDescriptors,
+    &qualifierDescriptor,
+    (const USBConfigurationDescriptor *) &otherConfigurationDescriptors,
+#else
+    0, 0, 0, 0, 0, 0,
+#endif
+    stringDescriptors,
+    4 // Number of string descriptors
+};
+#endif
diff --git a/firmware/src/osdr_ssc.c b/firmware/src/osdr_ssc.c
index b392859..13ac23e 100644
--- a/firmware/src/osdr_ssc.c
+++ b/firmware/src/osdr_ssc.c
@@ -107,8 +107,7 @@ static void __refill_dma()
 		struct req_ctx *rctx;
 
 		/* obtain an unused request context from pool */
-		rctx = req_ctx_find_get(0, RCTX_STATE_FREE,
-					RCTX_STATE_SSC_RX_PENDING);
+		rctx = req_ctx_find_get(0, RCTX_STATE_FREE, RCTX_STATE_SSC_RX_PENDING);
 		if (!rctx) {
 			break;
 		}
@@ -129,8 +128,10 @@ static void __refill_dma()
 		req_ctx_enqueue(&ssc_state.pending_rctx, rctx);
 		ssc_state.hdma_chain_len++;
 	}
+	/*
 	if (ssc_state.hdma_chain_len <= 1)
 		TRACE_ERROR("Unable to get rctx for SSC DMA refill\n\r");
+	*/
 }
 
 int ssc_dma_start(void)
@@ -140,12 +141,12 @@ int ssc_dma_start(void)
 	__refill_dma();
 
 	if (ssc_state.active) {
-		TRACE_WARNING("Cannot start SSC DMA, active == 1\n\r");
+		//TRACE_WARNING("Cannot start SSC DMA, active == 1\n\r");
 		return -EBUSY;
 	}
 
 	if (llist_empty(&ssc_state.pending_rctx)) {
-		TRACE_WARNING("Cannot start SSC DMA, no rctx pending\n\r");
+		//TRACE_WARNING("Cannot start SSC DMA, no rctx pending\n\r");
 		return -ENOMEM;
 	}
 
@@ -324,5 +325,3 @@ int ssc_init(void)
 
 	return 0;
 }
-
-
diff --git a/software/libosmosdr/src/libosmosdr.c b/software/libosmosdr/src/libosmosdr.c
index e825c8f..0a01320 100644
--- a/software/libosmosdr/src/libosmosdr.c
+++ b/software/libosmosdr/src/libosmosdr.c
@@ -541,7 +541,7 @@ int osmosdr_read_sync(osmosdr_dev_t *dev, void *buf, int len, int *n_read)
 	if (!dev)
 		return -1;
 
-	return libusb_bulk_transfer(dev->devh, 0x81, buf, len, n_read, BULK_TIMEOUT);
+	return libusb_bulk_transfer(dev->devh, 0x86, buf, len, n_read, BULK_TIMEOUT);
 }
 
 static void LIBUSB_CALL _libusb_callback(struct libusb_transfer *xfer)
@@ -644,7 +644,7 @@ int osmosdr_read_async(osmosdr_dev_t *dev, osmosdr_read_async_cb_t cb, void *ctx
 	for(i = 0; i < dev->xfer_buf_num; ++i) {
 		libusb_fill_bulk_transfer(dev->xfer[i],
 					  dev->devh,
-					  0x81,
+					  0x86,
 					  dev->xfer_buf[i],
 					  dev->xfer_buf_len,
 					  _libusb_callback,
