diff --git a/Documentation/NuttxUserGuide.html b/Documentation/NuttxUserGuide.html
index a5997f9728cf6f1f3c168cdee9cded742039f803..09407bfb081dcb284be11c0c3432bc8a3965180e 100644
--- a/Documentation/NuttxUserGuide.html
+++ b/Documentation/NuttxUserGuide.html
@@ -13,7 +13,7 @@
       <h1><big><font color="#3c34ec"><i>NuttX Operating System<p>User's Manual</i></font></big></h1>
       <p><small>by</small></p>
       <p>Gregory Nutt<p>
-      <p>Last Updated: July 19, 2011</p>
+      <p>Last Updated: December 5, 2011</p>
     </td>
   </tr>
 </table>
@@ -1549,58 +1549,83 @@ interface of the same name.
 <h3><a name="mqnotify">2.4.7 mq_notify</a></h3>
 
 <p>
-<b>Function Prototype:</b> 
+  <b>Function Prototype:</b> 
 <pre>
     #include &lt;mqueue.h&gt;
     int mq_notify(mqd_t mqdes, const struct sigevent *notification);
 </pre>
-
+</p>
 <p>
-<b>Description:</b> If the &quot;notification&quot; input parameter
-is not NULL, this function connects the task with the message queue such
-that the specified signal will be sent to the task whenever the message
-changes from empty to non-empty. One notification can be attached
-to a message queue.
+  <b>Description:</b> If the <code>notification</code> input parameter
+  is not <code>NULL</code>, this function connects the task with the message queue such
+  that the specified signal will be sent to the task whenever the message
+  changes from empty to non-empty. One notification can be attached
+  to a message queue.
+</p>
 <p>
-If &quot;notification&quot; is NULL, the attached notification
-is detached (if it was held by the calling task) and the queue
-is available to attach another notification.
+  If <code>notification</code>; is <code>NULL</code>, the attached notification
+  is detached (if it was held by the calling task) and the queue
+  is available to attach another notification.
+</p>
 <p>
-When the notification is sent to the registered task, its registration
-will be removed.  The message queue will then be available for
-registration.
+  When the notification is sent to the registered task, its registration
+  will be removed.  The message queue will then be available for
+  registration.
 <p>
-<b>Input Parameters:</b>
-<ul>
-<li><i>mqdes</i>. Message queue descriptor
-<li><i>notification</i>. Real-time signal structure containing:
-<ul>
-<li><i>sigev_notify</i>. Should be SIGEV_SIGNAL (but actually
-ignored)
-<li><i>sigev_signo</i>. The signo to use for the notification
-<li><i>sigev_value</i>. Value associated with the signal
-</ul>
-
-</ul>
-
+  <b>Input Parameters:</b>
+  <ul>
+    <li>
+      <code>mqdes</code>. Message queue descriptor
+    </li>
+    <li><code>notification</code>. Real-time signal structure containing:
+    <ul>
+      <li><code>sigev_notify</code>. Should be SIGEV_SIGNAL (but actually ignored)
+      <li><code>sigev_signo</code>. The signo to use for the notification
+      <li><code>sigev_value</code>. Value associated with the signal
+    </ul>
+  </ul>
+</p>
 <p>
-<b>Returned Values:</b> None.
+  <b>Returned Values:</b>
+  On success <code>mq_notify()</code> returns 0; on error, -1 is returned, with
+  <code>errno</code> set to indicate the error:
+  <ul>
+    <li>
+      <code>EBADF</code>. The descriptor specified in <code>mqdes</code> is invalid. 
+    </li>
+    <li>
+      <code>EBUSY</code>. Another process has already registered to receive notification
+      for this message queue. 
+    </li>
+    <li>
+      <code>EINVAL</code>. <code>sevp->sigev_notify</code> is not one of the permitted values; or
+      <code>sevp->sigev_notify</code> is <code>SIGEV_SIGNAL</code> and <code>sevp->sigev_signo</code> is not a
+      valid signal number. 
+    </li>
+    <li>
+      <code>ENOMEM</code>. Insufficient memory.
+    </li>
+  </ul>
+</p>
 <p>
