diff --git a/ChangeLog b/ChangeLog
index c0a71d83af8d2d6acada5361a578056a0d1c3c52..42f87a846491ae1fee6c89df1e18f5004c798fc1 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -2302,4 +2302,8 @@
 
 	* tools/Makefile.txport, mkexport.sh, and configure.sh.  Changes submitted
 	  by Mike Smith to support configuration and 'make export' on MAC OS.
-
+	* arch/arm/src/stm32/stm32_gpio.c.  Disabled interrupts while configuring
+	  GPIO pins so that we have exclusive access to the GPIO configuration
+	  registers.
+	* arch/mips/src/pic32mx/pic32mx_usbdev.c.  Add a USB device-side driver
+	  for the PIC32MX family.
diff --git a/TODO b/TODO
index 4d65e6ce87f026e381583e22aee4726e88d8e189..a4e9f117458470edff7abccaa0bf9421a11f4cd8 100644
--- a/TODO
+++ b/TODO
@@ -94,6 +94,23 @@ o Task/Scheduler (sched/)
                next interesting event time.  That is one way to both reduce the
                timer interrupt overhead and also to increase the accuracy of
                delays.
+
+               Current timer processing is in sched/sched_processtimer.c:
+
+               1) Calls clock_timer() which just increments a counter (the system
+                  timer -- basically "up-time"). This is only used when code asks
+                  for the current time.  In a tickless OS, some substitute answer
+                  for the question "What time is it?" would need to be developed.
+                  You could use an RTC? Or maybe logic that gets the time until the
+                  next interval expiration and computes the current time. The
+                  solution is not too difficult, but depends on a hardware solution.
+
+               2) Calls wd_timer() which handles the link list of ordered events:
+                  Each timer event is saved with the delta time to the next event
+                  in the list. So an interval timer would be perfect to implement this.
+
+               3) sched_process_timeslice(). Then there is round-robin time-slicing.
+
   Status:      Open
   Priority:    Low
 
diff --git a/arch/arm/src/stm32/stm32_gpio.c b/arch/arm/src/stm32/stm32_gpio.c
index 309df3520fd527f497ae924ebcf65f93d4b66720..6787c5777833198566e8a1e97ce3de5a4bd9cecd 100644
--- a/arch/arm/src/stm32/stm32_gpio.c
+++ b/arch/arm/src/stm32/stm32_gpio.c
@@ -47,6 +47,8 @@
 #include <errno.h>
 #include <debug.h>
 
+#include <arch/irq.h>
+
 #include "up_arch.h"
 
 #include "chip.h"
@@ -202,7 +204,12 @@ static inline void stm32_gpioremap(void)
  *   Based on configuration within the .config file, it does:
  *    - Remaps positions of alternative functions. 
  * 
- * Typically called from stm32_start().
+ *   Typically called from stm32_start().
+ *
+ * Assumptions:
+ *   This function is called early in the initialization sequence so that
+ *   no mutual exlusion is necessary.
+ *
  ****************************************************************************/
 
 void stm32_gpioinit(void)
@@ -244,6 +251,7 @@ int stm32_configgpio(uint32_t cfgset)
   unsigned int pin;
   unsigned int pos;
   unsigned int modecnf;
+  irqstate_t flags;
   bool input;
  
   /* Verify that this hardware supports the select GPIO port */
@@ -278,6 +286,12 @@ int stm32_configgpio(uint32_t cfgset)
 
   input = ((cfgset & GPIO_INPUT) != 0);
 
+  /* Interrupts must be disabled from here on out so that we have mutually
+   * exclusive access to all of the GPIO configuration registers.
+   */
+
+  flags = irqsave();
+
   /* Decode the mode and configuration */
   
   regval  = getreg32(cr);
@@ -316,6 +330,7 @@ int stm32_configgpio(uint32_t cfgset)
         {
           /* Its an alternate function pin... we can return early */
 
+          irqrestore(flags);
           return OK;
         }
     }
@@ -342,6 +357,7 @@ int stm32_configgpio(uint32_t cfgset)
         {
           /* Neither... we can return early */
 
+          irqrestore(flags);
           return OK;
         }
     }
@@ -367,6 +383,8 @@ int stm32_configgpio(uint32_t cfgset)
   regval  = getreg32(regaddr);
   regval |= (1 << pin);
   putreg32(regval, regaddr);
+
+  irqrestore(flags);
   return OK;
 }
 #endif
@@ -386,6 +404,7 @@ int stm32_configgpio(uint32_t cfgset)
   unsigned int pin;
   unsigned int pos;
   unsigned int pinmode;
+  irqstate_t flags;
  
   /* Verify that this hardware supports the select GPIO port */
 
@@ -427,6 +446,14 @@ int stm32_configgpio(uint32_t cfgset)
         break;
     }
 
+  /* Interrupts must be disabled from here on out so that we have mutually
+   * exclusive access to all of the GPIO configuration registers.
+   */
+
+  flags = irqsave();
+
+  /* Now apply the configuration to the mode register */
+
   regval  = getreg32(base + STM32_GPIO_MODER_OFFSET);
   regval &= ~GPIO_MODER_MASK(pin);
   regval |= ((uint32_t)pinmode << GPIO_MODER_SHIFT(pin));
