diff --git a/arch/arm/src/lpc214x/lpc214x_usbdev.c b/arch/arm/src/lpc214x/lpc214x_usbdev.c
index 4141f4a3954b01012e668ea65a020f1abe8cd83a..669e79d007b42705ba9a93bc8fa665ae3a6e4067 100644
--- a/arch/arm/src/lpc214x/lpc214x_usbdev.c
+++ b/arch/arm/src/lpc214x/lpc214x_usbdev.c
@@ -129,28 +129,27 @@
 #define LPC214X_TRACEERR_BADGETCONFIG         0x0007
 #define LPC214X_TRACEERR_BADGETSETDESC        0x0008
 #define LPC214X_TRACEERR_BADGETSTATUS         0x0009
-#define LPC214X_TRACEERR_BADREQUEST           0x000a
-#define LPC214X_TRACEERR_BADSETADDRESS        0x000b
-#define LPC214X_TRACEERR_BADSETCONFIG         0x000c
-#define LPC214X_TRACEERR_BADSETFEATURE        0x000d
-#define LPC214X_TRACEERR_BINDFAILED           0x000e
-#define LPC214X_TRACEERR_DMABUSY              0x000f
-#define LPC214X_TRACEERR_DRIVER               0x0010
-#define LPC214X_TRACEERR_DRIVERREGISTERED     0x0011
-#define LPC214X_TRACEERR_EP0INSTALLED         0x0012
-#define LPC214X_TRACEERR_EP0OUTSTALLED        0x0013
-#define LPC214X_TRACEERR_EP0SETUPSTALLED      0x0014
-#define LPC214X_TRACEERR_EPINNULLPACKET       0x0015
-#define LPC214X_TRACEERR_EPOUTNULLPACKET      0x0016
-#define LPC214X_TRACEERR_EPREAD               0x0017
-#define LPC214X_TRACEERR_INVALIDCMD           0x0018
-#define LPC214X_TRACEERR_INVALIDCTRLREQ       0x0019
-#define LPC214X_TRACEERR_INVALIDPARMS         0x001a
-#define LPC214X_TRACEERR_IRQREGISTRATION      0x001b
-#define LPC214X_TRACEERR_NODMADESC            0x001c
-#define LPC214X_TRACEERR_NOEP                 0x001d
-#define LPC214X_TRACEERR_NOTCONFIGURED        0x001e
-#define LPC214X_TRACEERR_REQABORTED           0x001f
+#define LPC214X_TRACEERR_BADSETADDRESS        0x000a
+#define LPC214X_TRACEERR_BADSETCONFIG         0x000b
+#define LPC214X_TRACEERR_BADSETFEATURE        0x000c
+#define LPC214X_TRACEERR_BINDFAILED           0x000d
+#define LPC214X_TRACEERR_DMABUSY              0x000e
+#define LPC214X_TRACEERR_DRIVER               0x000f
+#define LPC214X_TRACEERR_DRIVERREGISTERED     0x0010
+#define LPC214X_TRACEERR_EP0INSTALLED         0x0011
+#define LPC214X_TRACEERR_EP0OUTSTALLED        0x0012
+#define LPC214X_TRACEERR_EP0SETUPSTALLED      0x0013
+#define LPC214X_TRACEERR_EPINNULLPACKET       0x0014
+#define LPC214X_TRACEERR_EPOUTNULLPACKET      0x0015
+#define LPC214X_TRACEERR_EPREAD               0x0016
+#define LPC214X_TRACEERR_INVALIDCMD           0x0017
+#define LPC214X_TRACEERR_INVALIDCTRLREQ       0x0018
+#define LPC214X_TRACEERR_INVALIDPARMS         0x0019
+#define LPC214X_TRACEERR_IRQREGISTRATION      0x001a
+#define LPC214X_TRACEERR_NODMADESC            0x001b
+#define LPC214X_TRACEERR_NOEP                 0x001c
+#define LPC214X_TRACEERR_NOTCONFIGURED        0x001d
+#define LPC214X_TRACEERR_REQABORTED           0x001e
 
 /* Trace interrupt codes */
 
@@ -356,9 +355,8 @@ struct lpc214x_usbdev_s
   ubyte                   paddrset:1;    /* 1: Peripheral addr has been set */
   ubyte                   attached:1;    /* 1: Host attached */
   ubyte                   rxpending:1;   /* 1: RX pending */
