diff --git a/ChangeLog b/ChangeLog
index 8d098eaea37429f1b12db4add4614d4f125b2063..6f21cf3c19ae060cb0aa1448822e9c9796b08f7e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -416,4 +416,5 @@
 	* NSH now supports if-then[-else]-fi construct
 	* NSH now supports comments beginning with '#'
 	* NSH now supports commands to inspect and modify memory
+	* NSH cat command now supports multiple files on command line
 
diff --git a/Documentation/NuttX.html b/Documentation/NuttX.html
index 3c4bfe8ac2b83f5901ef9aef51557d4bcf3983d5..1c48e5d5838dedda6cd32ac67f3883bd37d7a0a0 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: August 19, 2008</p>
+      <p>Last Updated: August 21, 2008</p>
     </td>
   </tr>
 </table>
@@ -1050,6 +1050,7 @@ nuttx-0.3.13 2008-xx-xx Gregory Nutt &lt;spudmonkey@racsa.co.cr&gt;
 	* NSH now supports if-then[-else]-fi construct
 	* NSH now supports comments beginning with '#'
 	* NSH now supports commands to inspect and modify memory
+	* NSH cat command now supports multiple files on command line
 
 pascal-0.1.3 2008-xx-xx Gregory Nutt &lt;spudmonkey@racsa.co.cr&gt;
 
diff --git a/examples/nsh/nsh_fscmds.c b/examples/nsh/nsh_fscmds.c
index 75bbfc8e9d0381821d7ab73aa72be7aeae0d02f7..144cea9a47ad2ba7d1f367b6a47612491abe297f 100644
--- a/examples/nsh/nsh_fscmds.c
+++ b/examples/nsh/nsh_fscmds.c
@@ -375,72 +375,82 @@ static int ls_recursive(FAR struct nsh_vtbl_s *vtbl, const char *dirpath, struct
 int cmd_cat(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv)
 {
   char buffer[IOBUFFERSIZE];
-  int ret = ERROR;
-
-  /* Open the file for reading */
-
-  int fd = open(argv[1], O_RDONLY);
-  if (fd < 0)
-    {
-      nsh_output(vtbl, g_fmtcmdfailed, argv[0], "open", NSH_ERRNO);
-      return ERROR;
-    }
+  int fd;
+  int i;
+  int ret = OK;
 
-  /* And just dump it byte for byte into stdout */
+  /* Loop for each file name on the command line */
 
-  for (;;)
+  for (i = 1; i < argc && ret == OK; i++)
     {
-      int nbytesread = read(fd, buffer, IOBUFFERSIZE);
+      /* Open the file for reading */
 
-      /* Check for read errors */
-
-      if (nbytesread < 0)
+      fd = open(argv[1], O_RDONLY);
+      if (fd < 0)
         {
-          /* EINTR is not an error */
-
-          if (errno != EINTR)
-            {
-              nsh_output(vtbl, g_fmtcmdfailed, argv[0], "read", NSH_ERRNO);
-              break;
-            }
+          nsh_output(vtbl, g_fmtcmdfailed, argv[0], "open", NSH_ERRNO);
+          ret = ERROR;
         }
-
-      /* Check for data successfully read */
-
-      else if (nbytesread > 0)
+      else
         {
-          int nbyteswritten = 0;
+          /* And just dump it byte for byte into stdout */
 
-          while (nbyteswritten < nbytesread)
+          for (;;)
             {
-              int n = write(1, buffer, nbytesread);
-              if (n < 0)
+              int nbytesread = read(fd, buffer, IOBUFFERSIZE);
+
+              /* Check for read errors */
+
+              if (nbytesread < 0)
                 {
-                  /* EINTR is not an error */
+                 /* EINTR is not an error */
 
                   if (errno != EINTR)
                     {
-                      nsh_output(vtbl, g_fmtcmdfailed, argv[0], "write", NSH_ERRNO);
+                      nsh_output(vtbl, g_fmtcmdfailed, argv[0], "read", NSH_ERRNO);
+                      ret = ERROR;
                       break;
                     }
                 }
+
+              /* Check for data successfully read */
+
+              else if (nbytesread > 0)
+                {
+                  int nbyteswritten = 0;
+
+                  while (nbyteswritten < nbytesread)
+                    {
+                      int n = write(1, buffer, nbytesread);
+                      if (n < 0)
+                        {
+                          /* EINTR is not an error */
+
+                          if (errno != EINTR)
+                            {
+                              nsh_output(vtbl, g_fmtcmdfailed, argv[0], "write", NSH_ERRNO);
+                              ret = ERROR;
+                              break;
+                            }
+                        }
+                      else
+                        {
+                          nbyteswritten += n;
+                        }
+                    }
+                }
+
+              /* Otherwise, it is the end of file */
+
               else
                 {
-                  nbyteswritten += n;
+                  break;
                 }
             }
-        }
-
-      /* Otherwise, it is the end of file */
 
-      else
-        {
-          ret = OK;
-          break;
+          (void)close(fd);
         }
     }
-
-  (void)close(fd);
   return ret;
 }
 #endif
diff --git a/examples/nsh/nsh_main.c b/examples/nsh/nsh_main.c
index b7070f43959e0ae96c8a2681e749b68dc9d52014..8cbf78ad9dea407330518d13064da6defea7dde4 100644
--- a/examples/nsh/nsh_main.c
+++ b/examples/nsh/nsh_main.c
@@ -90,7 +90,7 @@ static const char g_failure[]    = "1";
 static const struct cmdmap_s g_cmdmap[] =
 {
 #if CONFIG_NFILE_DESCRIPTORS > 0
-  { "cat",      cmd_cat,      2, 2, "<path>" },
+  { "cat",      cmd_cat,      2, NSH_MAX_ARGUMENTS, "<path> [<path> [<path> ...]]" },
   { "cp",       cmd_cp,       3, 3, "<source-path> <dest-path>" },
 #endif
 #ifndef CONFIG_DISABLE_ENVIRON
@@ -659,7 +659,8 @@ static inline int nsh_nice(FAR struct nsh_vtbl_s *vtbl, FAR char **ppcmd, FAR ch
                 {
                   char *endptr;
                   vtbl->np.np_nice = (int)strtol(val, &endptr, 0);
-                  if (vtbl->np.np_nice > 19 || vtbl->np.np_nice < -20 || endptr == val || *endptr != '\0')
+                  if (vtbl->np.np_nice > 19 || vtbl->np.np_nice < -20 ||
+                      endptr == val || *endptr != '\0')
                     {
                       nsh_output(vtbl, g_fmtarginvalid, "nice");
                       return ERROR;