diff --git a/stm/Makefile b/stm/Makefile
index faa0b88691993912ccfeb3f10ada1dcbddf545d0..23bcffc134bbf7300337c6606304387091a6a102 100644
--- a/stm/Makefile
+++ b/stm/Makefile
@@ -9,7 +9,7 @@ LD = arm-none-eabi-ld
 CFLAGS_CORTEX_M4 = -mthumb -mtune=cortex-m4 -mabi=aapcs-linux -mcpu=cortex-m4 -mfloat-abi=hard -DSTM32F40XX -DHSE_VALUE=8000000
 CFLAGS = -I. -I$(PYSRC) -I$(FATFSSRC) -I$(STMSRC) -Wall -ansi -std=gnu99 -Os -DNDEBUG $(CFLAGS_CORTEX_M4)
 CFLAGS_PY = -DEMIT_ENABLE_THUMB
-LDFLAGS = --nostdlib -T stm.ld
+LDFLAGS = --nostdlib -T stm32f405.ld
 
 SRC_C = \
 	main.c \
@@ -63,10 +63,9 @@ SRC_STM = \
 	usbd_req.c \
 	usbd_usr.c \
 	usbd_desc.c \
-	usbd_cdc_core.c \
+	usbd_pyb_core.c \
 	usbd_cdc_vcp.c \
 	usbd_msc_bot.c  \
-	usbd_msc_core.c \
 	usbd_msc_data.c \
 	usbd_msc_scsi.c \
 	usbd_storage_msd.c \
diff --git a/stm/lib/usb_conf.h b/stm/lib/usb_conf.h
index 9fd0d739c54919f198b03a5448ecc730b29c7718..5e736f91e200a19b17dadb22f35cffe754dcb090 100644
--- a/stm/lib/usb_conf.h
+++ b/stm/lib/usb_conf.h
@@ -170,9 +170,9 @@
 #ifdef USB_OTG_FS_CORE
  #define RX_FIFO_FS_SIZE                          128
  #define TX0_FIFO_FS_SIZE                          32
- #define TX1_FIFO_FS_SIZE                         128
+ #define TX1_FIFO_FS_SIZE                          64
  #define TX2_FIFO_FS_SIZE                          32
- #define TX3_FIFO_FS_SIZE                           0
+ #define TX3_FIFO_FS_SIZE                          64
 
 // #define USB_OTG_FS_LOW_PWR_MGMT_SUPPORT
 // #define USB_OTG_FS_SOF_OUTPUT_ENABLED