-  uint32                  epavail;       /* Available endpoints */
   uint32                  softprio;      /* Bitset of high priority interrupts */
-  uint32                  wravail;       /* Bitset of available endpoints */
+  uint32                  epavail;       /* Bitset of available endpoints */
 #ifdef CONFIG_LPC214X_USBDEV_FRAME_INTERRUPT
   uint32                  sof;           /* Last start-of-frame */
 #endif
@@ -2186,7 +2184,7 @@ static int lpc214x_usbinterrupt(int irq, FAR void *context)
                                 }
                               else
                                 {
-                                  uvdbg("Pending interrupt\n");
+                                  uvdbg("Pending data on OUT endpoint\n");
                                   priv->rxpending = 1;
                                 }
                             }
@@ -2650,33 +2648,30 @@ static int lpc214x_epsubmit(FAR struct usbdev_ep_s *ep, FAR struct usbdev_req_s
 
   else if (LPC214X_EPPHYIN(privep->epphy))
     {
-      /* Add the new request to the request queue for the endpoint */
+      /* Add the new request to the request queue for the IN endpoint */
 
       lpc214x_rqenqueue(privep, privreq);
       usbtrace(TRACE_INREQQUEUED(privep->epphy), privreq->req.len);
       ret = lpc214x_wrrequest(privep);
     }
 
-  /* Handle OUT (host-to-device) requests -- but only if one is expected*/
+  /* Handle OUT (host-to-device) requests */
 
-  else if (priv->rxpending)
+  else
     {
-      /* Add the new request to the request queue for the endpoint */
+      /* Add the new request to the request queue for the OUT endpoint */
 
       privep->txnullpkt = 0;
       lpc214x_rqenqueue(privep, privreq);
       usbtrace(TRACE_OUTREQQUEUED(privep->epphy), privreq->req.len);
-      ret = lpc214x_rdrequest(privep);
-      priv->rxpending = 0;
-    }
 
-  /* Unexpected or illformed request */
+      /* This there a incoming data pending the availability of a request? */
 
-  else
-    {
-      usbtrace(TRACE_DEVERROR(LPC214X_TRACEERR_BADREQUEST), (uint16)privep->epphy);
-      lpc214x_abortrequest(privep, privreq, -EBUSY);
-      ret = -EINVAL;
+      if (priv->rxpending)
+        {
+          ret = lpc214x_rdrequest(privep);
+          priv->rxpending = 0;
+        }
     }
 
   irqrestore(flags);
@@ -2795,7 +2790,7 @@ static FAR struct usbdev_ep_s *lcp214x_allocep(FAR struct usbdev_s *dev, ubyte e
       break;
 
     case USB_EP_ATTR_XFER_ISOC: /* Isochronous endpoint */
-      epset &= LPC214X_EPBULKSET;
+      epset &= LPC214X_EPISOCSET;
       break;
 
     case USB_EP_ATTR_XFER_CONTROL: /* Control endpoint -- not a valid choice */
@@ -2819,11 +2814,11 @@ static FAR struct usbdev_ep_s *lcp214x_allocep(FAR struct usbdev_s *dev, ubyte e
           for (epndx = 2; epndx < LPC214X_NPHYSENDPOINTS; epndx++)
             {
               uint32 bit = 1 << epndx;
-              if ((epset & bit) == 0)
+              if ((epset & bit) != 0)
                 {
                   /* Mark the endpoint no longer available */
 
-                  priv->wravail &= ~bit;
+                  priv->epavail &= ~bit;
                   irqrestore(flags);
 
                   /* And return the pointer to the standard endpoint structure */
@@ -2861,7 +2856,7 @@ static void lpc214x_freeep(FAR struct usbdev_s *dev, FAR struct usbdev_ep_s *ep)
       /* Mark the endpoint as available */
 
       flags = irqsave();
-      priv->wravail &= ~(1 << privep->epphy);
+      priv->epavail |= (1 << privep->epphy);
       irqrestore(flags);
     }
 }
@@ -2999,7 +2994,7 @@ void up_usbinitialize(void)
   memset(priv, 0, sizeof(struct lpc214x_usbdev_s));
   priv->usbdev.ops = &g_devops;
   priv->usbdev.ep0 = &priv->eplist[LPC214X_EP0_IN].ep;
-  priv->wravail    = LPC214X_EPALLSET;
+  priv->epavail    = LPC214X_EPALLSET;
 
   /* Initialize the endpoint list */
 
diff --git a/drivers/usbdev/usbdev_serial.c b/drivers/usbdev/usbdev_serial.c
index 402c42c2ab390cd7350f40c4a2f75fa201fbe87b..eed024a3229823656d98e9c7683ccbf8628255c9 100644
--- a/drivers/usbdev/usbdev_serial.c
+++ b/drivers/usbdev/usbdev_serial.c
@@ -196,6 +196,21 @@
 #  define max(a,b) ((a)>(b)?(a):(b))
 #endif
 
+/* Trace values *************************************************************/
+
+#define USBSER_CLASSAPI_SETUP       TRACE_EVENT(TRACE_CLASSAPI_ID, USBSER_TRACECLASSAPI_SETUP)
+#define USBSER_CLASSAPI_SHUTDOWN    TRACE_EVENT(TRACE_CLASSAPI_ID, USBSER_TRACECLASSAPI_SHUTDOWN)
+#define USBSER_CLASSAPI_ATTACH      TRACE_EVENT(TRACE_CLASSAPI_ID, USBSER_TRACECLASSAPI_ATTACH)
+#define USBSER_CLASSAPI_DETACH      TRACE_EVENT(TRACE_CLASSAPI_ID, USBSER_TRACECLASSAPI_DETACH)
+#define USBSER_CLASSAPI_IOCTL       TRACE_EVENT(TRACE_CLASSAPI_ID, USBSER_TRACECLASSAPI_IOCTL)
+#define USBSER_CLASSAPI_RECEIVE     TRACE_EVENT(TRACE_CLASSAPI_ID, USBSER_TRACECLASSAPI_RECEIVE)
+#define USBSER_CLASSAPI_RXINT       TRACE_EVENT(TRACE_CLASSAPI_ID, USBSER_TRACECLASSAPI_RXINT)
+#define USBSER_CLASSAPI_RXAVAILABLE TRACE_EVENT(TRACE_CLASSAPI_ID, USBSER_TRACECLASSAPI_RXAVAILABLE)
+#define USBSER_CLASSAPI_SEND        TRACE_EVENT(TRACE_CLASSAPI_ID, USBSER_TRACECLASSAPI_SEND)
+#define USBSER_CLASSAPI_TXINT       TRACE_EVENT(TRACE_CLASSAPI_ID, USBSER_TRACECLASSAPI_TXINT)
+#define USBSER_CLASSAPI_TXREADY     TRACE_EVENT(TRACE_CLASSAPI_ID, USBSER_TRACECLASSAPI_TXREADY)
+#define USBSER_CLASSAPI_TXEMPTY     TRACE_EVENT(TRACE_CLASSAPI_ID, USBSER_TRACECLASSAPI_TXEMPTY)
+
 /****************************************************************************
  * Private Types
  ****************************************************************************/
@@ -940,14 +955,16 @@ static int usbclass_setconfig(FAR struct usbser_dev_s *priv, ubyte config)
 #if CONFIG_DEBUG
   if (priv == NULL)
     {
-      return -ENODEV;
+      usbtrace(TRACE_CLSERROR(USBSER_TRACEERR_INVALIDARG), 0);
+      return -EIO;
     }
 #endif
 
   if (config == priv->config)
     {
-      /* Already configured */
+      /* Already configured -- Do nothing */
 
+      usbtrace(TRACE_CLSERROR(USBSER_TRACEERR_ALREADYCONFIGURED), 0);
       return 0;
     }
 
@@ -957,15 +974,17 @@ static int usbclass_setconfig(FAR struct usbser_dev_s *priv, ubyte config)
 
   /* Was this a request to simply discard the current configuration? */
 
-  if (config != USBSER_CONFIGIDNONE)
+  if (config == USBSER_CONFIGIDNONE)
     {
+      usbtrace(TRACE_CLSERROR(USBSER_TRACEERR_CONFIGNONE), 0);
       return 0;
     }
 
-  /* The only configuration that we accept is ourt BULK configuration */
+  /* We only accept one configuration */
 
   if (config != USBSER_CONFIGID)
     {
+      usbtrace(TRACE_CLSERROR(USBSER_TRACEERR_CONFIGIDBAD), 0);
       return -EINVAL;
     }
 
@@ -974,7 +993,7 @@ static int usbclass_setconfig(FAR struct usbser_dev_s *priv, ubyte config)
   priv->epintin = DEV_ALLOCEP(dev, 0, TRUE, USB_EP_ATTR_XFER_INT);
   if (!priv->epintin)
     {
-      usbtrace(TRACE_CLSERROR(USBSER_TRACEERR_INALLOCEPFAIL), 0);
+      usbtrace(TRACE_CLSERROR(USBSER_TRACEERR_EPINTINALLOCFAIL), 0);
       ret = -ENODEV;
       goto errout;
     }
@@ -982,7 +1001,7 @@ static int usbclass_setconfig(FAR struct usbser_dev_s *priv, ubyte config)
   ret = EP_CONFIGURE(priv->epintin, &g_epintindesc);
   if (ret < 0)
     {
-      usbtrace(TRACE_CLSERROR(USBSER_TRACEERR_INCONFIGEPFAIL), 0);
+      usbtrace(TRACE_CLSERROR(USBSER_TRACEERR_EPINTINCONFIGFAIL), 0);
       goto errout;
     }
 
@@ -993,7 +1012,7 @@ static int usbclass_setconfig(FAR struct usbser_dev_s *priv, ubyte config)
   priv->epbulkin = DEV_ALLOCEP(dev, 0, TRUE, USB_EP_ATTR_XFER_BULK);
   if (!priv->epbulkin)
     {
-      usbtrace(TRACE_CLSERROR(USBSER_TRACEERR_INALLOCEPFAIL), 0);
+      usbtrace(TRACE_CLSERROR(USBSER_TRACEERR_EPBULKINALLOCFAIL), 0);
       ret = -ENODEV;
       goto errout;
     }
@@ -1015,7 +1034,7 @@ static int usbclass_setconfig(FAR struct usbser_dev_s *priv, ubyte config)
 #endif
   if (ret < 0)
     {
-      usbtrace(TRACE_CLSERROR(USBSER_TRACEERR_INCONFIGEPFAIL), 0);
+      usbtrace(TRACE_CLSERROR(USBSER_TRACEERR_EPBULKINCONFIGFAIL), 0);
       goto errout;
     }
 
@@ -1026,7 +1045,7 @@ static int usbclass_setconfig(FAR struct usbser_dev_s *priv, ubyte config)
   priv->epbulkout = DEV_ALLOCEP(dev, 0, FALSE, USB_EP_ATTR_XFER_BULK);
   if (!priv->epbulkout)
     {
-      usbtrace(TRACE_CLSERROR(USBSER_TRACEERR_OUTALLOCEPFAIL), 0);
+      usbtrace(TRACE_CLSERROR(USBSER_TRACEERR_EPBULKOUTALLOCFAIL), 0);
       ret = -ENODEV;
       goto errout;
     }
@@ -1039,7 +1058,7 @@ static int usbclass_setconfig(FAR struct usbser_dev_s *priv, ubyte config)
 #endif
   if (ret < 0)
     {
-      usbtrace(TRACE_CLSERROR(USBSER_TRACEERR_OUTCONFIGEPFAIL), 0);
+      usbtrace(TRACE_CLSERROR(USBSER_TRACEERR_EPBULKOUTCONFIGFAIL), 0);
       goto errout;
     }
 
@@ -1308,7 +1327,7 @@ static int usbclass_setup(FAR struct usbdev_s *dev, const struct usb_ctrlreq_s *
   if (!dev || !dev->ep0 || !ctrl)
     {
       usbtrace(TRACE_CLSERROR(USBSER_TRACEERR_INVALIDARG), 0);
-      return -EINVAL;
+      return -EIO;
      }
 #endif
   usbtrace(TRACE_CLASSSETUP, ctrl->req);
@@ -1593,18 +1612,21 @@ static int usbser_setup(FAR struct uart_dev_s *dev)
 {
   struct usbser_dev_s *priv = (FAR struct usbser_dev_s*)dev->priv;
 
+  usbtrace(USBSER_CLASSAPI_SETUP, 0);
+
 #if CONFIG_DEBUG
   if (!priv)
     {
-       return -EIO;
+      usbtrace(TRACE_CLSERROR(USBSER_TRACEERR_INVALIDARG), 0);
+      return -EIO;
     }
+#endif
 
   if (priv->config == USBSER_CONFIGIDNONE)
     {
       usbtrace(TRACE_CLSERROR(USBSER_TRACEERR_SETUPNOTCONNECTED), 0);
-      return -ENODEV;
+      return -ENOTCONN;
     }
-#endif
 
   priv->open = TRUE;
   return OK;
@@ -1627,6 +1649,8 @@ static void usbser_shutdown(FAR struct uart_dev_s *dev)
   struct usbser_dev_s *priv = (FAR struct usbser_dev_s*)dev->priv;
   irqstate_t flags;
 
+  usbtrace(USBSER_CLASSAPI_SHUTDOWN, 0);
+
 #if CONFIG_DEBUG
   if (!priv)
     {
@@ -1641,7 +1665,8 @@ static void usbser_shutdown(FAR struct uart_dev_s *dev)
   if (!priv->open)
     {
       usbtrace(TRACE_CLSERROR(USBSER_TRACEERR_ALREADYCLOSED), 0);
-      goto errout;
+      irqrestore(flags);
+      return;
     }
 #endif
 
@@ -1649,8 +1674,6 @@ static void usbser_shutdown(FAR struct uart_dev_s *dev)
 
   usbclass_resetconfig(priv);
   priv->open = FALSE;
-
-errout:
   irqrestore(flags);
 }
 
@@ -1664,6 +1687,7 @@ errout:
 
 static int usbser_attach(FAR struct uart_dev_s *dev)
 {
+  usbtrace(USBSER_CLASSAPI_ATTACH, 0);
   return OK;
 }
 
@@ -1677,6 +1701,7 @@ static int usbser_attach(FAR struct uart_dev_s *dev)
 
 static void usbser_detach(FAR struct uart_dev_s *dev)
 {
+  usbtrace(USBSER_CLASSAPI_DETACH, 0);
 }
 
 /****************************************************************************
@@ -1700,9 +1725,12 @@ static void usbser_rxint(FAR struct uart_dev_s *dev, boolean enable)
 {
   struct usbser_dev_s *priv = (FAR struct usbser_dev_s*)dev->priv;
 
+  usbtrace(USBSER_CLASSAPI_RXINT, (uint16)enable);
+
 #if CONFIG_DEBUG
   if (!priv)
     {
+       usbtrace(TRACE_CLSERROR(USBSER_TRACEERR_INVALIDARG), 0);
        return;
     }
 #endif
@@ -1739,9 +1767,12 @@ static void usbser_txint(FAR struct uart_dev_s *dev, boolean enable)
 {
   struct usbser_dev_s *priv = (FAR struct usbser_dev_s*)dev->priv;
 
+  usbtrace(USBSER_CLASSAPI_TXINT, (uint16)enable);
+
 #if CONFIG_DEBUG
   if (!priv)
     {
+       usbtrace(TRACE_CLSERROR(USBSER_TRACEERR_INVALIDARG), 0);
        return;
     }
 #endif
@@ -1776,10 +1807,13 @@ static boolean usbser_txempty(FAR struct uart_dev_s *dev)
 {
   struct usbser_dev_s *priv = (FAR struct usbser_dev_s*)dev->priv;
 
+  usbtrace(USBSER_CLASSAPI_TXEMPTY, 0);
+
 #if CONFIG_DEBUG
   if (!priv)
     {
-       return TRUE;
+      usbtrace(TRACE_CLSERROR(USBSER_TRACEERR_INVALIDARG), 0);
+      return TRUE;
     }
 #endif
 
@@ -1815,6 +1849,7 @@ int usbdev_serialinitialize(int minor)
   alloc = (FAR struct usbser_alloc_s*)malloc(sizeof(struct usbser_alloc_s));
   if (!alloc)
     {
+      usbtrace(TRACE_CLSERROR(USBSER_TRACEERR_ALLOCDEVSTRUCT), 0);
       return -ENOMEM;
     }
 
@@ -1845,6 +1880,7 @@ int usbdev_serialinitialize(int minor)
   priv->serdev.xmit.size   = CONFIG_USBSER_RXBUFSIZE;
   priv->serdev.xmit.buffer = priv->rxbuffer;
   priv->serdev.ops         = &g_uartops;
+  priv->serdev.priv        = priv;
 
   /* Initialize the USB class driver structure */