-<b>Assumptions/Limitations:</b> 
+  <b>Assumptions/Limitations:</b>
+</p>
 <p>
-<b>  POSIX  Compatibility:</b> Comparable to the POSIX interface
-of the same name.
-Differences from the full POSIX implementation include:
-<ul>
-<li>The notification signal will be sent to the registered task even if
-another task is waiting for the message queue to become non-empty.  This is
-inconsistent with the POSIX specification which states, &quot;If a process
-has registered for notification of message arrival at a message queue and
-some process is blocked in <i>mq_receive</i> waiting to receive a message
-when a message arrives at the queue, the arriving message shall satisfy the
-appropriate <i>mq_receive()</i> ... The resulting behavior is as if the
-message queue remains empty, and no notification shall be sent.&quot;
-</ul>
+  <b>POSIX  Compatibility:</b> Comparable to the POSIX interface of the same name.
+  Differences from the full POSIX implementation include:
+  <ul>
+    <li>
+      The notification signal will be sent to the registered task even if
+      another task is waiting for the message queue to become non-empty.  This is
+      inconsistent with the POSIX specification which states, &quot;If a process
+      has registered for notification of message arrival at a message queue and
+      some process is blocked in <i>mq_receive</i> waiting to receive a message
+      when a message arrives at the queue, the arriving message shall satisfy the
+      appropriate <i>mq_receive()</i> ... The resulting behavior is as if the
+      message queue remains empty, and no notification shall be sent.&quot;
+    </li>
+  </ul>
+</p>
 
 <H3><a name="mqsetattr">2.4.8 mq_setattr</a></H3>
 
diff --git a/configs/stm3210e-eval/RIDE/defconfig b/configs/stm3210e-eval/RIDE/defconfig
index 21adf16aba47640160788552cc7d6decd2e17f55..f47f40bf375cdb70a05507e8b404b0983588f84f 100755
--- a/configs/stm3210e-eval/RIDE/defconfig
+++ b/configs/stm3210e-eval/RIDE/defconfig
@@ -223,6 +223,13 @@ CONFIG_SSI1_DISABLE=y
 CONFIG_SSI_POLLWAIT=y
 #CONFIG_SSI_TXLIMIT=4
 
+#
+# STM3210E-EVAL specific LCD settings
+#
+CONFIG_STM32_AM240320_DISABLE=n
+CONFIG_STM32_SPFD5408B_DISABLE=n
+CONFIG_STM32_R61580_DISABLE=y
+
 #
 # General build options
 #
diff --git a/configs/stm3210e-eval/buttons/defconfig b/configs/stm3210e-eval/buttons/defconfig
index 16c19e07fe3b7cbe121b3d01c5bec71b4e0c9075..7a1e4d78dbae545699b5e850b39805725374755f 100644
--- a/configs/stm3210e-eval/buttons/defconfig
+++ b/configs/stm3210e-eval/buttons/defconfig
@@ -236,6 +236,13 @@ CONFIG_SSI1_DISABLE=y
 CONFIG_SSI_POLLWAIT=y
 #CONFIG_SSI_TXLIMIT=4
 
+#
+# STM3210E-EVAL specific LCD settings
+#
+CONFIG_STM32_AM240320_DISABLE=n
+CONFIG_STM32_SPFD5408B_DISABLE=n
+CONFIG_STM32_R61580_DISABLE=y
+
 #
 # General build options
 #
diff --git a/configs/stm3210e-eval/nsh/defconfig b/configs/stm3210e-eval/nsh/defconfig
index 06df09d2e986863a7eb5804b7bdfec899696f02e..8e1e1f84843c5a6ed894d88ec144ad7d3fa7141b 100755
--- a/configs/stm3210e-eval/nsh/defconfig
+++ b/configs/stm3210e-eval/nsh/defconfig
@@ -232,6 +232,13 @@ CONFIG_SSI1_DISABLE=y
 CONFIG_SSI_POLLWAIT=y
 #CONFIG_SSI_TXLIMIT=4
 
