diff --git a/ChangeLog b/ChangeLog
index ad7b19395aedfc636af18e3c74a056168c9c9de2..d56d12d02a8c8d5163661b210088f95f7db42309 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -516,5 +516,8 @@
 	  larger then the endpoint's max packet (DM320 driver also fixed, untested)
 	* Added logic to the USB device interface:  A bit is needed to force the driver to
 	  to terminate an IN transfer with a short packet (zero-length if necessary).
+	* Fix an error in the NXP LPC214x USB device driver that was causing corruption of
+	  the request queue (M320 driver also fixed, untested)
+
 
 
diff --git a/Documentation/NuttX.html b/Documentation/NuttX.html
index b0c04ea922c8fa0006f48b54ac90bad188979c34..cf954853810e90c3c39e825ab5a1b8eecb4dd597 100644
--- a/Documentation/NuttX.html
+++ b/Documentation/NuttX.html
@@ -8,7 +8,7 @@
   <tr align="center" bgcolor="#e4e4e4">
     <td>
       <h1><big><font color="#3c34ec"><i>NuttX RTOS</i></font></big></h1>
-      <p>Last Updated: October 25, 2008</p>
+      <p>Last Updated: October 27, 2008</p>
     </td>
   </tr>
 </table>
@@ -1146,6 +1146,8 @@ nuttx-0.3.17 2008-xx-xx Gregory Nutt &lt;spudmonkey@racsa.co.cr&gt;
 	  larger then the endpoint's max packet (DM320 driver also fixed, untested)
 	* Added logic to the USB device interface:  A bit is needed to force the driver to
 	  to terminate an IN transfer with a short packet (zero-length if necessary).
+	* Fix an error in the NXP LPC214x USB device driver that was causing corruption of
+	  the request queue (M320 driver also fixed, untested)
 
 pascal-0.1.3 2008-xx-xx Gregory Nutt &lt;spudmonkey@racsa.co.cr&gt;
 
diff --git a/arch/arm/src/dm320/dm320_usbdev.c b/arch/arm/src/dm320/dm320_usbdev.c
index 46cbb654accdcb7bfeb1520544f68a1b0111081f..c585c3fe9779a25f677678285376a94f2cc29d4b 100644
--- a/arch/arm/src/dm320/dm320_usbdev.c
+++ b/arch/arm/src/dm320/dm320_usbdev.c
@@ -886,7 +886,7 @@ static void dm320_reqcomplete(struct dm320_ep_s *privep, sint16 result)
   int stalled = privep->stalled;
   irqstate_t flags;
 
-  /* Remove the complete request at the head of the endpoint request list */
+  /* Remove the completed request at the head of the endpoint request list */
 
   flags = irqsave();
   privreq = dm320_rqdequeue(privep);
@@ -1003,7 +1003,7 @@ static int dm320_wrrequest(struct dm320_ep_s *privep)
        * then we are finished with the transfer
        */
 
-      if (bytesleft <= 0 && !privep->txnullpkt)
+      if (privreq->req.xfrd >= privreq->req.len && !privep->txnullpkt)
         {
           usbtrace(TRACE_COMPLETE(privep->epphy), privreq->req.xfrd);
           privep->txnullpkt = 0;
@@ -1214,8 +1214,8 @@ static inline void dm320_ep0setup(struct dm320_usbdev_s *priv)
   value = GETUINT16(ctrl.value);
   len   = GETUINT16(ctrl.len);
 
-  uvdbg("type=%02x req=%02x value=%04x index=%04x len=%04x\n",
-        ctrl.type, ctrl.req, value, index, len);
+  ullvdbg("type=%02x req=%02x value=%04x index=%04x len=%04x\n",
+          ctrl.type, ctrl.req, value, index, len);
 
   /* Dispatch any non-standard requests */
 
@@ -1575,7 +1575,7 @@ static int dm320_ctlrinterrupt(int irq, FAR void *context)
               }
             else
               {
-                uvdbg("Pending data on OUT endpoint\n");
+                ullvdbg("Pending data on OUT endpoint\n");
                 priv->rxpending = 1;
               }
           }
@@ -2357,7 +2357,7 @@ void up_usbinitialize(void)
 
 #ifdef CONFIG_DEBUG_USB
   chiprev = dm320_getreg16(DM320_BUSC_REVR);
-  udbg("DM320 revision : %d.%d\n", chiprev >> 4, chiprev & 0x0f);
+  ulldbg("DM320 revision : %d.%d\n", chiprev >> 4, chiprev & 0x0f);
 #endif
 
   /* Enable USB clock & GIO clock  */