diff --git a/stm/lib/usbd_cdc_conf.h b/stm/lib/usbd_cdc_conf.h
deleted file mode 100644
index 2a1608ac9ffbb923b2428ab9ef0f6a63ac404755..0000000000000000000000000000000000000000
--- a/stm/lib/usbd_cdc_conf.h
+++ /dev/null
@@ -1,105 +0,0 @@
-/**
-  ******************************************************************************
-  * @file    usbd_conf.h
-  * @author  MCD Application Team
-  * @version V1.1.0
-  * @date    19-March-2012
-  * @brief   USB Device configuration file
-  ******************************************************************************
-  * @attention
-  *
-  * <h2><center>&copy; COPYRIGHT 2012 STMicroelectronics</center></h2>
-  *
-  * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
-  * You may not use this file except in compliance with the License.
-  * You may obtain a copy of the License at:
-  *
-  *        http://www.st.com/software_license_agreement_liberty_v2
-  *
-  * Unless required by applicable law or agreed to in writing, software 
-  * distributed under the License is distributed on an "AS IS" BASIS, 
-  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  * See the License for the specific language governing permissions and
-  * limitations under the License.
-  *
-  ******************************************************************************
-  */
-
-/* Define to prevent recursive inclusion -------------------------------------*/
-#ifndef __USBD_VCP_CONF__H__
-#define __USBD_VCP_CONF__H__
-
-/* Includes ------------------------------------------------------------------*/
-#include "usb_conf.h"
-
-/** @defgroup USB_CONF_Exported_Defines
-  * @{
-  */ 
-//#define USBD_CFG_MAX_NUM                1
-//#define USBD_ITF_MAX_NUM                1
-
-//#define USBD_SELF_POWERED               
-
-/** @defgroup USB_VCP_Class_Layer_Parameter
-  * @{
-  */ 
-#define CDC_IN_EP                       0x81  /* EP1 for data IN */
-#define CDC_OUT_EP                      0x01  /* EP1 for data OUT */
-#define CDC_CMD_EP                      0x82  /* EP2 for CDC commands */
-
-/* CDC Endpoints parameters: you can fine tune these values depending on the needed baudrates and performance. */
-#ifdef USE_USB_OTG_HS
- #define CDC_DATA_MAX_PACKET_SIZE       512  /* Endpoint IN & OUT Packet size */
- #define CDC_CMD_PACKET_SZE             8    /* Control Endpoint Packet size */
-
- #define CDC_IN_FRAME_INTERVAL          40   /* Number of micro-frames between IN transfers */
- #define APP_RX_DATA_SIZE               2048 /* Total size of IN buffer: 
-                                                APP_RX_DATA_SIZE*8/MAX_BAUDARATE*1000 should be > CDC_IN_FRAME_INTERVAL*8 */
-#else
- #define CDC_DATA_MAX_PACKET_SIZE       64   /* Endpoint IN & OUT Packet size */
- #define CDC_CMD_PACKET_SZE             8    /* Control Endpoint Packet size */
-
- #define CDC_IN_FRAME_INTERVAL          5    /* Number of frames between IN transfers */
- #define APP_RX_DATA_SIZE               2048 /* Total size of IN buffer: 
-                                                APP_RX_DATA_SIZE*8/MAX_BAUDARATE*1000 should be > CDC_IN_FRAME_INTERVAL */
-#endif /* USE_USB_OTG_HS */
-
-#define APP_FOPS                        VCP_fops
-/**
-  * @}
-  */ 
-
-/** @defgroup USB_CONF_Exported_Types
-  * @{
-  */ 
-/**
-  * @}
-  */ 
-
-
-/** @defgroup USB_CONF_Exported_Macros
-  * @{
-  */ 
-/**
-  * @}
-  */ 
-
-/** @defgroup USB_CONF_Exported_Variables
-  * @{
-  */ 
-/**
-  * @}
-  */ 
-
-/** @defgroup USB_CONF_Exported_FunctionsPrototype
-  * @{
-  */ 
-/**
-  * @}
-  */ 
-
-
-#endif //__USBD_VCP_CONF__H__
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
-
diff --git a/stm/lib/usbd_cdc_core.c b/stm/lib/usbd_cdc_core.c
deleted file mode 100644
index 28c4e0336ff801bb1fd7df376f01bf3e96798d86..0000000000000000000000000000000000000000
--- a/stm/lib/usbd_cdc_core.c
+++ /dev/null
@@ -1,818 +0,0 @@
-/**
-  ******************************************************************************
-  * @file    usbd_cdc_core.c
-  * @author  MCD Application Team
-  * @version V1.1.0
-  * @date    19-March-2012
-  * @brief   This file provides the high layer firmware functions to manage the 
-  *          following functionalities of the USB CDC Class:
-  *           - Initialization and Configuration of high and low layer
-  *           - Enumeration as CDC Device (and enumeration for each implemented memory interface)
-  *           - OUT/IN data transfer
-  *           - Command IN transfer (class requests management)
-  *           - Error management
-  *           
-  *  @verbatim
-  *      
-  *          ===================================================================      
-  *                                CDC Class Driver Description
-  *          =================================================================== 
-  *           This driver manages the "Universal Serial Bus Class Definitions for Communications Devices
-  *           Revision 1.2 November 16, 2007" and the sub-protocol specification of "Universal Serial Bus 
-  *           Communications Class Subclass Specification for PSTN Devices Revision 1.2 February 9, 2007"
-  *           This driver implements the following aspects of the specification:
-  *             - Device descriptor management
-  *             - Configuration descriptor management
-  *             - Enumeration as CDC device with 2 data endpoints (IN and OUT) and 1 command endpoint (IN)
-  *             - Requests management (as described in section 6.2 in specification)
-  *             - Abstract Control Model compliant
-  *             - Union Functional collection (using 1 IN endpoint for control)
-  *             - Data interface class
-
-  *           @note
-  *             For the Abstract Control Model, this core allows only transmitting the requests to
-  *             lower layer dispatcher (ie. usbd_cdc_vcp.c/.h) which should manage each request and
-  *             perform relative actions.
-  * 
-  *           These aspects may be enriched or modified for a specific user application.
-  *          
-  *            This driver doesn't implement the following aspects of the specification 
-  *            (but it is possible to manage these features with some modifications on this driver):
-  *             - Any class-specific aspect relative to communication classes should be managed by user application.
-  *             - All communication classes other than PSTN are not managed
-  *      
-  *  @endverbatim
-  *                                  
-  ******************************************************************************
-  * @attention
-  *
-  * <h2><center>&copy; COPYRIGHT 2012 STMicroelectronics</center></h2>
-  *
-  * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
-  * You may not use this file except in compliance with the License.
-  * You may obtain a copy of the License at:
-  *
-  *        http://www.st.com/software_license_agreement_liberty_v2
-  *
-  * Unless required by applicable law or agreed to in writing, software 
-  * distributed under the License is distributed on an "AS IS" BASIS, 
-  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  * See the License for the specific language governing permissions and
-  * limitations under the License.
-  *
-  ******************************************************************************
-  */ 
-
-/* Includes ------------------------------------------------------------------*/
-#include "usbd_cdc_core.h"
-#include "usbd_desc.h"
-#include "usbd_req.h"
-#include "usbd_cdc_conf.h"
-
-
-/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY
-  * @{
-  */
-
-
-/** @defgroup usbd_cdc 
-  * @brief usbd core module
-  * @{
-  */ 
-
-/** @defgroup usbd_cdc_Private_TypesDefinitions
-  * @{
-  */ 
-/**
-  * @}
-  */ 
-
-
-/** @defgroup usbd_cdc_Private_Defines
-  * @{
-  */ 
-/**
-  * @}
-  */ 
-
-
-/** @defgroup usbd_cdc_Private_Macros
-  * @{
-  */ 
-/**
-  * @}
-  */ 
-
-
-/** @defgroup usbd_cdc_Private_FunctionPrototypes
-  * @{
-  */
-
-/*********************************************
-   CDC Device library callbacks
- *********************************************/
-static uint8_t  usbd_cdc_Init        (void  *pdev, uint8_t cfgidx);
-static uint8_t  usbd_cdc_DeInit      (void  *pdev, uint8_t cfgidx);
-static uint8_t  usbd_cdc_Setup       (void  *pdev, USB_SETUP_REQ *req);
-static uint8_t  usbd_cdc_EP0_RxReady  (void *pdev);
-static uint8_t  usbd_cdc_DataIn      (void *pdev, uint8_t epnum);
-static uint8_t  usbd_cdc_DataOut     (void *pdev, uint8_t epnum);
-static uint8_t  usbd_cdc_SOF         (void *pdev);
-
-/*********************************************
-   CDC specific management functions
- *********************************************/
-static void Handle_USBAsynchXfer  (void *pdev);
-static uint8_t  *USBD_cdc_GetCfgDesc (uint8_t speed, uint16_t *length);
-#ifdef USE_USB_OTG_HS  
-static uint8_t  *USBD_cdc_GetOtherCfgDesc (uint8_t speed, uint16_t *length);
-#endif
-/**
-  * @}
-  */ 
-
-/** @defgroup usbd_cdc_Private_Variables
-  * @{
-  */ 
-extern CDC_IF_Prop_TypeDef  APP_FOPS;
-extern uint8_t USBD_DeviceDesc   [USB_SIZ_DEVICE_DESC];
-
-#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
-  #if defined ( __ICCARM__ ) /*!< IAR Compiler */
-    #pragma data_alignment=4   
-  #endif
-#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */
-__ALIGN_BEGIN uint8_t usbd_cdc_CfgDesc  [USB_CDC_CONFIG_DESC_SIZ] __ALIGN_END ;
-
-#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
-  #if defined ( __ICCARM__ ) /*!< IAR Compiler */
-    #pragma data_alignment=4   
-  #endif
-#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */
-__ALIGN_BEGIN uint8_t usbd_cdc_OtherCfgDesc  [USB_CDC_CONFIG_DESC_SIZ] __ALIGN_END ;
-
-#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
-  #if defined ( __ICCARM__ ) /*!< IAR Compiler */
-    #pragma data_alignment=4   
-  #endif
-#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */
-__ALIGN_BEGIN static __IO uint32_t  usbd_cdc_AltSet  __ALIGN_END = 0;
-
-#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
-  #if defined ( __ICCARM__ ) /*!< IAR Compiler */
-    #pragma data_alignment=4   
-  #endif
-#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */
-__ALIGN_BEGIN uint8_t USB_Rx_Buffer   [CDC_DATA_MAX_PACKET_SIZE] __ALIGN_END ;
-
-#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
-  #if defined ( __ICCARM__ ) /*!< IAR Compiler */
-    #pragma data_alignment=4   
-  #endif
-#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */
-__ALIGN_BEGIN uint8_t APP_Rx_Buffer   [APP_RX_DATA_SIZE] __ALIGN_END ; 
-
-
-#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
-  #if defined ( __ICCARM__ ) /*!< IAR Compiler */
-    #pragma data_alignment=4   
-  #endif
-#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */
-__ALIGN_BEGIN uint8_t CmdBuff[CDC_CMD_PACKET_SZE] __ALIGN_END ;
-
-uint32_t APP_Rx_ptr_in  = 0;
-uint32_t APP_Rx_ptr_out = 0;
-uint32_t APP_Rx_length  = 0;
-
-uint8_t  USB_Tx_State = 0;
-
-static uint32_t cdcCmd = 0xFF;
-static uint32_t cdcLen = 0;
-
-/* CDC interface class callbacks structure */
-USBD_Class_cb_TypeDef  USBD_CDC_cb = 
-{
-  usbd_cdc_Init,
-  usbd_cdc_DeInit,
-  usbd_cdc_Setup,
-  NULL,                 /* EP0_TxSent, */
-  usbd_cdc_EP0_RxReady,
-  usbd_cdc_DataIn,
-  usbd_cdc_DataOut,
-  usbd_cdc_SOF,
-  NULL,
-  NULL,     
-  USBD_cdc_GetCfgDesc,
-#ifdef USE_USB_OTG_HS   
-  USBD_cdc_GetOtherCfgDesc, /* use same cobfig as per FS */
-#endif /* USE_USB_OTG_HS  */
-};
-
-#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
-  #if defined ( __ICCARM__ ) /*!< IAR Compiler */
-    #pragma data_alignment=4   
-  #endif
-#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */
-/* USB CDC device Configuration Descriptor */
-__ALIGN_BEGIN uint8_t usbd_cdc_CfgDesc[USB_CDC_CONFIG_DESC_SIZ]  __ALIGN_END =
-{
-  /*Configuration Descriptor*/
-  0x09,   /* bLength: Configuration Descriptor size */
-  USB_CONFIGURATION_DESCRIPTOR_TYPE,      /* bDescriptorType: Configuration */
-  USB_CDC_CONFIG_DESC_SIZ,                /* wTotalLength:no of returned bytes */
-  0x00,
-  0x02,   /* bNumInterfaces: 2 interface */
-  0x01,   /* bConfigurationValue: Configuration value */
-  0x00,   /* iConfiguration: Index of string descriptor describing the configuration */
-  0xC0,   /* bmAttributes: self powered */
-  0x32,   /* MaxPower 0 mA */
-  
-  /*---------------------------------------------------------------------------*/
-  
-  /*Interface Descriptor */
-  0x09,   /* bLength: Interface Descriptor size */
-  USB_INTERFACE_DESCRIPTOR_TYPE,  /* bDescriptorType: Interface */
-  /* Interface descriptor type */
-  0x00,   /* bInterfaceNumber: Number of Interface */
-  0x00,   /* bAlternateSetting: Alternate setting */
-  0x01,   /* bNumEndpoints: One endpoints used */
-  0x02,   /* bInterfaceClass: Communication Interface Class */
-  0x02,   /* bInterfaceSubClass: Abstract Control Model */
-  0x01,   /* bInterfaceProtocol: Common AT commands */
-  0x00,   /* iInterface: */
-  
-  /*Header Functional Descriptor*/
-  0x05,   /* bLength: Endpoint Descriptor size */
-  0x24,   /* bDescriptorType: CS_INTERFACE */
-  0x00,   /* bDescriptorSubtype: Header Func Desc */
-  0x10,   /* bcdCDC: spec release number */
-  0x01,
-  
-  /*Call Management Functional Descriptor*/
-  0x05,   /* bFunctionLength */
-  0x24,   /* bDescriptorType: CS_INTERFACE */
-  0x01,   /* bDescriptorSubtype: Call Management Func Desc */
-  0x00,   /* bmCapabilities: D0+D1 */
-  0x01,   /* bDataInterface: 1 */
-  
-  /*ACM Functional Descriptor*/
-  0x04,   /* bFunctionLength */
-  0x24,   /* bDescriptorType: CS_INTERFACE */
-  0x02,   /* bDescriptorSubtype: Abstract Control Management desc */
-  0x02,   /* bmCapabilities */
-  
-  /*Union Functional Descriptor*/
-  0x05,   /* bFunctionLength */
-  0x24,   /* bDescriptorType: CS_INTERFACE */
-  0x06,   /* bDescriptorSubtype: Union func desc */
-  0x00,   /* bMasterInterface: Communication class interface */
-  0x01,   /* bSlaveInterface0: Data Class Interface */
-  
-  /*Endpoint 2 Descriptor*/
-  0x07,                           /* bLength: Endpoint Descriptor size */
-  USB_ENDPOINT_DESCRIPTOR_TYPE,   /* bDescriptorType: Endpoint */
-  CDC_CMD_EP,                     /* bEndpointAddress */
-  0x03,                           /* bmAttributes: Interrupt */
-  LOBYTE(CDC_CMD_PACKET_SZE),     /* wMaxPacketSize: */
-  HIBYTE(CDC_CMD_PACKET_SZE),
-#ifdef USE_USB_OTG_HS
-  0x10,                           /* bInterval: */
-#else
-  0xFF,                           /* bInterval: */
-#endif /* USE_USB_OTG_HS */
-  
-  /*---------------------------------------------------------------------------*/
-  
-  /*Data class interface descriptor*/
-  0x09,   /* bLength: Endpoint Descriptor size */
-  USB_INTERFACE_DESCRIPTOR_TYPE,  /* bDescriptorType: */
-  0x01,   /* bInterfaceNumber: Number of Interface */
-  0x00,   /* bAlternateSetting: Alternate setting */
-  0x02,   /* bNumEndpoints: Two endpoints used */
-  0x0A,   /* bInterfaceClass: CDC */
-  0x00,   /* bInterfaceSubClass: */
-  0x00,   /* bInterfaceProtocol: */
-  0x00,   /* iInterface: */
-  
-  /*Endpoint OUT Descriptor*/
-  0x07,   /* bLength: Endpoint Descriptor size */
-  USB_ENDPOINT_DESCRIPTOR_TYPE,      /* bDescriptorType: Endpoint */
-  CDC_OUT_EP,                        /* bEndpointAddress */
-  0x02,                              /* bmAttributes: Bulk */
-  LOBYTE(CDC_DATA_MAX_PACKET_SIZE),  /* wMaxPacketSize: */
-  HIBYTE(CDC_DATA_MAX_PACKET_SIZE),
-  0x00,                              /* bInterval: ignore for Bulk transfer */
-  
-  /*Endpoint IN Descriptor*/
-  0x07,   /* bLength: Endpoint Descriptor size */
-  USB_ENDPOINT_DESCRIPTOR_TYPE,      /* bDescriptorType: Endpoint */
-  CDC_IN_EP,                         /* bEndpointAddress */
-  0x02,                              /* bmAttributes: Bulk */
-  LOBYTE(CDC_DATA_MAX_PACKET_SIZE),  /* wMaxPacketSize: */
-  HIBYTE(CDC_DATA_MAX_PACKET_SIZE),
-  0x00                               /* bInterval: ignore for Bulk transfer */
-} ;
-
-#ifdef USE_USB_OTG_HS
-#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
-  #if defined ( __ICCARM__ ) /*!< IAR Compiler */
-    #pragma data_alignment=4   
-  #endif
-#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */ 
-__ALIGN_BEGIN uint8_t usbd_cdc_OtherCfgDesc[USB_CDC_CONFIG_DESC_SIZ]  __ALIGN_END =
-{ 
-  0x09,   /* bLength: Configuation Descriptor size */
-  USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION,   
-  USB_CDC_CONFIG_DESC_SIZ,
-  0x00,
-  0x02,   /* bNumInterfaces: 2 interfaces */
-  0x01,   /* bConfigurationValue: */
-  0x04,   /* iConfiguration: */
-  0xC0,   /* bmAttributes: */
-  0x32,   /* MaxPower 100 mA */  
-  
-  /*Interface Descriptor */
-  0x09,   /* bLength: Interface Descriptor size */
-  USB_INTERFACE_DESCRIPTOR_TYPE,  /* bDescriptorType: Interface */
-  /* Interface descriptor type */
-  0x00,   /* bInterfaceNumber: Number of Interface */
-  0x00,   /* bAlternateSetting: Alternate setting */
-  0x01,   /* bNumEndpoints: One endpoints used */
-  0x02,   /* bInterfaceClass: Communication Interface Class */
-  0x02,   /* bInterfaceSubClass: Abstract Control Model */
-  0x01,   /* bInterfaceProtocol: Common AT commands */
-  0x00,   /* iInterface: */
-  
-  /*Header Functional Descriptor*/
-  0x05,   /* bLength: Endpoint Descriptor size */
-  0x24,   /* bDescriptorType: CS_INTERFACE */
-  0x00,   /* bDescriptorSubtype: Header Func Desc */
-  0x10,   /* bcdCDC: spec release number */
-  0x01,
-  
-  /*Call Management Functional Descriptor*/
-  0x05,   /* bFunctionLength */
-  0x24,   /* bDescriptorType: CS_INTERFACE */
-  0x01,   /* bDescriptorSubtype: Call Management Func Desc */
-  0x00,   /* bmCapabilities: D0+D1 */
-  0x01,   /* bDataInterface: 1 */
-  
-  /*ACM Functional Descriptor*/
-  0x04,   /* bFunctionLength */
-  0x24,   /* bDescriptorType: CS_INTERFACE */
-  0x02,   /* bDescriptorSubtype: Abstract Control Management desc */
-  0x02,   /* bmCapabilities */
-  
-  /*Union Functional Descriptor*/
-  0x05,   /* bFunctionLength */
-  0x24,   /* bDescriptorType: CS_INTERFACE */
-  0x06,   /* bDescriptorSubtype: Union func desc */
-  0x00,   /* bMasterInterface: Communication class interface */
-  0x01,   /* bSlaveInterface0: Data Class Interface */
-  
-  /*Endpoint 2 Descriptor*/
-  0x07,                           /* bLength: Endpoint Descriptor size */
-  USB_ENDPOINT_DESCRIPTOR_TYPE,   /* bDescriptorType: Endpoint */
-  CDC_CMD_EP,                     /* bEndpointAddress */
-  0x03,                           /* bmAttributes: Interrupt */
-  LOBYTE(CDC_CMD_PACKET_SZE),     /* wMaxPacketSize: */
-  HIBYTE(CDC_CMD_PACKET_SZE),
-  0xFF,                           /* bInterval: */
-  
-  /*---------------------------------------------------------------------------*/
-  
-  /*Data class interface descriptor*/
-  0x09,   /* bLength: Endpoint Descriptor size */
-  USB_INTERFACE_DESCRIPTOR_TYPE,  /* bDescriptorType: */
-  0x01,   /* bInterfaceNumber: Number of Interface */
-  0x00,   /* bAlternateSetting: Alternate setting */
-  0x02,   /* bNumEndpoints: Two endpoints used */
-  0x0A,   /* bInterfaceClass: CDC */
-  0x00,   /* bInterfaceSubClass: */
-  0x00,   /* bInterfaceProtocol: */
-  0x00,   /* iInterface: */
-  
-  /*Endpoint OUT Descriptor*/
-  0x07,   /* bLength: Endpoint Descriptor size */
-  USB_ENDPOINT_DESCRIPTOR_TYPE,      /* bDescriptorType: Endpoint */
-  CDC_OUT_EP,                        /* bEndpointAddress */
-  0x02,                              /* bmAttributes: Bulk */
-  0x40,                              /* wMaxPacketSize: */
-  0x00,
-  0x00,                              /* bInterval: ignore for Bulk transfer */
-  
-  /*Endpoint IN Descriptor*/
-  0x07,   /* bLength: Endpoint Descriptor size */
-  USB_ENDPOINT_DESCRIPTOR_TYPE,     /* bDescriptorType: Endpoint */
-  CDC_IN_EP,                        /* bEndpointAddress */
-  0x02,                             /* bmAttributes: Bulk */
-  0x40,                             /* wMaxPacketSize: */
-  0x00,
-  0x00                              /* bInterval */
-};
-#endif /* USE_USB_OTG_HS  */
-
-/**
-  * @}
-  */ 
-
-/** @defgroup usbd_cdc_Private_Functions
-  * @{
-  */ 
-
-/**
-  * @brief  usbd_cdc_Init
-  *         Initilaize the CDC interface
-  * @param  pdev: device instance
-  * @param  cfgidx: Configuration index
-  * @retval status
-  */
-static uint8_t  usbd_cdc_Init (void  *pdev, 
-                               uint8_t cfgidx)
-{
-  uint8_t *pbuf;
-
-  /* Open EP IN */
-  DCD_EP_Open(pdev,
-              CDC_IN_EP,
-              CDC_DATA_IN_PACKET_SIZE,
-              USB_OTG_EP_BULK);
-  
-  /* Open EP OUT */
-  DCD_EP_Open(pdev,
-              CDC_OUT_EP,
-              CDC_DATA_OUT_PACKET_SIZE,
-              USB_OTG_EP_BULK);
-  
-  /* Open Command IN EP */
-  DCD_EP_Open(pdev,
-              CDC_CMD_EP,
-              CDC_CMD_PACKET_SZE,
-              USB_OTG_EP_INT);
-  
-  pbuf = (uint8_t *)USBD_DeviceDesc;
-  pbuf[4] = DEVICE_CLASS_CDC;
-  pbuf[5] = DEVICE_SUBCLASS_CDC;
-  
-  /* Initialize the Interface physical components */
-  APP_FOPS.pIf_Init();
-
-  /* Prepare Out endpoint to receive next packet */
-  DCD_EP_PrepareRx(pdev,
-                   CDC_OUT_EP,
-                   (uint8_t*)(USB_Rx_Buffer),
-                   CDC_DATA_OUT_PACKET_SIZE);
-  
-  return USBD_OK;
-}
-
-/**
-  * @brief  usbd_cdc_Init
-  *         DeInitialize the CDC layer
-  * @param  pdev: device instance
-  * @param  cfgidx: Configuration index
-  * @retval status
-  */
-static uint8_t  usbd_cdc_DeInit (void  *pdev, 
-                                 uint8_t cfgidx)
-{
-  /* Open EP IN */
-  DCD_EP_Close(pdev,
-              CDC_IN_EP);
-  
-  /* Open EP OUT */
-  DCD_EP_Close(pdev,
-              CDC_OUT_EP);
-  
-  /* Open Command IN EP */
-  DCD_EP_Close(pdev,
-              CDC_CMD_EP);
-
-  /* Restore default state of the Interface physical components */
-  APP_FOPS.pIf_DeInit();
-  
-  return USBD_OK;
-}
-
-/**
-  * @brief  usbd_cdc_Setup
-  *         Handle the CDC specific requests
-  * @param  pdev: instance
-  * @param  req: usb requests
-  * @retval status
-  */
-static uint8_t  usbd_cdc_Setup (void  *pdev, 
-                                USB_SETUP_REQ *req)
-{
-  uint16_t len=USB_CDC_DESC_SIZ;
-  uint8_t  *pbuf=usbd_cdc_CfgDesc + 9;
-  
-  switch (req->bmRequest & USB_REQ_TYPE_MASK)
-  {
-    /* CDC Class Requests -------------------------------*/
-  case USB_REQ_TYPE_CLASS :
-      /* Check if the request is a data setup packet */
-      if (req->wLength)
-      {
-        /* Check if the request is Device-to-Host */
-        if (req->bmRequest & 0x80)
-        {
-          /* Get the data to be sent to Host from interface layer */
-          APP_FOPS.pIf_Ctrl(req->bRequest, CmdBuff, req->wLength);
-          
-          /* Send the data to the host */
-          USBD_CtlSendData (pdev, 
-                            CmdBuff,
-                            req->wLength);          
-        }
-        else /* Host-to-Device requeset */
-        {
-          /* Set the value of the current command to be processed */
-          cdcCmd = req->bRequest;
-          cdcLen = req->wLength;
-          
-          /* Prepare the reception of the buffer over EP0
-          Next step: the received data will be managed in usbd_cdc_EP0_TxSent() 
-          function. */
-          USBD_CtlPrepareRx (pdev,
-                             CmdBuff,
-                             req->wLength);          
-        }
-      }
-      else /* No Data request */
-      {
-        /* Transfer the command to the interface layer */
-        APP_FOPS.pIf_Ctrl(req->bRequest, NULL, 0);
-      }
-      
-      return USBD_OK;
-      
-    default:
-      USBD_CtlError (pdev, req);
-      return USBD_FAIL;
-    
-      
-      
-    /* Standard Requests -------------------------------*/
-  case USB_REQ_TYPE_STANDARD:
-    switch (req->bRequest)
-    {
-    case USB_REQ_GET_DESCRIPTOR: 
-      if( (req->wValue >> 8) == CDC_DESCRIPTOR_TYPE)
-      {
-#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
-        pbuf = usbd_cdc_Desc;   
-#else
-        pbuf = usbd_cdc_CfgDesc + 9 + (9 * USBD_ITF_MAX_NUM);
-#endif 
-        len = MIN(USB_CDC_DESC_SIZ , req->wLength);
-      }
-      
-      USBD_CtlSendData (pdev, 
-                        pbuf,
-                        len);
-      break;
-      
-    case USB_REQ_GET_INTERFACE :
-      USBD_CtlSendData (pdev,
-                        (uint8_t *)&usbd_cdc_AltSet,
-                        1);
-      break;
-      
-    case USB_REQ_SET_INTERFACE :
-      if ((uint8_t)(req->wValue) < USBD_ITF_MAX_NUM)
-      {
-        usbd_cdc_AltSet = (uint8_t)(req->wValue);
-      }
-      else
-      {
-        /* Call the error management function (command will be nacked */
-        USBD_CtlError (pdev, req);
-      }
-      break;
-    }
-  }
-  return USBD_OK;
-}
-
-/**
-  * @brief  usbd_cdc_EP0_RxReady
-  *         Data received on control endpoint
-  * @param  pdev: device device instance
-  * @retval status
-  */
-static uint8_t  usbd_cdc_EP0_RxReady (void  *pdev)
-{ 
-  if (cdcCmd != NO_CMD)
-  {
-    /* Process the data */
-    APP_FOPS.pIf_Ctrl(cdcCmd, CmdBuff, cdcLen);
-    
-    /* Reset the command variable to default value */
-    cdcCmd = NO_CMD;
-  }
-  
-  return USBD_OK;
-}
-
-/**
-  * @brief  usbd_audio_DataIn
-  *         Data sent on non-control IN endpoint
-  * @param  pdev: device instance
-  * @param  epnum: endpoint number
-  * @retval status
-  */
-static uint8_t  usbd_cdc_DataIn (void *pdev, uint8_t epnum)
-{
-  uint16_t USB_Tx_ptr;
-  uint16_t USB_Tx_length;
-
-  if (USB_Tx_State == 1)
-  {
-    if (APP_Rx_length == 0) 
-    {
-      USB_Tx_State = 0;
-    }
-    else 
-    {
-      if (APP_Rx_length > CDC_DATA_IN_PACKET_SIZE){
-        USB_Tx_ptr = APP_Rx_ptr_out;
-        USB_Tx_length = CDC_DATA_IN_PACKET_SIZE;
-        
-        APP_Rx_ptr_out += CDC_DATA_IN_PACKET_SIZE;
-        APP_Rx_length -= CDC_DATA_IN_PACKET_SIZE;    
-      }
-      else 
-      {
-        USB_Tx_ptr = APP_Rx_ptr_out;
-        USB_Tx_length = APP_Rx_length;
-        
-        APP_Rx_ptr_out += APP_Rx_length;
-        APP_Rx_length = 0;
-      }
-      
-      /* Prepare the available data buffer to be sent on IN endpoint */
-      DCD_EP_Tx (pdev,
-                 CDC_IN_EP,
-                 (uint8_t*)&APP_Rx_Buffer[USB_Tx_ptr],
-                 USB_Tx_length);
-    }
-  }  
-  
-  return USBD_OK;
-}
-
-/**
-  * @brief  usbd_cdc_DataOut
-  *         Data received on non-control Out endpoint
-  * @param  pdev: device instance
-  * @param  epnum: endpoint number
-  * @retval status
-  */
-static uint8_t  usbd_cdc_DataOut (void *pdev, uint8_t epnum)
-{      
-  uint16_t USB_Rx_Cnt;
-  
-  /* Get the received data buffer and update the counter */
-  USB_Rx_Cnt = ((USB_OTG_CORE_HANDLE*)pdev)->dev.out_ep[epnum].xfer_count;
-  
-  /* USB data will be immediately processed, this allow next USB traffic being 
-     NAKed till the end of the application Xfer */
-  APP_FOPS.pIf_DataRx(USB_Rx_Buffer, USB_Rx_Cnt);
-  
-  /* Prepare Out endpoint to receive next packet */
-  DCD_EP_PrepareRx(pdev,
-                   CDC_OUT_EP,
-                   (uint8_t*)(USB_Rx_Buffer),
-                   CDC_DATA_OUT_PACKET_SIZE);
-
-  return USBD_OK;
-}
-
-/**
-  * @brief  usbd_audio_SOF
-  *         Start Of Frame event management
-  * @param  pdev: instance
-  * @param  epnum: endpoint number
-  * @retval status
-  */
-static uint8_t  usbd_cdc_SOF (void *pdev)
-{      
-  static uint32_t FrameCount = 0;
-  
-  if (FrameCount++ == CDC_IN_FRAME_INTERVAL)
-  {
-    /* Reset the frame counter */
-    FrameCount = 0;
-    
-    /* Check the data to be sent through IN pipe */
-    Handle_USBAsynchXfer(pdev);
-  }
-  
-  return USBD_OK;
-}
-
-/**
-  * @brief  Handle_USBAsynchXfer
-  *         Send data to USB
-  * @param  pdev: instance
-  * @retval None
-  */
-static void Handle_USBAsynchXfer (void *pdev)
-{
-  uint16_t USB_Tx_ptr;
-  uint16_t USB_Tx_length;
-  
-  if(USB_Tx_State != 1)
-  {
-    if (APP_Rx_ptr_out == APP_RX_DATA_SIZE)
-    {
-      APP_Rx_ptr_out = 0;
-    }
-    
-    if(APP_Rx_ptr_out == APP_Rx_ptr_in) 
-    {
-      USB_Tx_State = 0; 
-      return;
-    }
-    
-    if(APP_Rx_ptr_out > APP_Rx_ptr_in) /* rollback */
-    { 
-      APP_Rx_length = APP_RX_DATA_SIZE - APP_Rx_ptr_out;
-    
-    }
-    else 
-    {
-      APP_Rx_length = APP_Rx_ptr_in - APP_Rx_ptr_out;
-     
-    }
-#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
-     APP_Rx_length &= ~0x03;
-#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */
-    
-    if (APP_Rx_length > CDC_DATA_IN_PACKET_SIZE)
-    {
-      USB_Tx_ptr = APP_Rx_ptr_out;
-      USB_Tx_length = CDC_DATA_IN_PACKET_SIZE;
-      
-      APP_Rx_ptr_out += CDC_DATA_IN_PACKET_SIZE;	
-      APP_Rx_length -= CDC_DATA_IN_PACKET_SIZE;
-    }
-    else
-    {
-      USB_Tx_ptr = APP_Rx_ptr_out;
-      USB_Tx_length = APP_Rx_length;
-      
-      APP_Rx_ptr_out += APP_Rx_length;
-      APP_Rx_length = 0;
-    }
-    USB_Tx_State = 1; 
-
-    DCD_EP_Tx (pdev,
-               CDC_IN_EP,
-               (uint8_t*)&APP_Rx_Buffer[USB_Tx_ptr],
-               USB_Tx_length);
-  }  
-  
-}
-
-/**
-  * @brief  USBD_cdc_GetCfgDesc 
-  *         Return configuration descriptor
-  * @param  speed : current device speed
-  * @param  length : pointer data length
-  * @retval pointer to descriptor buffer
-  */
-static uint8_t  *USBD_cdc_GetCfgDesc (uint8_t speed, uint16_t *length)
-{
-  *length = sizeof (usbd_cdc_CfgDesc);
-  return usbd_cdc_CfgDesc;
-}
-
-/**
-  * @brief  USBD_cdc_GetCfgDesc 
-  *         Return configuration descriptor
-  * @param  speed : current device speed
-  * @param  length : pointer data length
-  * @retval pointer to descriptor buffer
-  */
-#ifdef USE_USB_OTG_HS 
-static uint8_t  *USBD_cdc_GetOtherCfgDesc (uint8_t speed, uint16_t *length)
-{
-  *length = sizeof (usbd_cdc_OtherCfgDesc);
-  return usbd_cdc_OtherCfgDesc;
-}
-#endif
-/**
-  * @}
-  */ 
-
-/**
-  * @}
-  */ 
-
-/**
-  * @}
-  */ 
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/stm/lib/usbd_cdc_core.h b/stm/lib/usbd_cdc_core.h
index 4fd1d6aaaa01966f6c0e2e114f543b89ae5a1b19..3187deb3dc5049fc2478c007b3c45554a4e37fed 100644
--- a/stm/lib/usbd_cdc_core.h
+++ b/stm/lib/usbd_cdc_core.h
@@ -45,8 +45,8 @@
 /** @defgroup usbd_cdc_Exported_Defines
   * @{
   */ 
-#define USB_CDC_CONFIG_DESC_SIZ                (67)
-#define USB_CDC_DESC_SIZ                       (67-9)
+#define USB_CDC_CONFIG_DESC_SIZ                (98)
+#define USB_CDC_DESC_SIZ                       (98-9)
 
 #define CDC_DESCRIPTOR_TYPE                     0x21
 
diff --git a/stm/lib/usbd_cdc_vcp.c b/stm/lib/usbd_cdc_vcp.c
index b8e2af2b559b841507ffccd97f9c66011d2e3502..9cf8fb2589c0b76808f4744b52a6fbd7c7fe07c1 100644
--- a/stm/lib/usbd_cdc_vcp.c
+++ b/stm/lib/usbd_cdc_vcp.c
@@ -30,8 +30,8 @@
 #endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */
 
 /* Includes ------------------------------------------------------------------*/
+#include "usbd_conf.h"
 #include "usbd_cdc_vcp.h"
-#include "usbd_cdc_conf.h"
 #include "std.h"
 
 /* Private typedef -----------------------------------------------------------*/
diff --git a/stm/lib/usbd_conf.h b/stm/lib/usbd_conf.h
index de5d25038de0b245aed22d1595969fc89786770e..4bab9e3c26494d0111bdb74272c4e8d49627f315 100644
--- a/stm/lib/usbd_conf.h
+++ b/stm/lib/usbd_conf.h
@@ -1,7 +1,26 @@
 #ifndef __USBD_CONF__H__
 #define __USBD_CONF__H__
 
-#define USBD_CFG_MAX_NUM                1 // TODO need more than 1?
-#define USBD_ITF_MAX_NUM                1 // TODO need more than 1?
+#define USBD_CFG_MAX_NUM            1
+#define USBD_ITF_MAX_NUM            1 // TODO need more than 1?
+
+// CDC Endpoints parameters
+#define CDC_IN_EP                   0x81  /* EP1 for data IN */
+#define CDC_OUT_EP                  0x01  /* EP1 for data OUT */
+#define CDC_CMD_EP                  0x82  /* EP2 for CDC commands */
+#define CDC_DATA_MAX_PACKET_SIZE    64   /* Endpoint IN & OUT Packet size */
+#define CDC_CMD_PACKET_SZE          8    /* Control Endpoint Packet size */
+#define CDC_IN_FRAME_INTERVAL       5    /* Number of frames between IN transfers */
+#define APP_RX_DATA_SIZE            2048 /* Total size of IN buffer: 
+                                                APP_RX_DATA_SIZE*8/MAX_BAUDARATE*1000 should be > CDC_IN_FRAME_INTERVAL */
+
+// MSC parameters
+#define MSC_IN_EP                   0x83
+#define MSC_OUT_EP                  0x03
+#define MSC_MAX_PACKET              64
+#define MSC_MEDIA_PACKET            4096
+
+// for both?
+#define APP_FOPS                        VCP_fops
 
 #endif //__USBD_CONF__H__
diff --git a/stm/lib/usbd_desc.c b/stm/lib/usbd_desc.c
index da68679d188267110cdfd7ba9f530a140ec2dba5..d4ada2de260c2ab49df059134ca23b55a5483303 100644
--- a/stm/lib/usbd_desc.c
+++ b/stm/lib/usbd_desc.c
@@ -104,26 +104,26 @@ USBD_DEVICE USR_desc =
   #endif
 #endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */
 /* USB Standard Device Descriptor */
-__ALIGN_BEGIN uint8_t USBD_DeviceDesc[USB_SIZ_DEVICE_DESC] __ALIGN_END =
-  {
-    0x12,                       /*bLength */
-    USB_DEVICE_DESCRIPTOR_TYPE, /*bDescriptorType*/
-    0x00,                       /*bcdUSB */
+__ALIGN_BEGIN static uint8_t USBD_DeviceDesc[USB_SIZ_DEVICE_DESC] __ALIGN_END =
+{
+    0x12,                       // bLength
+    USB_DEVICE_DESCRIPTOR_TYPE, // bDescriptorType
+    0x00,                       // bcdUSB: v2.0
     0x02,
-    0x00,                       /*bDeviceClass*/
-    0x00,                       /*bDeviceSubClass*/
-    0x00,                       /*bDeviceProtocol*/
-    USB_OTG_MAX_EP0_SIZE,      /*bMaxPacketSize*/
-    LOBYTE(USBD_VID),           /*idVendor*/
-    HIBYTE(USBD_VID),           /*idVendor*/
-    LOBYTE(USBD_PID),           /*idVendor*/
-    HIBYTE(USBD_PID),           /*idVendor*/
-    0x00,                       /*bcdDevice rel. 2.00*/
+    0xef,                       // bDeviceClass: Miscellaneous Device Class
+    0x02,                       // bDeviceSubClass: Common Class
+    0x01,                       // bDeviceProtocol: Interface Association Descriptor
+    USB_OTG_MAX_EP0_SIZE,       // bMaxPacketSize
+    LOBYTE(USBD_VID),           // idVendor
+    HIBYTE(USBD_VID),           // idVendor
+    LOBYTE(USBD_PID),           // idVendor
+    HIBYTE(USBD_PID),           // idVendor
+    0x00,                       // bcdDevice: rel. 2.00
     0x02,
     USBD_IDX_MFC_STR,           /*Index of manufacturer  string*/
     USBD_IDX_PRODUCT_STR,       /*Index of product string*/
     USBD_IDX_SERIAL_STR,        /*Index of serial number string*/
-    USBD_CFG_MAX_NUM            /*bNumConfigurations*/
+    USBD_CFG_MAX_NUM            // bNumConfigurations: 1
   } ; /* USB_DeviceDescriptor */
 
 #ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
diff --git a/stm/lib/usbd_desc.h b/stm/lib/usbd_desc.h
index e28e14ae08061ad62db603fd2b3cc6a46ecbb763..c6da3158bed64f24e36f394aaec223a44f255cf6 100644
--- a/stm/lib/usbd_desc.h
+++ b/stm/lib/usbd_desc.h
@@ -50,6 +50,7 @@
 #define USB_STRING_DESCRIPTOR_TYPE              0x03
 #define USB_INTERFACE_DESCRIPTOR_TYPE           0x04
 #define USB_ENDPOINT_DESCRIPTOR_TYPE            0x05
+#define USB_INTERFACE_ASSOCIATION_TYPE          0x0b
 #define USB_SIZ_DEVICE_DESC                     18
 #define USB_SIZ_STRING_LANGID                   4
 
@@ -77,7 +78,7 @@
 /** @defgroup USBD_DESC_Exported_Variables
   * @{
   */ 
-extern  uint8_t USBD_DeviceDesc  [USB_SIZ_DEVICE_DESC];
+//extern  uint8_t USBD_DeviceDesc  [USB_SIZ_DEVICE_DESC];
 extern  uint8_t USBD_StrDesc[USB_MAX_STR_DESC_SIZ];
 extern  uint8_t USBD_OtherSpeedCfgDesc[USB_LEN_CFG_DESC]; 
 extern  uint8_t USBD_DeviceQualifierDesc[USB_LEN_DEV_QUALIFIER_DESC];
diff --git a/stm/lib/usbd_msc_bot.c b/stm/lib/usbd_msc_bot.c
index 7b8b4c580f85e13d324cfdda6e267642df7048ea..20dbc4863f5b94e56ee0ad5b4167c923f8682fc1 100644
--- a/stm/lib/usbd_msc_bot.c
+++ b/stm/lib/usbd_msc_bot.c
@@ -30,7 +30,7 @@
 #include "usbd_msc_scsi.h"
 #include "usbd_ioreq.h"
 #include "usbd_msc_mem.h"
-#include "usbd_msc_conf.h"
+#include "usbd_conf.h"
 
 /** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY
   * @{
diff --git a/stm/lib/usbd_msc_conf.h b/stm/lib/usbd_msc_conf.h
deleted file mode 100644
index 2902f092f3139f117f64ffa857c0910157f17fc6..0000000000000000000000000000000000000000
--- a/stm/lib/usbd_msc_conf.h
+++ /dev/null
@@ -1,99 +0,0 @@
-/**
-  ******************************************************************************
-  * @file    usbd_conf.h
-  * @author  MCD Application Team
-  * @version V1.1.0
-  * @date    19-March-2012
-  * @brief   USB Device configuration file
-  ******************************************************************************
-  * @attention
-  *
-  * <h2><center>&copy; COPYRIGHT 2012 STMicroelectronics</center></h2>
-  *
-  * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
-  * You may not use this file except in compliance with the License.
-  * You may obtain a copy of the License at:
-  *
-  *        http://www.st.com/software_license_agreement_liberty_v2
-  *
-  * Unless required by applicable law or agreed to in writing, software 
-  * distributed under the License is distributed on an "AS IS" BASIS, 
-  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  * See the License for the specific language governing permissions and
-  * limitations under the License.
-  *
-  ******************************************************************************
-  */
-
-/* Define to prevent recursive inclusion -------------------------------------*/
-#ifndef __USBD_CONF__H__
-#define __USBD_CONF__H__
-
-/* Includes ------------------------------------------------------------------*/
-#include "usb_conf.h"
-
-/** @defgroup USB_CONF_Exported_Defines
-  * @{
-  */ 
-//#define USBD_CFG_MAX_NUM                1
-//#define USBD_ITF_MAX_NUM                1
-
-//#define USBD_SELF_POWERED               
-
-//#define USB_MAX_STR_DESC_SIZ           64 
-
-/* Class Layer Parameter */
-
-#define MSC_IN_EP                    0x81
-#define MSC_OUT_EP                   0x01
-#ifdef USE_USB_OTG_HS  
-#ifdef USE_ULPI_PHY
-#define MSC_MAX_PACKET               512
-#else
-#define MSC_MAX_PACKET               64
-#endif
-#else  /*USE_USB_OTG_FS*/
-#define MSC_MAX_PACKET                64
-#endif
-
-
-#define MSC_MEDIA_PACKET             4096
-
-/**
-  * @}
-  */ 
-
-
-/** @defgroup USB_CONF_Exported_TypesDefinitions
-  * @{
-  */ 
-/**
-  * @}
-  */ 
-
-
-/** @defgroup USB_CONF_Exported_Macros
-  * @{
-  */ 
-/**
-  * @}
-  */ 
-
-/** @defgroup USB_CONF_Exported_Variables
-  * @{
-  */ 
-/**
-  * @}
-  */ 
-
-/** @defgroup USB_CONF_Exported_FunctionsPrototype
-  * @{
-  */ 
-/**
-  * @}
-  */ 
-
-#endif //__USBD_CONF__H__
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
-
diff --git a/stm/lib/usbd_msc_core.c b/stm/lib/usbd_msc_core.c
deleted file mode 100644
index da86d27218b2f8e46c7fc7a2641ba224a63fc51f..0000000000000000000000000000000000000000
--- a/stm/lib/usbd_msc_core.c
+++ /dev/null
@@ -1,497 +0,0 @@
-/**
-  ******************************************************************************
-  * @file    usbd_msc_core.c
-  * @author  MCD Application Team
-  * @version V1.1.0
-  * @date    19-March-2012
-  * @brief   This file provides all the MSC core functions.
-  *
-  * @verbatim
-  *      
-  *          ===================================================================      
-  *                                MSC Class  Description
-  *          =================================================================== 
-  *           This module manages the MSC class V1.0 following the "Universal 
-  *           Serial Bus Mass Storage Class (MSC) Bulk-Only Transport (BOT) Version 1.0
-  *           Sep. 31, 1999".
-  *           This driver implements the following aspects of the specification:
-  *             - Bulk-Only Transport protocol
-  *             - Subclass : SCSI transparent command set (ref. SCSI Primary Commands - 3 (SPC-3))
-  *      
-  *  @endverbatim
-  *
-  ******************************************************************************
-  * @attention
-  *
-  * <h2><center>&copy; COPYRIGHT 2012 STMicroelectronics</center></h2>
-  *
-  * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
-  * You may not use this file except in compliance with the License.
-  * You may obtain a copy of the License at:
-  *
-  *        http://www.st.com/software_license_agreement_liberty_v2
-  *
-  * Unless required by applicable law or agreed to in writing, software 
-  * distributed under the License is distributed on an "AS IS" BASIS, 
-  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  * See the License for the specific language governing permissions and
-  * limitations under the License.
-  *
-  ******************************************************************************
-  */ 
-
-/* Includes ------------------------------------------------------------------*/
-#include "usbd_msc_mem.h"
-#include "usbd_msc_core.h"
-#include "usbd_msc_bot.h"
-#include "usbd_msc_conf.h"
-#include "usbd_req.h"
-
-
-/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY
-  * @{
-  */
-
-
-/** @defgroup MSC_CORE 
-  * @brief Mass storage core module
-  * @{
-  */ 
-
-/** @defgroup MSC_CORE_Private_TypesDefinitions
-  * @{
-  */ 
-/**
-  * @}
-  */ 
-
-
-/** @defgroup MSC_CORE_Private_Defines
-  * @{
-  */ 
-
-/**
-  * @}
-  */ 
-
-
-/** @defgroup MSC_CORE_Private_Macros
-  * @{
-  */ 
-/**
-  * @}
-  */ 
-
-
-/** @defgroup MSC_CORE_Private_FunctionPrototypes
-  * @{
-  */ 
-uint8_t  USBD_MSC_Init (void  *pdev, 
-                            uint8_t cfgidx);
-
-uint8_t  USBD_MSC_DeInit (void  *pdev, 
-                              uint8_t cfgidx);
-
-uint8_t  USBD_MSC_Setup (void  *pdev, 
-                             USB_SETUP_REQ *req);
-
-uint8_t  USBD_MSC_DataIn (void  *pdev, 
-                              uint8_t epnum);
-
-
-uint8_t  USBD_MSC_DataOut (void  *pdev, 
-                               uint8_t epnum);
-
-uint8_t  *USBD_MSC_GetCfgDesc (uint8_t speed, 
-                                      uint16_t *length);
-
-#ifdef USB_OTG_HS_CORE  
-uint8_t  *USBD_MSC_GetOtherCfgDesc (uint8_t speed, 
-                                      uint16_t *length);
-#endif
-
-
-uint8_t USBD_MSC_CfgDesc[USB_MSC_CONFIG_DESC_SIZ];
-
-
-
-
-/**
-  * @}
-  */ 
-
-
-/** @defgroup MSC_CORE_Private_Variables
-  * @{
-  */ 
-
-
-USBD_Class_cb_TypeDef  USBD_MSC_cb = 
-{
-  USBD_MSC_Init,
-  USBD_MSC_DeInit,
-  USBD_MSC_Setup,
-  NULL, /*EP0_TxSent*/  
-  NULL, /*EP0_RxReady*/
-  USBD_MSC_DataIn,
-  USBD_MSC_DataOut,
-  NULL, /*SOF */ 
-  NULL,  
-  NULL,     
-  USBD_MSC_GetCfgDesc,
-#ifdef USB_OTG_HS_CORE  
-  USBD_MSC_GetOtherCfgDesc,
-#endif
-};
-
-#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
-  #if defined ( __ICCARM__ ) /*!< IAR Compiler */
-    #pragma data_alignment=4   
-  #endif
-#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */
-/* USB Mass storage device Configuration Descriptor */
-/*   All Descriptors (Configuration, Interface, Endpoint, Class, Vendor */
-__ALIGN_BEGIN uint8_t USBD_MSC_CfgDesc[USB_MSC_CONFIG_DESC_SIZ] __ALIGN_END =
-{
-  
-  0x09,   /* bLength: Configuation Descriptor size */
-  USB_DESC_TYPE_CONFIGURATION,   /* bDescriptorType: Configuration */
-  USB_MSC_CONFIG_DESC_SIZ,
-  
-  0x00,
-  0x01,   /* bNumInterfaces: 1 interface */
-  0x01,   /* bConfigurationValue: */
-  0x04,   /* iConfiguration: */
-  0xC0,   /* bmAttributes: */
-  0x32,   /* MaxPower 100 mA */
-  
-  /********************  Mass Storage interface ********************/
-  0x09,   /* bLength: Interface Descriptor size */
-  0x04,   /* bDescriptorType: */
-  0x00,   /* bInterfaceNumber: Number of Interface */
-  0x00,   /* bAlternateSetting: Alternate setting */
-  0x02,   /* bNumEndpoints*/
-  0x08,   /* bInterfaceClass: MSC Class */
-  0x06,   /* bInterfaceSubClass : SCSI transparent*/
-  0x50,   /* nInterfaceProtocol */
-  0x05,          /* iInterface: */
-  /********************  Mass Storage Endpoints ********************/
-  0x07,   /*Endpoint descriptor length = 7*/
-  0x05,   /*Endpoint descriptor type */
-  MSC_IN_EP,   /*Endpoint address (IN, address 1) */
-  0x02,   /*Bulk endpoint type */
-  LOBYTE(MSC_MAX_PACKET),
-  HIBYTE(MSC_MAX_PACKET),
-  0x00,   /*Polling interval in milliseconds */
-  
-  0x07,   /*Endpoint descriptor length = 7 */
-  0x05,   /*Endpoint descriptor type */
-  MSC_OUT_EP,   /*Endpoint address (OUT, address 1) */
-  0x02,   /*Bulk endpoint type */
-  LOBYTE(MSC_MAX_PACKET),
-  HIBYTE(MSC_MAX_PACKET),
-  0x00     /*Polling interval in milliseconds*/
-};
-#ifdef USB_OTG_HS_CORE 
- #ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
-   #if defined ( __ICCARM__ ) /*!< IAR Compiler */
-     #pragma data_alignment=4   
-   #endif
- #endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */
-__ALIGN_BEGIN uint8_t USBD_MSC_OtherCfgDesc[USB_MSC_CONFIG_DESC_SIZ] __ALIGN_END =
-{
-  
-  0x09,   /* bLength: Configuation Descriptor size */
-  USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION,   
-  USB_MSC_CONFIG_DESC_SIZ,
-  
-  0x00,
-  0x01,   /* bNumInterfaces: 1 interface */
-  0x01,   /* bConfigurationValue: */
-  0x04,   /* iConfiguration: */
-  0xC0,   /* bmAttributes: */
-  0x32,   /* MaxPower 100 mA */
-  
-  /********************  Mass Storage interface ********************/
-  0x09,   /* bLength: Interface Descriptor size */
-  0x04,   /* bDescriptorType: */
-  0x00,   /* bInterfaceNumber: Number of Interface */
-  0x00,   /* bAlternateSetting: Alternate setting */
-  0x02,   /* bNumEndpoints*/
-  0x08,   /* bInterfaceClass: MSC Class */
-  0x06,   /* bInterfaceSubClass : SCSI transparent command set*/
-  0x50,   /* nInterfaceProtocol */
-  0x05,          /* iInterface: */
-  /********************  Mass Storage Endpoints ********************/
-  0x07,   /*Endpoint descriptor length = 7*/
-  0x05,   /*Endpoint descriptor type */
-  MSC_IN_EP,   /*Endpoint address (IN, address 1) */
-  0x02,   /*Bulk endpoint type */
-  0x40,
-  0x00,
-  0x00,   /*Polling interval in milliseconds */
-  
-  0x07,   /*Endpoint descriptor length = 7 */
-  0x05,   /*Endpoint descriptor type */
-  MSC_OUT_EP,   /*Endpoint address (OUT, address 1) */
-  0x02,   /*Bulk endpoint type */
-  0x40,
-  0x00,
-  0x00     /*Polling interval in milliseconds*/
-};
-#endif 
-
-#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
-  #if defined ( __ICCARM__ ) /*!< IAR Compiler */
-    #pragma data_alignment=4   
-  #endif
-#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */
-__ALIGN_BEGIN static uint8_t  USBD_MSC_MaxLun  __ALIGN_END = 0;
-
-#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
-  #if defined ( __ICCARM__ ) /*!< IAR Compiler */
-    #pragma data_alignment=4   
-  #endif
-#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */
-__ALIGN_BEGIN static uint8_t  USBD_MSC_AltSet  __ALIGN_END = 0;
-
-/**
-  * @}
-  */ 
-
-
-/** @defgroup MSC_CORE_Private_Functions
-  * @{
-  */ 
-
-/**
-* @brief  USBD_MSC_Init
-*         Initialize  the mass storage configuration
-* @param  pdev: device instance
-* @param  cfgidx: configuration index
-* @retval status
-*/
-uint8_t  USBD_MSC_Init (void  *pdev, 
-                            uint8_t cfgidx)
-{
-  USBD_MSC_DeInit(pdev , cfgidx );
-  
-  /* Open EP IN */
-  DCD_EP_Open(pdev,
-              MSC_IN_EP,
-              MSC_EPIN_SIZE,
-              USB_OTG_EP_BULK);
-  
-  /* Open EP OUT */
-  DCD_EP_Open(pdev,
-              MSC_OUT_EP,
-              MSC_EPOUT_SIZE,
-              USB_OTG_EP_BULK);
- 
-  /* Init the BOT  layer */
-  MSC_BOT_Init(pdev); 
-  
-  return USBD_OK;
-}
-
-/**
-* @brief  USBD_MSC_DeInit
-*         DeInitilaize  the mass storage configuration
-* @param  pdev: device instance
-* @param  cfgidx: configuration index
-* @retval status
-*/
-uint8_t  USBD_MSC_DeInit (void  *pdev, 
-                              uint8_t cfgidx)
-{
-  /* Close MSC EPs */
-  DCD_EP_Close (pdev , MSC_IN_EP);
-  DCD_EP_Close (pdev , MSC_OUT_EP);
-  
-  /* Un Init the BOT layer */
-  MSC_BOT_DeInit(pdev);   
-  return USBD_OK;
-}
-/**
-* @brief  USBD_MSC_Setup
-*         Handle the MSC specific requests
-* @param  pdev: device instance
-* @param  req: USB request
-* @retval status
-*/
-uint8_t  USBD_MSC_Setup (void  *pdev, USB_SETUP_REQ *req)
-{
-  
-  switch (req->bmRequest & USB_REQ_TYPE_MASK)
-  {
-
-  /* Class request */
-  case USB_REQ_TYPE_CLASS :
-    switch (req->bRequest)
-    {
-    case BOT_GET_MAX_LUN :
-
-      if((req->wValue  == 0) && 
-         (req->wLength == 1) &&
-         ((req->bmRequest & 0x80) == 0x80))
-      {
-        USBD_MSC_MaxLun = USBD_STORAGE_fops->GetMaxLun();
-        if(USBD_MSC_MaxLun > 0)
-        {
-           USBD_CtlSendData (pdev,
-                             &USBD_MSC_MaxLun,
-                              1);
-        }
-        else
-        {
-          USBD_CtlError(pdev , req);
-          return USBD_FAIL; 
-          
-        }
-      }
-      else
-      {
-         USBD_CtlError(pdev , req);
-         return USBD_FAIL; 
-      }
-      break;
-      
-    case BOT_RESET :
-      if((req->wValue  == 0) && 
-         (req->wLength == 0) &&
-        ((req->bmRequest & 0x80) != 0x80))
-      {      
-         MSC_BOT_Reset(pdev);
-      }
-      else
-      {
-         USBD_CtlError(pdev , req);
-         return USBD_FAIL; 
-      }
-      break;
-
-    default:
-       USBD_CtlError(pdev , req);
-       return USBD_FAIL; 
-    }
-    break;
-  /* Interface & Endpoint request */
-  case USB_REQ_TYPE_STANDARD:
-    switch (req->bRequest)
-    {
-    case USB_REQ_GET_INTERFACE :
-      USBD_CtlSendData (pdev,
-                        &USBD_MSC_AltSet,
-                        1);
-      break;
-      
-    case USB_REQ_SET_INTERFACE :
-      USBD_MSC_AltSet = (uint8_t)(req->wValue);
-      break;
-    
-    case USB_REQ_CLEAR_FEATURE:  
-      
-      /* Flush the FIFO and Clear the stall status */    
-      DCD_EP_Flush(pdev, (uint8_t)req->wIndex);
-      
-      /* Re-activate the EP */      
-      DCD_EP_Close (pdev , (uint8_t)req->wIndex);
-      if((((uint8_t)req->wIndex) & 0x80) == 0x80)
-      {
-        DCD_EP_Open(pdev,
-                    ((uint8_t)req->wIndex),
-                    MSC_EPIN_SIZE,
-                    USB_OTG_EP_BULK);
-      }
-      else
-      {
-        DCD_EP_Open(pdev,
-                    ((uint8_t)req->wIndex),
-                    MSC_EPOUT_SIZE,
-                    USB_OTG_EP_BULK);
-      }
-      
-      /* Handle BOT error */
-      MSC_BOT_CplClrFeature(pdev, (uint8_t)req->wIndex);
-      break;
-      
-    }  
-    break;
-   
-  default:
-    break;
-  }
-  return USBD_OK;
-}
-
-/**
-* @brief  USBD_MSC_DataIn
-*         handle data IN Stage
-* @param  pdev: device instance
-* @param  epnum: endpoint index
-* @retval status
-*/
-uint8_t  USBD_MSC_DataIn (void  *pdev, 
-                              uint8_t epnum)
-{
-  MSC_BOT_DataIn(pdev , epnum);
-  return USBD_OK;
-}
-
-/**
-* @brief  USBD_MSC_DataOut
-*         handle data OUT Stage
-* @param  pdev: device instance
-* @param  epnum: endpoint index
-* @retval status
-*/
-uint8_t  USBD_MSC_DataOut (void  *pdev, 
-                               uint8_t epnum)
-{
-  MSC_BOT_DataOut(pdev , epnum);
-  return USBD_OK;
-}
-
-/**
-* @brief  USBD_MSC_GetCfgDesc 
-*         return configuration descriptor
-* @param  speed : current device speed
-* @param  length : pointer data length
-* @retval pointer to descriptor buffer
-*/
-uint8_t  *USBD_MSC_GetCfgDesc (uint8_t speed, uint16_t *length)
-{
-  *length = sizeof (USBD_MSC_CfgDesc);
-  return USBD_MSC_CfgDesc;
-}
-
-/**
-* @brief  USBD_MSC_GetOtherCfgDesc 
-*         return other speed configuration descriptor
-* @param  speed : current device speed
-* @param  length : pointer data length
-* @retval pointer to descriptor buffer
-*/
-#ifdef USB_OTG_HS_CORE  
-uint8_t  *USBD_MSC_GetOtherCfgDesc (uint8_t speed, 
-                                      uint16_t *length)
-{
-  *length = sizeof (USBD_MSC_OtherCfgDesc);
-  return USBD_MSC_OtherCfgDesc;
-}
-#endif
-/**
-  * @}
-  */ 
-
-
-/**
-  * @}
-  */ 
-
-
-/**
-  * @}
-  */ 
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/stm/lib/usbd_msc_core.h b/stm/lib/usbd_msc_core.h
deleted file mode 100644
index 1697e492c436b6fdcaa1d6bc7646d1ea187d42ba..0000000000000000000000000000000000000000
--- a/stm/lib/usbd_msc_core.h
+++ /dev/null
@@ -1,77 +0,0 @@
-/**
-  ******************************************************************************
-  * @file    usbd_msc_core.h
-  * @author  MCD Application Team
-  * @version V1.1.0
-  * @date    19-March-2012
-  * @brief   header for the usbd_msc_core.c file
-  ******************************************************************************
-  * @attention
-  *
-  * <h2><center>&copy; COPYRIGHT 2012 STMicroelectronics</center></h2>
-  *
-  * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
-  * You may not use this file except in compliance with the License.
-  * You may obtain a copy of the License at:
-  *
-  *        http://www.st.com/software_license_agreement_liberty_v2
-  *
-  * Unless required by applicable law or agreed to in writing, software 
-  * distributed under the License is distributed on an "AS IS" BASIS, 
-  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  * See the License for the specific language governing permissions and
-  * limitations under the License.
-  *
-  ******************************************************************************
-  */ 
-
-/* Define to prevent recursive inclusion -------------------------------------*/
-#ifndef _USB_MSC_CORE_H_
-#define _USB_MSC_CORE_H_
-
-#include  "usbd_ioreq.h"
-
-/** @addtogroup USBD_MSC_BOT
-  * @{
-  */
-  
-/** @defgroup USBD_MSC
-  * @brief This file is the Header file for USBD_msc.c
-  * @{
-  */ 
-
-
-/** @defgroup USBD_BOT_Exported_Defines
-  * @{
-  */ 
-
-
-#define BOT_GET_MAX_LUN              0xFE
-#define BOT_RESET                    0xFF
-#define USB_MSC_CONFIG_DESC_SIZ      32
-
-#define MSC_EPIN_SIZE                MSC_MAX_PACKET 
-#define MSC_EPOUT_SIZE               MSC_MAX_PACKET 
-
-/**
-  * @}
-  */ 
-
-/** @defgroup USB_CORE_Exported_Types
-  * @{
-  */ 
-
-extern USBD_Class_cb_TypeDef  USBD_MSC_cb;
-/**
-  * @}
-  */ 
-
-/**
-  * @}
-  */ 
-#endif  // _USB_MSC_CORE_H_
-/**
-  * @}
-  */ 
-  
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/stm/lib/usbd_msc_scsi.c b/stm/lib/usbd_msc_scsi.c
index c385d3ef60dcce47280c0bc5006b24d1ba113547..e1e557f542295f3eed876012a65c155c77ba037e 100644
--- a/stm/lib/usbd_msc_scsi.c
+++ b/stm/lib/usbd_msc_scsi.c
@@ -30,7 +30,7 @@
 #include "usbd_msc_scsi.h"
 #include "usbd_msc_mem.h"
 #include "usbd_msc_data.h"
-#include "usbd_msc_conf.h"
+#include "usbd_conf.h"
 
 
 
diff --git a/stm/lib/usbd_pyb_core.c b/stm/lib/usbd_pyb_core.c
new file mode 100644
index 0000000000000000000000000000000000000000..e2e8c65ca07da16382742804f8e7dc781e826992
--- /dev/null
+++ b/stm/lib/usbd_pyb_core.c
@@ -0,0 +1,726 @@
+/**
+  ******************************************************************************
+  * @file    usbd_cdc_core.c
+  * @author  MCD Application Team
+  * @version V1.1.0
+  * @date    19-March-2012
+  * @brief   This file provides the high layer firmware functions to manage the 
+  *          following functionalities of the USB CDC Class:
+  *           - Initialization and Configuration of high and low layer
+  *           - Enumeration as CDC Device (and enumeration for each implemented memory interface)
+  *           - OUT/IN data transfer
+  *           - Command IN transfer (class requests management)
+  *           - Error management
+  *           
+  *  @verbatim
+  *      
+  *          ===================================================================      
+  *                                CDC Class Driver Description
+  *          =================================================================== 
+  *           This driver manages the "Universal Serial Bus Class Definitions for Communications Devices
+  *           Revision 1.2 November 16, 2007" and the sub-protocol specification of "Universal Serial Bus 
+  *           Communications Class Subclass Specification for PSTN Devices Revision 1.2 February 9, 2007"
+  *           This driver implements the following aspects of the specification:
+  *             - Device descriptor management
+  *             - Configuration descriptor management
+  *             - Enumeration as CDC device with 2 data endpoints (IN and OUT) and 1 command endpoint (IN)
+  *             - Requests management (as described in section 6.2 in specification)
+  *             - Abstract Control Model compliant
+  *             - Union Functional collection (using 1 IN endpoint for control)
+  *             - Data interface class
+
+  *           @note
+  *             For the Abstract Control Model, this core allows only transmitting the requests to
+  *             lower layer dispatcher (ie. usbd_cdc_vcp.c/.h) which should manage each request and
+  *             perform relative actions.
+  * 
+  *           These aspects may be enriched or modified for a specific user application.
+  *          
+  *            This driver doesn't implement the following aspects of the specification 
+  *            (but it is possible to manage these features with some modifications on this driver):
+  *             - Any class-specific aspect relative to communication classes should be managed by user application.
+  *             - All communication classes other than PSTN are not managed
+  *      
+  *  @endverbatim
+  *                                  
+  ******************************************************************************
+  * @attention
+  *
+  * <h2><center>&copy; COPYRIGHT 2012 STMicroelectronics</center></h2>
+  *
+  * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
+  * You may not use this file except in compliance with the License.
+  * You may obtain a copy of the License at:
+  *
+  *        http://www.st.com/software_license_agreement_liberty_v2
+  *
+  * Unless required by applicable law or agreed to in writing, software 
+  * distributed under the License is distributed on an "AS IS" BASIS, 
+  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  * See the License for the specific language governing permissions and
+  * limitations under the License.
+  *
+  ******************************************************************************
+  */ 
+
+/* Includes ------------------------------------------------------------------*/
+#include "usbd_cdc_core.h"
+#include "usbd_desc.h"
+#include "usbd_req.h"
+#include "usbd_conf.h"
+#include "usbd_msc_bot.h"
+#include "usbd_msc_mem.h"
+
+#define USB_PYB_CONFIG_DESC_SIZ 98
+
+#define MSC_EPIN_SIZE                MSC_MAX_PACKET
+#define MSC_EPOUT_SIZE               MSC_MAX_PACKET
+
+/*********************************************
+   PYB Device library callbacks
+ *********************************************/
+static uint8_t usbd_pyb_Init        (void *pdev, uint8_t cfgidx);
+static uint8_t usbd_pyb_DeInit      (void *pdev, uint8_t cfgidx);
+static uint8_t usbd_pyb_Setup       (void *pdev, USB_SETUP_REQ *req);
+static uint8_t usbd_pyb_EP0_RxReady (void *pdev);
+static uint8_t usbd_pyb_DataIn      (void *pdev, uint8_t epnum);
+static uint8_t usbd_pyb_DataOut     (void *pdev, uint8_t epnum);
+static uint8_t usbd_pyb_SOF         (void *pdev);
+
+/*********************************************
+   PYB specific management functions
+ *********************************************/
+static void    Handle_USBAsynchXfer (void *pdev);
+static uint8_t *usbd_pyb_GetCfgDesc (uint8_t speed, uint16_t *length);
+
+/** @defgroup usbd_cdc_Private_Variables
+  * @{
+  */ 
+extern CDC_IF_Prop_TypeDef  APP_FOPS;
+extern uint8_t USBD_DeviceDesc   [USB_SIZ_DEVICE_DESC];
+
+__ALIGN_BEGIN static uint8_t usbd_cdc_AltSet __ALIGN_END = 0;
+__ALIGN_BEGIN static uint8_t USB_Rx_Buffer[CDC_DATA_MAX_PACKET_SIZE] __ALIGN_END;
+__ALIGN_BEGIN uint8_t APP_Rx_Buffer[APP_RX_DATA_SIZE] __ALIGN_END;
+
+__ALIGN_BEGIN static uint8_t CmdBuff[CDC_CMD_PACKET_SZE] __ALIGN_END;
+
+__ALIGN_BEGIN static uint8_t USBD_MSC_MaxLun __ALIGN_END = 0;
+__ALIGN_BEGIN static uint8_t USBD_MSC_AltSet __ALIGN_END = 0;
+
+uint32_t APP_Rx_ptr_in  = 0;
+uint32_t APP_Rx_ptr_out = 0;
+uint32_t APP_Rx_length  = 0;
+
+uint8_t  USB_Tx_State = 0;
+
+static uint32_t cdcCmd = 0xFF;
+static uint32_t cdcLen = 0;
+
+/* PYB interface class callbacks structure */
+USBD_Class_cb_TypeDef USBD_PYB_cb =
+{
+    usbd_pyb_Init,
+    usbd_pyb_DeInit,
+    usbd_pyb_Setup,
+    NULL, // EP0_TxSent
+    usbd_pyb_EP0_RxReady,
+    usbd_pyb_DataIn,
+    usbd_pyb_DataOut,
+    usbd_pyb_SOF,
+    NULL, // IsoINIncomplete
+    NULL, // IsoOUTIncomplete
+    usbd_pyb_GetCfgDesc,
+    // for OTG_HS support need to add other cfg desc here
+};
+
+#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
+  #if defined ( __ICCARM__ ) /*!< IAR Compiler */
+    #pragma data_alignment=4   
+  #endif
+#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */
+/* USB PYB device Configuration Descriptor */
+__ALIGN_BEGIN static uint8_t usbd_pyb_CfgDesc[USB_PYB_CONFIG_DESC_SIZ] __ALIGN_END =
+{
+    //--------------------------------------------------------------------------
+    // Configuration Descriptor
+    0x09,   // bLength: Configuration Descriptor size
+    USB_CONFIGURATION_DESCRIPTOR_TYPE,      // bDescriptorType: Configuration
+    LOBYTE(USB_PYB_CONFIG_DESC_SIZ),        // wTotalLength: no of returned bytes
+    HIBYTE(USB_PYB_CONFIG_DESC_SIZ),
+    0x03,   // bNumInterfaces: 3 interfaces
+    0x01,   // bConfigurationValue: Configuration value
+    0x00,   // iConfiguration: Index of string descriptor describing the configuration
+    0x80,   // bmAttributes: bus powered; 0xc0 for self powered
+    0xfa,   // bMaxPower: in units of 2mA
+
+    //==========================================================================
+    // Interface Association for CDC VCP
+    0x08,   // bLength: 8 bytes
+    USB_INTERFACE_ASSOCIATION_TYPE,     // bDescriptorType: IAD
+    0x00,   // bFirstInterface: first interface for this association
+    0x02,   // bInterfaceCount: nummber of interfaces for this association
+    0x00,   // bFunctionClass: ?
+    0x00,   // bFunctionSubClass: ?
+    0x00,   // bFunctionProtocol: ?
+    0x00,   // iFunction: index of string for this function
+
+    //--------------------------------------------------------------------------
+    // Interface Descriptor
+    0x09,   // bLength: Interface Descriptor size
+    USB_INTERFACE_DESCRIPTOR_TYPE,      // bDescriptorType: Interface
+    0x00,   // bInterfaceNumber: Number of Interface
+    0x00,   // bAlternateSetting: Alternate setting
+    0x01,   // bNumEndpoints: One endpoints used
+    0x02,   // bInterfaceClass: Communication Interface Class
+    0x02,   // bInterfaceSubClass: Abstract Control Model
+    0x01,   // bInterfaceProtocol: Common AT commands
+    0x00,   // iInterface:
+
+    // Header Functional Descriptor
+    0x05,   // bLength: Endpoint Descriptor size
+    0x24,   // bDescriptorType: CS_INTERFACE
+    0x00,   // bDescriptorSubtype: Header Func Desc
+    0x10,   // bcdCDC: spec release number
+    0x01,   // ?
+
+    // Call Management Functional Descriptor
+    0x05,   // bFunctionLength
+    0x24,   // bDescriptorType: CS_INTERFACE
+    0x01,   // bDescriptorSubtype: Call Management Func Desc
+    0x00,   // bmCapabilities: D0+D1
+    0x01,   // bDataInterface: 1
+
+    // ACM Functional Descriptor
+    0x04,   // bFunctionLength
+    0x24,   // bDescriptorType: CS_INTERFACE
+    0x02,   // bDescriptorSubtype: Abstract Control Management desc
+    0x02,   // bmCapabilities
+
+    // Union Functional Descriptor
+    0x05,   // bFunctionLength
+    0x24,   // bDescriptorType: CS_INTERFACE
+    0x06,   // bDescriptorSubtype: Union func desc
+    0x00,   // bMasterInterface: Communication class interface
+    0x01,   // bSlaveInterface0: Data Class Interface
+
+    // Endpoint 2 Descriptor
+    0x07,                           // bLength: Endpoint Descriptor size
+    USB_ENDPOINT_DESCRIPTOR_TYPE,   // bDescriptorType: Endpoint
+    CDC_CMD_EP,                     // bEndpointAddress
+    0x03,                           // bmAttributes: Interrupt
+    LOBYTE(CDC_CMD_PACKET_SZE),     // wMaxPacketSize:
+    HIBYTE(CDC_CMD_PACKET_SZE),
+    0x80,                           // bInterval: polling interval in frames of 1ms
+
+    //--------------------------------------------------------------------------
+    // Data class interface descriptor
+    0x09,   // bLength: Endpoint Descriptor size
+    USB_INTERFACE_DESCRIPTOR_TYPE,      // bDescriptorType: interface
+    0x01,   // bInterfaceNumber: Number of Interface
+    0x00,   // bAlternateSetting: Alternate setting
+    0x02,   // bNumEndpoints: Two endpoints used
+    0x0A,   // bInterfaceClass: CDC
+    0x00,   // bInterfaceSubClass: ?
+    0x00,   // bInterfaceProtocol: ?
+    0x00,   // iInterface:
+
+    // Endpoint OUT Descriptor
+    0x07,                               // bLength: Endpoint Descriptor size
+    USB_ENDPOINT_DESCRIPTOR_TYPE,       // bDescriptorType: Endpoint
+    CDC_OUT_EP,                         // bEndpointAddress
+    0x02,                               // bmAttributes: Bulk
+    LOBYTE(CDC_DATA_MAX_PACKET_SIZE),   // wMaxPacketSize:
+    HIBYTE(CDC_DATA_MAX_PACKET_SIZE),
+    0x00,                               // bInterval: ignore for Bulk transfer
+
+    // Endpoint IN Descriptor
+    0x07,                               // bLength: Endpoint Descriptor size
+    USB_ENDPOINT_DESCRIPTOR_TYPE,       // bDescriptorType: Endpoint
+    CDC_IN_EP,                          // bEndpointAddress
+    0x02,                               // bmAttributes: Bulk
+    LOBYTE(CDC_DATA_MAX_PACKET_SIZE),   // wMaxPacketSize:
+    HIBYTE(CDC_DATA_MAX_PACKET_SIZE),
+    0x00,                               // bInterval: ignore for Bulk transfer
+
+    //==========================================================================
+    // MSC only has 1 interface so doesn't need an IAD
+
+    //--------------------------------------------------------------------------
+    // Interface Descriptor
+    0x09,   // bLength: Interface Descriptor size
+    USB_INTERFACE_DESCRIPTOR_TYPE,      // bDescriptorType: interface descriptor
+    0x02,   // bInterfaceNumber: Number of Interface
+    0x00,   // bAlternateSetting: Alternate setting
+    0x02,   // bNumEndpoints*/
+    0x08,   // bInterfaceClass: MSC Class
+    0x06,   // bInterfaceSubClass : SCSI transparent*/
+    0x50,   // nInterfaceProtocol
+    0x00,   // iInterface:
+
+    // Endpoint IN descriptor
+    0x07,                           // bLength: Endpoint descriptor length
+    USB_ENDPOINT_DESCRIPTOR_TYPE,   // bDescriptorType: Endpoint descriptor type
+    MSC_IN_EP,                      // bEndpointAddress: IN, address 3
+    0x02,                           // bmAttributes: Bulk endpoint type
+    LOBYTE(MSC_MAX_PACKET),         // wMaxPacketSize
+    HIBYTE(MSC_MAX_PACKET),
+    0x00,                           // bInterval: ignore for Bulk transfer
+
+    // Endpoint OUT descriptor
+    0x07,                           // bLength: Endpoint descriptor length
+    USB_ENDPOINT_DESCRIPTOR_TYPE,   // bDescriptorType: Endpoint descriptor type
+    MSC_OUT_EP,                     // bEndpointAddress: OUT, address 3
+    0x02,                           // bmAttributes: Bulk endpoint type
+    LOBYTE(MSC_MAX_PACKET),         // wMaxPacketSize
+    HIBYTE(MSC_MAX_PACKET),
+    0x00,                           // bInterval: ignore for Bulk transfer
+};
+
+
+/** @defgroup usbd_pyb_Private_Functions
+  * @{
+  */ 
+
+/**
+  * @brief  usbd_pyb_Init
+  *         Initilaize the PYB interface
+  * @param  pdev: device instance
+  * @param  cfgidx: Configuration index
+  * @retval status
+  */
+static uint8_t usbd_pyb_Init(void *pdev, uint8_t cfgidx) {
+    // deinit first to reset
+    usbd_pyb_DeInit(pdev, cfgidx);
+
+    //----------------------------------
+    // CDC VCP component
+
+    // Open EP IN
+    DCD_EP_Open(pdev,
+                CDC_IN_EP,
+                CDC_DATA_IN_PACKET_SIZE,
+                USB_OTG_EP_BULK);
+
+    // Open EP OUT
+    DCD_EP_Open(pdev,
+                CDC_OUT_EP,
+                CDC_DATA_OUT_PACKET_SIZE,
+                USB_OTG_EP_BULK);
+
+    // Open Command IN EP
+    DCD_EP_Open(pdev,
+                CDC_CMD_EP,
+                CDC_CMD_PACKET_SZE,
+                USB_OTG_EP_INT);
+
+    /*
+    // can use this to dynamically set the device class
+    uint8_t *pbuf = USBD_DeviceDesc;
+    pbuf[4] = DEVICE_CLASS_CDC;
+    pbuf[5] = DEVICE_SUBCLASS_CDC;
+    */
+
+    // Initialize the Interface physical components
+    APP_FOPS.pIf_Init();
+
+    // Prepare Out endpoint to receive next packet */
+    DCD_EP_PrepareRx(pdev,
+                     CDC_OUT_EP,
+                     (uint8_t*)(USB_Rx_Buffer),
+                     CDC_DATA_OUT_PACKET_SIZE);
+
+    //----------------------------------
+    // MSC component
+
+    // Open EP IN
+    DCD_EP_Open(pdev,
+                MSC_IN_EP,
+                MSC_EPIN_SIZE,
+                USB_OTG_EP_BULK);
+
+    // Open EP OUT
+    DCD_EP_Open(pdev,
+                MSC_OUT_EP,
+                MSC_EPOUT_SIZE,
+                USB_OTG_EP_BULK);
+
+    // Init the BOT layer
+    MSC_BOT_Init(pdev);
+
+    return USBD_OK;
+}
+
+/**
+  * @brief  usbd_pyb_Init
+  *         DeInitialize the CDC layer
+  * @param  pdev: device instance
+  * @param  cfgidx: Configuration index
+  * @retval status
+  */
+static uint8_t usbd_pyb_DeInit(void *pdev, uint8_t cfgidx) {
+    //----------------------------------
+    // CDC VCP component
+    // close CDC EPs
+    DCD_EP_Close(pdev, CDC_IN_EP);
+    DCD_EP_Close(pdev, CDC_OUT_EP);
+    DCD_EP_Close(pdev, CDC_CMD_EP);
+
+    // Restore default state of the Interface physical components
+    APP_FOPS.pIf_DeInit();
+
+    //----------------------------------
+    // MSC component
+
+    // Close MSC EPs
+    DCD_EP_Close(pdev, MSC_IN_EP);
+    DCD_EP_Close(pdev, MSC_OUT_EP);
+
+    // Un Init the BOT layer
+    MSC_BOT_DeInit(pdev);
+
+    return USBD_OK;
+}
+
+#define BOT_GET_MAX_LUN              0xFE
+#define BOT_RESET                    0xFF
+
+/**
+  * @brief  usbd_pyb_Setup
+  *         Handle the CDC specific requests
+  * @param  pdev: instance
+  * @param  req: usb requests
+  * @retval status
+  */
+static uint8_t usbd_pyb_Setup(void *pdev, USB_SETUP_REQ *req) {
+    switch (req->bmRequest & (USB_REQ_TYPE_MASK | USB_REQ_RECIPIENT_MASK)) {
+
+        // Standard Device Request ---------------------------------------------
+        case (USB_REQ_TYPE_STANDARD | USB_REQ_RECIPIENT_DEVICE):
+            switch (req->bRequest) {
+                case USB_REQ_GET_DESCRIPTOR:
+                {
+                    uint16_t len = USB_CDC_DESC_SIZ; // XXX WRONG!
+                    uint8_t *pbuf = usbd_pyb_CfgDesc + 9;
+                    if ((req->wValue >> 8) == CDC_DESCRIPTOR_TYPE) {
+                        pbuf = usbd_pyb_CfgDesc + 9 + (9 * USBD_ITF_MAX_NUM); // TODO
+                        len = MIN(USB_CDC_DESC_SIZ, req->wLength); // TODO
+                    }
+                    return USBD_CtlSendData(pdev, pbuf, len);
+                }
+            }
+            break;
+
+        // Standard Interface Request ------------------------------------------
+        case (USB_REQ_TYPE_STANDARD | USB_REQ_RECIPIENT_INTERFACE):
+            switch (req->bRequest) {
+                case USB_REQ_GET_INTERFACE:
+                    // wIndex & 0xff is the interface
+                    if ((req->wIndex & 0xff) <= 1) {
+                        return USBD_CtlSendData(pdev, &usbd_cdc_AltSet, 1);
+                    } else {
+                        return USBD_CtlSendData(pdev, &USBD_MSC_AltSet, 1);
+                    }
+
+                case USB_REQ_SET_INTERFACE:
+                    if ((uint8_t)(req->wValue) < USBD_ITF_MAX_NUM) { // TODO
+                        if ((req->wIndex & 0xff) <= 1) {
+                            usbd_cdc_AltSet = req->wValue;
+                        } else {
+                            USBD_MSC_AltSet = req->wValue;
+                        }
+                        return USBD_OK;
+                    }
+            }
+            break;
+
+        // Standard Endpoint Request -------------------------------------------
+        case (USB_REQ_TYPE_STANDARD | USB_REQ_RECIPIENT_ENDPOINT):
+            // req->wIndex is the endpoint number, including direction
+            if (req->wIndex == MSC_IN_EP || req->wIndex == MSC_OUT_EP) {
+                // MSC component
+                switch (req->bRequest) {
+                    case USB_REQ_CLEAR_FEATURE:
+
+                        // Flush the FIFO and Clear the stall status
+                        DCD_EP_Flush(pdev, (uint8_t)req->wIndex);
+
+                        // Re-activate the EP
+                        DCD_EP_Close(pdev, (uint8_t)req->wIndex);
+
+                        if ((((uint8_t)req->wIndex) & 0x80) == 0x80) {
+                            DCD_EP_Open(pdev, ((uint8_t)req->wIndex), MSC_EPIN_SIZE, USB_OTG_EP_BULK);
+                        } else {
+                            DCD_EP_Open(pdev, ((uint8_t)req->wIndex), MSC_EPOUT_SIZE, USB_OTG_EP_BULK);
+                        }
+
+                        // Handle BOT error
+                        MSC_BOT_CplClrFeature(pdev, (uint8_t)req->wIndex);
+                        return USBD_OK;
+                }
+            }
+            break;
+
+        // CDC Class Requests ------------------------------
+        case (USB_REQ_TYPE_CLASS | USB_REQ_RECIPIENT_INTERFACE):
+            // req->wIndex is the recipient interface number
+            if (req->wIndex == 0) {
+                // CDC component, communications interface (TODO do we need to handle if#1?)
+
+                // Check if the request is a data setup packet
+                if (req->wLength) {
+                    if (req->bmRequest & 0x80) {
+                        // Device-to-Host request
+
+                        // Get the data to be sent to Host from interface layer
+                        APP_FOPS.pIf_Ctrl(req->bRequest, CmdBuff, req->wLength);
+
+                        // Send the data to the host
+                        return USBD_CtlSendData(pdev, CmdBuff, req->wLength);
+
+                    } else {
+                        // Host-to-Device requeset
+
+                        // Set the value of the current command to be processed */
+                        cdcCmd = req->bRequest;
+                        cdcLen = req->wLength;
+
+                        // Prepare the reception of the buffer over EP0
+                        // Next step: the received data will be managed in usbd_cdc_EP0_TxSent() function.
+                        return USBD_CtlPrepareRx(pdev, CmdBuff, req->wLength);
+                    }
+                } else {
+                    // Not a Data request
+
+                    // Transfer the command to the interface layer */
+                    return APP_FOPS.pIf_Ctrl(req->bRequest, NULL, 0);
+                }
+
+            } else if (req->wIndex == 2) {
+                // MSC component
+                switch (req->bRequest) {
+                    case BOT_GET_MAX_LUN:
+                        if ((req->wValue  == 0) && (req->wLength == 1) && ((req->bmRequest & 0x80) == 0x80)) {
+                            USBD_MSC_MaxLun = USBD_STORAGE_fops->GetMaxLun();
+                            if (USBD_MSC_MaxLun > 0) {
+                                return USBD_CtlSendData(pdev, &USBD_MSC_MaxLun, 1);
+                            }
+                        }
+                        break;
+
+                    case BOT_RESET:
+                        if ((req->wValue  == 0) && (req->wLength == 0) && ((req->bmRequest & 0x80) != 0x80)) {
+                            MSC_BOT_Reset(pdev);
+                            return USBD_OK;
+                        }
+                        break;
+                }
+            }
+            break;
+    }
+
+    printf("SU %x %x %x %x\n", req->bmRequest, req->bRequest, req->wValue, req->wIndex);
+
+    // invalid command
+    USBD_CtlError(pdev, req);
+    return USBD_FAIL;
+}
+
+/**
+  * @brief  usbd_pyb_EP0_RxReady
+  *         Data received on control endpoint
+  * @param  pdev: device device instance
+  * @retval status
+  */
+static uint8_t usbd_pyb_EP0_RxReady(void *pdev) {
+    if (cdcCmd != NO_CMD) {
+        // Process the data
+        APP_FOPS.pIf_Ctrl(cdcCmd, CmdBuff, cdcLen);
+
+        // Reset the command variable to default value
+        cdcCmd = NO_CMD;
+    }
+
+    return USBD_OK;
+}
+
+/**
+  * @brief  usbd_pyb_DataIn
+  *         Data sent on non-control IN endpoint
+  * @param  pdev: device instance
+  * @param  epnum: endpoint number
+  * @retval status
+  */
+static uint8_t usbd_pyb_DataIn(void *pdev, uint8_t epnum) {
+    uint16_t USB_Tx_ptr;
+    uint16_t USB_Tx_length;
+
+    switch (epnum) {
+        case (CDC_IN_EP & 0x7f): // TODO is this correct?
+        case (CDC_CMD_EP & 0x7f): // TODO is this correct?
+            if (USB_Tx_State == 1) {
+                if (APP_Rx_length == 0) {
+                    USB_Tx_State = 0;
+                } else {
+                    if (APP_Rx_length > CDC_DATA_IN_PACKET_SIZE) {
+                        USB_Tx_ptr = APP_Rx_ptr_out;
+                        USB_Tx_length = CDC_DATA_IN_PACKET_SIZE;
+
+                        APP_Rx_ptr_out += CDC_DATA_IN_PACKET_SIZE;
+                        APP_Rx_length -= CDC_DATA_IN_PACKET_SIZE;
+                    } else {
+                        USB_Tx_ptr = APP_Rx_ptr_out;
+                        USB_Tx_length = APP_Rx_length;
+
+                        APP_Rx_ptr_out += APP_Rx_length;
+                        APP_Rx_length = 0;
+                    }
+
+                    // Prepare the available data buffer to be sent on IN endpoint
+                    DCD_EP_Tx(pdev,
+                              CDC_IN_EP,
+                              (uint8_t*)&APP_Rx_Buffer[USB_Tx_ptr],
+                              USB_Tx_length);
+                }
+            }
+            break;
+
+        case (MSC_IN_EP & 0x7f): // TODO?
+            MSC_BOT_DataIn(pdev, epnum);
+            break;
+    }
+
+    return USBD_OK;
+}
+
+/**
+  * @brief  usbd_pyb_DataOut
+  *         Data received on non-control Out endpoint
+  * @param  pdev: device instance
+  * @param  epnum: endpoint number
+  * @retval status
+  */
+static uint8_t usbd_pyb_DataOut(void *pdev, uint8_t epnum) {
+    uint16_t USB_Rx_Cnt;
+
+    switch (epnum) {
+        case (CDC_OUT_EP & 0x7f): // TODO is this correct?
+            // Get the received data buffer and update the counter */
+            USB_Rx_Cnt = ((USB_OTG_CORE_HANDLE*)pdev)->dev.out_ep[epnum].xfer_count;
+
+            /* USB data will be immediately processed, this allow next USB traffic being 
+               NAKed till the end of the application Xfer */
+            APP_FOPS.pIf_DataRx(USB_Rx_Buffer, USB_Rx_Cnt);
+
+            // Prepare Out endpoint to receive next packet */
+            DCD_EP_PrepareRx(pdev,
+                             CDC_OUT_EP,
+                             (uint8_t*)(USB_Rx_Buffer),
+                             CDC_DATA_OUT_PACKET_SIZE);
+            break;
+
+        case (MSC_OUT_EP & 0x7f): // TODO is this correct?
+            MSC_BOT_DataOut(pdev, epnum);
+            break;
+    }
+
+    return USBD_OK;
+}
+
+/**
+  * @brief  usbd_pyb_SOF
+  *         Start Of Frame event management
+  * @param  pdev: instance
+  * @retval status
+  */
+static uint8_t usbd_pyb_SOF(void *pdev) {
+    static uint32_t FrameCount = 0;
+
+    // TODO do we need to check that this is for CDC/VCP? can we even do that?
+
+    if (FrameCount++ == CDC_IN_FRAME_INTERVAL) {
+        // Reset the frame counter */
+        FrameCount = 0;
+
+        // Check the data to be sent through IN pipe */
+        Handle_USBAsynchXfer(pdev);
+    }
+
+    return USBD_OK;
+}
+
+/**
+  * @brief  Handle_USBAsynchXfer
+  *         Send data to USB
+  * @param  pdev: instance
+  * @retval None
+  */
+static void Handle_USBAsynchXfer (void *pdev)
+{
+  uint16_t USB_Tx_ptr;
+  uint16_t USB_Tx_length;
+  
+  if(USB_Tx_State != 1)
+  {
+    if (APP_Rx_ptr_out == APP_RX_DATA_SIZE)
+    {
+      APP_Rx_ptr_out = 0;
+    }
+    
+    if(APP_Rx_ptr_out == APP_Rx_ptr_in) 
+    {
+      USB_Tx_State = 0; 
+      return;
+    }
+    
+    if(APP_Rx_ptr_out > APP_Rx_ptr_in) // rollback */
+    { 
+      APP_Rx_length = APP_RX_DATA_SIZE - APP_Rx_ptr_out;
+    
+    }
+    else 
+    {
+      APP_Rx_length = APP_Rx_ptr_in - APP_Rx_ptr_out;
+     
+    }
+#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
+     APP_Rx_length &= ~0x03;
+#endif // USB_OTG_HS_INTERNAL_DMA_ENABLED */
+    
+    if (APP_Rx_length > CDC_DATA_IN_PACKET_SIZE)
+    {
+      USB_Tx_ptr = APP_Rx_ptr_out;
+      USB_Tx_length = CDC_DATA_IN_PACKET_SIZE;
+      
+      APP_Rx_ptr_out += CDC_DATA_IN_PACKET_SIZE;	
+      APP_Rx_length -= CDC_DATA_IN_PACKET_SIZE;
+    }
+    else
+    {
+      USB_Tx_ptr = APP_Rx_ptr_out;
+      USB_Tx_length = APP_Rx_length;
+      
+      APP_Rx_ptr_out += APP_Rx_length;
+      APP_Rx_length = 0;
+    }
+    USB_Tx_State = 1; 
+
+    DCD_EP_Tx (pdev,
+               CDC_IN_EP,
+               (uint8_t*)&APP_Rx_Buffer[USB_Tx_ptr],
+               USB_Tx_length);
+  }  
+  
+}
+
+/**
+  * @brief  usbd_pyb_GetCfgDesc 
+  *         Return configuration descriptor
+  * @param  speed : current device speed
+  * @param  length : pointer data length
+  * @retval pointer to descriptor buffer
+  */
+static uint8_t *usbd_pyb_GetCfgDesc(uint8_t speed, uint16_t *length) {
+    *length = sizeof(usbd_pyb_CfgDesc);
+    return usbd_pyb_CfgDesc;
+}
diff --git a/stm/lib/usbd_pyb_core.h b/stm/lib/usbd_pyb_core.h
new file mode 100644
index 0000000000000000000000000000000000000000..e4cdb1fc0a1de95748cb87083272c08f66b50d81
--- /dev/null
+++ b/stm/lib/usbd_pyb_core.h
@@ -0,0 +1 @@
+extern USBD_Class_cb_TypeDef USBD_PYB_cb;
diff --git a/stm/lib/usbd_req.c b/stm/lib/usbd_req.c
index f954bd9af225e3c9ab2941878305eee7aa4c790d..02217cdccc9d6c0bdc514c252a24cdcef810e1d1 100644
--- a/stm/lib/usbd_req.c
+++ b/stm/lib/usbd_req.c
@@ -127,7 +127,7 @@ static void USBD_SetFeature(USB_OTG_CORE_HANDLE  *pdev,
 static void USBD_ClrFeature(USB_OTG_CORE_HANDLE  *pdev, 
                             USB_SETUP_REQ *req);
 
-static uint8_t USBD_GetLen(uint8_t *buf);
+static uint8_t USBD_GetLen(const char *buf);
 /**
   * @}
   */ 
@@ -815,7 +815,7 @@ void USBD_CtlError( USB_OTG_CORE_HANDLE  *pdev,
   * @param  len : descriptor length
   * @retval None
   */
-void USBD_GetString(uint8_t *desc, uint8_t *unicode, uint16_t *len)
+void USBD_GetString(const char *desc, uint8_t *unicode, uint16_t *len)
 {
   uint8_t idx = 0;
   
@@ -839,7 +839,7 @@ void USBD_GetString(uint8_t *desc, uint8_t *unicode, uint16_t *len)
    * @param  buf : pointer to the ascii string buffer
   * @retval string length
   */
-static uint8_t USBD_GetLen(uint8_t *buf)
+static uint8_t USBD_GetLen(const char *buf)
 {
     uint8_t  len = 0;
 
diff --git a/stm/lib/usbd_req.h b/stm/lib/usbd_req.h
index f88416df3ad8897f3773b76b4abed97d02bceeee..4853186c0d431867a9a1dd47cff3b306ccac3c5a 100644
--- a/stm/lib/usbd_req.h
+++ b/stm/lib/usbd_req.h
@@ -89,7 +89,7 @@ void USBD_ParseSetupRequest( USB_OTG_CORE_HANDLE  *pdev,
 void USBD_CtlError( USB_OTG_CORE_HANDLE  *pdev,
                             USB_SETUP_REQ *req);
 
-void USBD_GetString(uint8_t *desc, uint8_t *unicode, uint16_t *len);
+void USBD_GetString(const char *desc, uint8_t *unicode, uint16_t *len);
 /**
   * @}
   */ 
diff --git a/stm/lib/usbd_storage_msd.c b/stm/lib/usbd_storage_msd.c
index 1844ef9ada1b943225eacc84d69c08ea706d915d..31ec168742b0ff5d6dfdd9ab0dd6e85f48b7eebf 100644
--- a/stm/lib/usbd_storage_msd.c
+++ b/stm/lib/usbd_storage_msd.c
@@ -212,7 +212,6 @@ int8_t STORAGE_GetCapacity (uint8_t lun, uint32_t *block_num, uint32_t *block_si
   */
 int8_t  STORAGE_IsReady (uint8_t lun)
 {
-  
     /*
 #ifndef USE_STM3210C_EVAL  
   
@@ -268,7 +267,6 @@ int8_t STORAGE_Read (uint8_t lun,
                  uint32_t blk_addr,                       
                  uint16_t blk_len)
 {
-  
     /*
   if( SD_ReadMultiBlocks (buf, 
                           blk_addr * 512, 
diff --git a/stm/main.c b/stm/main.c
index 2e7f2ec90bf39f50d978b79187ae20bf8791785d..0d761b8cb8199a6198d628a7175d8ddbd8ab327e 100644
--- a/stm/main.c
+++ b/stm/main.c
@@ -716,7 +716,7 @@ int main() {
         }
 
         // read a file
-        if (1) {
+        if (0) {
             FIL fp;
             f_open(&fp, "0:/boot.py", FA_READ);
             UINT n;
@@ -744,10 +744,10 @@ int main() {
         //usb_vcp_init();
     }
 
-    // USB MSC testing
+    // USB testing
     if (1) {
-        void usb_msc_init();
-        usb_msc_init();
+        void usb_init();
+        usb_init();
     }
 
     int i = 0;
diff --git a/stm/usb.c b/stm/usb.c
index 2987b45cc4450e1847d0f5b8bae26b5eea90136a..eea7e5a0a6fb3e85fce7444843350f26a618af0a 100644
--- a/stm/usb.c
+++ b/stm/usb.c
@@ -1,5 +1,6 @@
-#include "usbd_cdc_core.h"
-#include "usbd_msc_core.h"
+#include "usb_core.h"
+#include "usbd_core.h"
+#include "usbd_pyb_core.h"
 #include "usbd_usr.h"
 #include "usbd_desc.h"
 
@@ -15,6 +16,6 @@ void usb_vcp_send(const char* str, int len) {
     //APP_FOPS.pIf_DataTx(str, len);
 }
 
-void usb_msc_init() {
-    USBD_Init(&USB_OTG_dev, USB_OTG_FS_CORE_ID, &USR_desc, &USBD_MSC_cb, &USR_cb);
+void usb_init() {
+    USBD_Init(&USB_OTG_dev, USB_OTG_FS_CORE_ID, &USR_desc, &USBD_PYB_cb, &USR_cb);
 }