+#
+# STM3210E-EVAL specific LCD settings
+#
+CONFIG_STM32_AM240320_DISABLE=n
+CONFIG_STM32_SPFD5408B_DISABLE=n
+CONFIG_STM32_R61580_DISABLE=y
+
 #
 # General build options
 #
diff --git a/configs/stm3210e-eval/nsh2/defconfig b/configs/stm3210e-eval/nsh2/defconfig
index 281fec5b713aae03c4059a65bad1a67858e20263..ae6a06606a4376e6dfa5b07efc3ad9b15842136d 100644
--- a/configs/stm3210e-eval/nsh2/defconfig
+++ b/configs/stm3210e-eval/nsh2/defconfig
@@ -232,6 +232,13 @@ CONFIG_SSI1_DISABLE=y
 CONFIG_SSI_POLLWAIT=y
 #CONFIG_SSI_TXLIMIT=4
 
+#
+# STM3210E-EVAL specific LCD settings
+#
+CONFIG_STM32_AM240320_DISABLE=n
+CONFIG_STM32_SPFD5408B_DISABLE=n
+CONFIG_STM32_R61580_DISABLE=y
+
 #
 # General build options
 #
diff --git a/configs/stm3210e-eval/nx/defconfig b/configs/stm3210e-eval/nx/defconfig
index 8381ae8f6d121c12618187c1f9c6088d4e5f956a..94d843fb9544d602cb92778f098f7c508582b7a7 100644
--- a/configs/stm3210e-eval/nx/defconfig
+++ b/configs/stm3210e-eval/nx/defconfig
@@ -232,6 +232,13 @@ CONFIG_SSI1_DISABLE=y
 CONFIG_SSI_POLLWAIT=y
 #CONFIG_SSI_TXLIMIT=4
 
+#
+# STM3210E-EVAL specific LCD settings
+#
+CONFIG_STM32_AM240320_DISABLE=n
+CONFIG_STM32_SPFD5408B_DISABLE=n
+CONFIG_STM32_R61580_DISABLE=y
+
 #
 # General build options
 #
diff --git a/configs/stm3210e-eval/nxlines/defconfig b/configs/stm3210e-eval/nxlines/defconfig
index 048476296ea3bf95531c2975a35942d98bb9e54c..0ed46b6ad14301914e068dd747d6e3691dfbd09d 100644
--- a/configs/stm3210e-eval/nxlines/defconfig
+++ b/configs/stm3210e-eval/nxlines/defconfig
@@ -232,6 +232,13 @@ CONFIG_SSI1_DISABLE=y
 CONFIG_SSI_POLLWAIT=y
 #CONFIG_SSI_TXLIMIT=4
 
+#
+# STM3210E-EVAL specific LCD settings
+#
+CONFIG_STM32_AM240320_DISABLE=n
+CONFIG_STM32_SPFD5408B_DISABLE=n
+CONFIG_STM32_R61580_DISABLE=y
+
 #
 # General build options
 #
diff --git a/configs/stm3210e-eval/nxtext/defconfig b/configs/stm3210e-eval/nxtext/defconfig
index 07ab05c7431b29487103330d5208394356e8e694..e48a147c94d7989e9dc9c0c26e9d7ee72625558a 100644
--- a/configs/stm3210e-eval/nxtext/defconfig
+++ b/configs/stm3210e-eval/nxtext/defconfig
@@ -232,6 +232,13 @@ CONFIG_SSI1_DISABLE=y
 CONFIG_SSI_POLLWAIT=y
 #CONFIG_SSI_TXLIMIT=4
 
+#
+# STM3210E-EVAL specific LCD settings
+#
+CONFIG_STM32_AM240320_DISABLE=n
+CONFIG_STM32_SPFD5408B_DISABLE=n
+CONFIG_STM32_R61580_DISABLE=y
+
 #
 # General build options
 #