@@ -572,6 +599,7 @@ int stm32_configgpio(uint32_t cfgset)
       stm32_gpiowrite(cfgset, value);
     }
 
+  irqrestore(flags);
   return OK;
 }
 #endif
diff --git a/arch/mips/src/pic32mx/pic32mx-usbdev.c b/arch/mips/src/pic32mx/pic32mx-usbdev.c
index a857ac1627c37c51bfa6c8270745f779b83a4da9..bc0f450e40c2fa00903b505275560956df02e95b 100644
--- a/arch/mips/src/pic32mx/pic32mx-usbdev.c
+++ b/arch/mips/src/pic32mx/pic32mx-usbdev.c
@@ -5,9 +5,12 @@
  *   Author: Gregory Nutt <gnutt@nuttx.orgr>
  *
  * References:
- *   - This file derives from the STM32 USB device driver
+ *   This file derives from the STM32 USB device driver with modifications
+ *   based on additional information from:
+ *
  *   - "USB On-The-Go (OTG)", DS61126E, Microchip Technology Inc., 2009
- *   - Sample code provided with the Sure Electronics PIC32 board.
+ *   - Sample code provided with the Sure Electronics PIC32 board
+ *     (which seems to have derived from Microchip PICDEM PIC18 code).
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -2010,7 +2013,7 @@ static void pic32mx_ep0transfer(struct pic32mx_usbdev_s *priv, uint16_t status)
 
       /* Check the current EP0 OUT buffer contains a SETUP packet */
 
-      if (((bdt->status & USB_BDT_PID_MASK) >> USB_BDT_PID_SHIFT) == USB_SETUP_TOKEN)
+      if (((bdt->status & USB_BDT_PID_MASK) >> USB_BDT_PID_SHIFT) == USB_PID_SETUP_TOKEN)
         {
           /* Check if the SETUP transaction data went into the priv->ctrl
            * buffer. If not, then we will need to copy it.
diff --git a/include/nuttx/usb/usb.h b/include/nuttx/usb/usb.h
index c05f25c503aae4e16c4ba86335bd88d891705389..2c20c69fcc992700d641166af0f30526ddba7485 100644
--- a/include/nuttx/usb/usb.h
+++ b/include/nuttx/usb/usb.h
@@ -47,11 +47,31 @@
 /************************************************************************************
  * Preprocessor Definitions
  ************************************************************************************/
-/* USB Tokens (See chapter 8 in the USB specification) */
-
-#define USB_SETUP_TOKEN                         0x0d
-#define USB_OUT_TOKEN                           0x01
-#define USB_IN_TOKEN                            0x09
+/* A packet identifier (PID) immediately follows the SYNC field of every USB packet.
+ * A PID consists of a four-bit packet type field followed by a four-bit check field
+ * USB Tokens (See Table 8-1 in the USB specification)
+ */
+
+#define USB_PID_OUT_TOKEN                       (0x01) /* Tokens */
+#define USB_PID_IN_TOKEN                        (0x09)
+#define USB_PID_SOF_TOKEN                       (0x05)
+#define USB_PID_SETUP_TOKEN                     (0x0d)
+
+#define USB_PID_DATA0                           (0x03) /* Data */
+#define USB_PID_DATA1                           (0x0b)
+#define USB_PID_DATA2                           (0x07)
+#define USB_PID_MDATA                           (0x0f)
+
+#define USB_PID_ACK                             (0x02) /* Handshake */
+#define USB_PID_NAK                             (0x0a)
+#define USB_PID_STALL                           (0x0e)
+#define USB_PID_NYET                            (0x06)
+
+#define USB_PID_PRE_TOKEN                       (0x0c) /* Special */
+#define USB_PID_ERR                             (0x0c)
+#define USB_PID_SPLIT_TOKEN                     (0x08)
+#define USB_PID_PING_TOKEN                      (0x04)
+#define USB_PID_RESERVED                        (0x00)
 
 /* All 16-bit values must be little-endian */
 
diff --git a/tools/configure.sh b/tools/configure.sh
index 84a9acb43fc290880e948ccdab222d0e317bef24..3aaed0681768ab75eb55766f03c6ba5aed5e05fd 100755
--- a/tools/configure.sh
+++ b/tools/configure.sh
@@ -156,7 +156,7 @@ if [ ! -z "${appdir}" ]; then
   if [ ! -r "${configpath}/appconfig" ]; then
     echo "NOTE: No readable appconfig file found in ${configpath}"
   else
-    install -C "${configpath}/appconfig" "${TOPDIR}/${appdir}/.configX" || \
+    install -C "${configpath}/appconfig" "${TOPDIR}/${appdir}/.config" || \
       { echo "Failed to copy ${configpath}/appconfig" ; exit 10 ; }
 
     echo "" >> "${TOPDIR}/.configX"
@@ -166,7 +166,7 @@ if [ ! -z "${appdir}" ]; then
   fi
 fi
 
-# install the final .configX only if it differs from the existing
+# install the final .configX only if it differs from any existing
 # .config file.
 
 install -C "${TOPDIR}/.configX" "${TOPDIR}/.config"