diff --git a/arch/arm/src/lpc214x/lpc214x_usbdev.c b/arch/arm/src/lpc214x/lpc214x_usbdev.c
index cb220cc1bb640f158e6cd6932b3cf8733e25b46c..71c30596d2ebc448d4dc61ca1e3d64552f5228a0 100644
--- a/arch/arm/src/lpc214x/lpc214x_usbdev.c
+++ b/arch/arm/src/lpc214x/lpc214x_usbdev.c
@@ -958,7 +958,7 @@ static void lpc214x_reqcomplete(struct lpc214x_ep_s *privep, sint16 result)
   int stalled = privep->stalled;
   irqstate_t flags;
 
-  /* Remove the complete request at the head of the endpoint request list */
+  /* Remove the completed request at the head of the endpoint request list */
 
   flags = irqsave();
   privreq = lpc214x_rqdequeue(privep);
@@ -1014,8 +1014,8 @@ static int lpc214x_wrrequest(struct lpc214x_ep_s *privep)
       return OK;
     }
 
-  uvdbg("len=%d xfrd=%d nullpkt=%d\n",
-        privreq->req.len, privreq->req.xfrd, privep->txnullpkt);
+  ullvdbg("epphy=%d req=%p: len=%d xfrd=%d nullpkt=%d\n",
+          privep->epphy, privreq, privreq->req.len, privreq->req.xfrd, privep->txnullpkt);
 
   /* Ignore any attempt to send a zero length packet on anything but EP0IN */
 
@@ -1090,7 +1090,7 @@ static int lpc214x_wrrequest(struct lpc214x_ep_s *privep)
    * then we are finished with the transfer
    */
 
-  if (bytesleft <= 0 && !privep->txnullpkt)
+  if (privreq->req.xfrd >= privreq->req.len && !privep->txnullpkt)
     {
       usbtrace(TRACE_COMPLETE(privep->epphy), privreq->req.xfrd);
       privep->txnullpkt = 0;
@@ -1123,8 +1123,8 @@ static int lpc214x_rdrequest(struct lpc214x_ep_s *privep)
       return OK;
     }
 
-  uvdbg("len=%d xfrd=%d nullpkt=%d\n",
-        privreq->req.len, privreq->req.xfrd, privep->txnullpkt);
+  ullvdbg("len=%d xfrd=%d nullpkt=%d\n",
+          privreq->req.len, privreq->req.xfrd, privep->txnullpkt);
 
   /* Ignore any attempt to receive a zero length packet */
 
@@ -1526,8 +1526,8 @@ static inline void lpc214x_ep0setup(struct lpc214x_usbdev_s *priv)
   index = GETUINT16(ctrl.index);
   len   = GETUINT16(ctrl.len);
 
-  uvdbg("type=%02x req=%02x value=%04x index=%04x len=%04x\n",
-        ctrl.type, ctrl.req, value, index, len);
+  ullvdbg("type=%02x req=%02x value=%04x index=%04x len=%04x\n",
+          ctrl.type, ctrl.req, value, index, len);
 
   /* Dispatch any non-standard requests */
 
@@ -1671,7 +1671,7 @@ static inline void lpc214x_ep0setup(struct lpc214x_usbdev_s *priv)
         if (((ctrl.type & USB_REQ_RECIPIENT_MASK) == USB_REQ_RECIPIENT_DEVICE) &&
             value == USB_FEATURE_TESTMODE)
           {
-            uvdbg("test mode: %d\n", index);
+            ullvdbg("test mode: %d\n", index);
           }
         else if ((ctrl.type & USB_REQ_RECIPIENT_MASK) != USB_REQ_RECIPIENT_ENDPOINT)
           {
@@ -2240,7 +2240,7 @@ static int lpc214x_usbinterrupt(int irq, FAR void *context)
                                 }
                               else
                                 {
-                                  uvdbg("Pending data on OUT endpoint\n");
+                                  ullvdbg("Pending data on OUT endpoint\n");
                                   priv->rxpending = 1;
                                 }
                             }
@@ -2687,7 +2687,7 @@ static int lpc214x_epsubmit(FAR struct usbdev_ep_s *ep, FAR struct usbdev_req_s
   if (!req || !req->callback || !req->buf || !ep)
     {
       usbtrace(TRACE_DEVERROR(LPC214X_TRACEERR_INVALIDPARMS), 0);
-      uvdbg("req=%p callback=%p buf=%p ep=%p\n", req, req->callback, req->buf, ep);
+      ullvdbg("req=%p callback=%p buf=%p ep=%p\n", req, req->callback, req->buf, ep);
       return -EINVAL;
     }
 #endif