diff --git a/configs/stm3210e-eval/ostest/defconfig b/configs/stm3210e-eval/ostest/defconfig
index b3516fa5d4f38c0938344dbbdf29104d0d8db5ed..c4f81ecd8c7137fe07fceac6c7843390c035e6ad 100755
--- a/configs/stm3210e-eval/ostest/defconfig
+++ b/configs/stm3210e-eval/ostest/defconfig
@@ -234,6 +234,13 @@ CONFIG_SSI1_DISABLE=y
 CONFIG_SSI_POLLWAIT=y
 #CONFIG_SSI_TXLIMIT=4
 
+#
+# STM3210E-EVAL specific LCD settings
+#
+CONFIG_STM32_AM240320_DISABLE=n
+CONFIG_STM32_SPFD5408B_DISABLE=n
+CONFIG_STM32_R61580_DISABLE=y
+
 #
 # General build options
 #
diff --git a/configs/stm3210e-eval/src/up_lcd.c b/configs/stm3210e-eval/src/up_lcd.c
index 481da54dd6ad667b8a343bf21f1ff13213a61c3f..a3fe6c8107d60d3f71f0d8ecbbf45ea06070d08e 100644
--- a/configs/stm3210e-eval/src/up_lcd.c
+++ b/configs/stm3210e-eval/src/up_lcd.c
@@ -289,6 +289,7 @@
 #define LCD_REG_153           0x99
 #define LCD_REG_154           0x9a
 #define LCD_REG_157           0x9d
+#define LCD_REG_164           0xa4
 #define LCD_REG_192           0xc0
 #define LCD_REG_193           0xc1
 #define LCD_REG_229           0xe5
@@ -1074,27 +1075,14 @@ static inline void stm3210e_lcdinitialize(void)
   id = stm3210e_readreg(LCD_REG_0);
   lcddbg("LCD ID: %04x\n", id);
 
-  /* Check if the ID is for the SPFD5408B or the almost compatible R61580 */
+  /* Check if the ID is for the SPFD5408B */
 
-#if !defined(CONFIG_STM32_SPFD5408B_DISABLE) || !defined(CONFIG_STM32_R61580_DISABLE)
-#if !defined(CONFIG_STM32_SPFD5408B_DISABLE) && !defined(CONFIG_STM32_R61580_DISABLE)
-  if (id == SPFD5408B_ID || id == R61580_ID)
-#elif !defined(CONFIG_STM32_SPFD5408B_DISABLE)
+#if !defined(CONFIG_STM32_SPFD5408B_DISABLE)
   if (id == SPFD5408B_ID)
-#else
-  if (id == R61580_ID)
-#endif
     {
-      /* Set the LCD type for the SPFD5408B or the R61580 */
-
-#if !defined(CONFIG_STM32_SPFD5408B_DISABLE) && !defined(CONFIG_STM32_R61580_DISABLE)
-      g_lcddev.type = (id == SPFD5408B_ID ? LCD_TYPE_SPFD5408B : LCD_TYPE_R61580);
-#elif !defined(CONFIG_STM32_SPFD5408B_DISABLE)
-      g_lcddev.type = SPFD5408B_ID;
-#else
-      g_lcddev.type = LCD_TYPE_R61580;
-#endif
+      /* Set the LCD type for the SPFD5408B */
 
+      g_lcddev.type = LCD_TYPE_SPFD5408B;
       lcddbg("LCD type: %d\n", g_lcddev.type);
 
       /* Start Initial Sequence */
@@ -1191,6 +1179,80 @@ static inline void stm3210e_lcdinitialize(void)
     }
   else
 #endif
+
+  /* Check if the ID is for the almost compatible R61580 */
+
+#if !defined(CONFIG_STM32_R61580_DISABLE)
+  if (id == R61580_ID)
+    {
+      /* Set the LCD type for the R61580 */
+
+      g_lcddev.type = LCD_TYPE_R61580;
+      lcddbg("LCD type: %d\n", g_lcddev.type);
+
+      /* Start Initial Sequence */
+
+      stm3210e_writereg(LCD_REG_0,   0x0000);
+      stm3210e_writereg(LCD_REG_0,   0x0000);
+      up_mdelay(100);
+      stm3210e_writereg(LCD_REG_0,   0x0000);
+      stm3210e_writereg(LCD_REG_0,   0x0000);
+      stm3210e_writereg(LCD_REG_0,   0x0000);
+      stm3210e_writereg(LCD_REG_0,   0x0000);
+      stm3210e_writereg(LCD_REG_164, 0x0001);
+      up_mdelay(100);
+      stm3210e_writereg(LCD_REG_96,  0xa700);
+      stm3210e_writereg(LCD_REG_8,   0x0808);
+
+      /* Gamma Setting */
+
+      stm3210e_writereg(LCD_REG_48,  0x0203);
+      stm3210e_writereg(LCD_REG_49,  0x080f);
+      stm3210e_writereg(LCD_REG_50,  0x0401);
+      stm3210e_writereg(LCD_REG_51,  0x050b);
+      stm3210e_writereg(LCD_REG_52,  0x3330);
+      stm3210e_writereg(LCD_REG_53,  0x0b05);
+      stm3210e_writereg(LCD_REG_54,  0x0005);
+      stm3210e_writereg(LCD_REG_55,  0x0f08);
+      stm3210e_writereg(LCD_REG_56,  0x0302);
+      stm3210e_writereg(LCD_REG_57,  0x3033);
+
+      /* Power Setting */
+
+      stm3210e_writereg(LCD_REG_144, 0x0018); /* 80Hz */
+      stm3210e_writereg(LCD_REG_16,  0x0530); /* BT, AP */
+      stm3210e_writereg(LCD_REG_17,  0x0237); /* DC1,DC0,VC */
+      stm3210e_writereg(LCD_REG_18,  0x01bf);
+      stm3210e_writereg(LCD_REG_19,  0x1000); /* VCOM */
+      up_mdelay(200);
+
+      stm3210e_writereg(LCD_REG_1,   0x0100); /* Set SS bit */
+      stm3210e_writereg(LCD_REG_2,   0x0200);
+      stm3210e_writereg(LCD_REG_3,   0x1030); /* Set GRAM write direction and BGR=1. */
+      stm3210e_writereg(LCD_REG_9,   0x0001);
+      stm3210e_writereg(LCD_REG_10,  0x0008);
+      stm3210e_writereg(LCD_REG_12,  0x0000); /* RGB 18-bit System interface setting */
+      stm3210e_writereg(LCD_REG_13,  0xd000);
+      stm3210e_writereg(LCD_REG_14,  0x0030);
+      stm3210e_writereg(LCD_REG_15,  0x0000); /* RGB interface polarity, no impact */
+      stm3210e_writereg(LCD_REG_32,  0x0000); /* H Start */
+      stm3210e_writereg(LCD_REG_33,  0x0000); /* V Start */
+      stm3210e_writereg(LCD_REG_41,  0x002e);
+      stm3210e_writereg(LCD_REG_80,  0x0000); /* Horizontal GRAM Start Address */
+      stm3210e_writereg(LCD_REG_81,  0x00ef); /* Horizontal GRAM End Address */
+      stm3210e_writereg(LCD_REG_82,  0x0000); /* Vertical GRAM Start Address */
+      stm3210e_writereg(LCD_REG_83,  0x013f); /* Vertical GRAM End Address */
+      stm3210e_writereg(LCD_REG_97,  0x0001); /* NDL, VLE, REV */
+      stm3210e_writereg(LCD_REG_106, 0x0000); /* set scrolling line */
+      stm3210e_writereg(LCD_REG_128, 0x0000);
+      stm3210e_writereg(LCD_REG_129, 0x0000);
+      stm3210e_writereg(LCD_REG_130, 0x005f);
+      stm3210e_writereg(LCD_REG_147, 0x0701);
+
+      stm3210e_writereg(LCD_REG_7,   0x0000); /* Display OFF */
+    }
+  else
+#endif
     {
 #ifndef CONFIG_STM32_AM240320_DISABLE
       g_lcddev.type = LCD_TYPE_AM240320;
diff --git a/configs/stm3210e-eval/usbserial/defconfig b/configs/stm3210e-eval/usbserial/defconfig
index ef85b33bb5ac479ddc8d8ed4129bb318b2b1f70c..be28df9666a30bf34b814220bc8b98d95e5a05cd 100755
--- a/configs/stm3210e-eval/usbserial/defconfig
+++ b/configs/stm3210e-eval/usbserial/defconfig
@@ -234,6 +234,13 @@ CONFIG_SSI1_DISABLE=y
 CONFIG_SSI_POLLWAIT=y
 #CONFIG_SSI_TXLIMIT=4
 
+#
+# STM3210E-EVAL specific LCD settings
+#
+CONFIG_STM32_AM240320_DISABLE=n
+CONFIG_STM32_SPFD5408B_DISABLE=n
+CONFIG_STM32_R61580_DISABLE=y
+
 #
 # General build options
 #
diff --git a/configs/stm3210e-eval/usbstorage/defconfig b/configs/stm3210e-eval/usbstorage/defconfig
index 7e7a447ce59d63c55567751cd88fc5f8adf468e5..9d4557ab9fe67cb5e468c575b473ff1e672aea51 100755
--- a/configs/stm3210e-eval/usbstorage/defconfig
+++ b/configs/stm3210e-eval/usbstorage/defconfig
@@ -232,6 +232,13 @@ CONFIG_SSI1_DISABLE=y
 CONFIG_SSI_POLLWAIT=y
 #CONFIG_SSI_TXLIMIT=4
 
+#
+# STM3210E-EVAL specific LCD settings
+#
+CONFIG_STM32_AM240320_DISABLE=n
+CONFIG_STM32_SPFD5408B_DISABLE=n
+CONFIG_STM32_R61580_DISABLE=y
+
 #
 # General build options
 #
diff --git a/sched/mq_notify.c b/sched/mq_notify.c
index 4ec3d82c981a2a1039900838acbb38892b88cd6f..ce64d5a54ea84b48d98c719d152727f65b1c16a3 100644
--- a/sched/mq_notify.c
+++ b/sched/mq_notify.c
@@ -2,7 +2,7 @@
  * sched/mq_notify.c
  *
  *   Copyright (C) 2007, 2009, 2011 Gregory Nutt. All rights reserved.
- *   Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *   Author: Gregory Nutt <gnutt@nuttx.org>
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -97,17 +97,17 @@
  *      sigev_value - Value associated with the signal
  *
  * Return Value:
- *  On success mq_notify() returns 0; on error, -1 is returned, with
- *  errno set to indicate the error.
+ *   On success mq_notify() returns 0; on error, -1 is returned, with
+ *   errno set to indicate the error.
  *
- *  EBADF The descriptor specified in mqdes is invalid. 
- *  EBUSY Another process has already registered to receive notification
- *    for this message queue. 
- *  EINVAL sevp->sigev_notify is not one of the permitted values; or
- *    sevp->sigev_notify is SIGEV_SIGNAL and sevp->sigev_signo is not a
- *    valid signal number. 
- *  ENOMEM
- *    Insufficient memory.
+ *   EBADF The descriptor specified in mqdes is invalid. 
+ *   EBUSY Another process has already registered to receive notification
+ *     for this message queue. 
+ *   EINVAL sevp->sigev_notify is not one of the permitted values; or
+ *     sevp->sigev_notify is SIGEV_SIGNAL and sevp->sigev_signo is not a
+ *     valid signal number. 
+ *   ENOMEM
+ *     Insufficient memory.
  *
  * Assumptions:
  *