diff --git a/ChangeLog b/ChangeLog
index 98ecf7778ca13c2a00e6249b547e0222333ff1dd..6378c34cec0ddd13a85db149be69a57d87de6f3b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -402,4 +402,6 @@
 	* Removed duplicate getenv() implementation in /lib
 	* Correct detection of End-of-File in fgets
 	* Implement sh and crude script handler in NSH
+	* Fix prototype of read() and write(). Need to use ssize_t and size_t, not
+	  int and unsigned int.
 
diff --git a/Documentation/NuttX.html b/Documentation/NuttX.html
index 6356422c5c716fd04e3ab1ec68e1c5c3738a5b13..72b61cb91ad6fff89ccecaf7d53b11eaa389053b 100644
--- a/Documentation/NuttX.html
+++ b/Documentation/NuttX.html
@@ -1036,6 +1036,8 @@ nuttx-0.3.13 2008-xx-xx Gregory Nutt <spudmonkey@racsa.co.cr>
 	* Removed duplicate getenv() implementation in /lib
 	* Correct detection of End-of-File in fgets
 	* Implement sh and crude script handler in NSH
+	* Fix prototype of read() and write(). Need to use ssize_t and size_t, not
+	  int and unsigned int.
 
 pascal-0.1.3 2008-xx-xx Gregory Nutt <spudmonkey@racsa.co.cr>
 
diff --git a/Documentation/NuttxUserGuide.html b/Documentation/NuttxUserGuide.html
index a6e6ea90d09fffd7f015bfef4db4774a42ca8180..e5cb13eb3b7dd74d00b5c5304eb1b8a435d9e17d 100644
--- a/Documentation/NuttxUserGuide.html
+++ b/Documentation/NuttxUserGuide.html
@@ -5917,18 +5917,18 @@ interface of the same name.
 
 <ul><pre>
   #include &lt;unistd.h&gt;
-  int   close(int fd);
-  int   dup(int fildes);
-  int   dup2(int fildes1, int fildes2);
-  off_t lseek(int fd, off_t offset, int whence);
-  int   read(int fd, void *buf, unsigned int nbytes);
-  int   unlink(const char *path);
-  int   write(int fd, const void *buf, unsigned int nbytes);
+  int     close(int fd);
+  int     dup(int fildes);
+  int     dup2(int fildes1, int fildes2);
+  off_t   lseek(int fd, off_t offset, int whence);
+  ssize_t read(int fd, void *buf, size_t nbytes);
+  int     unlink(const char *path);
+  ssize_t write(int fd, const void *buf, size_t nbytes);
 </pre></ul>
 
 <ul><pre>
   #include &lt;sys/ioctl.h&gt;
-  int    ioctl(int fd, int req, unsigned long arg);
+  int     ioctl(int fd, int req, unsigned long arg);
 </pre></ul>
 
 <h2><a name="directoryoperations">2.11.3 Directory Operations</a></h2>
diff --git a/fs/fs_read.c b/fs/fs_read.c
index 7500d359943ce62d88b6ee7079a9ed5aeefeb761..51d10830a7a4b8f02ed6c4714410745eb787d231 100644
--- a/fs/fs_read.c
+++ b/fs/fs_read.c
@@ -53,7 +53,7 @@
  * Global Functions
  ****************************************************************************/
 
-int read(int fd, FAR void *buf, unsigned int nbytes)
+ssize_t read(int fd, FAR void *buf, size_t nbytes)
 {
   FAR struct filelist *list;
   int ret = EBADF;
diff --git a/fs/fs_write.c b/fs/fs_write.c
index 28fa8664cc98977108ef55ce320d34e5e6c7039c..19652ad5923235fdda6909c7d85c69b2289e4fe6 100644
--- a/fs/fs_write.c
+++ b/fs/fs_write.c
@@ -58,7 +58,7 @@
  * Global Functions
  ****************************************************************************/
 
-/********************************************************************************************
+/***************************************************************************
  * Function: write
  *
  * Description:
@@ -108,7 +108,7 @@
  *
  ********************************************************************************************/
 
-int write(int fd, FAR const void *buf, unsigned int nbytes)
+ssize_t write(int fd, FAR const void *buf, size_t nbytes)
 {
 #if CONFIG_NFILE_DESCRIPTORS > 0
   FAR struct filelist *list;
diff --git a/include/unistd.h b/include/unistd.h
index e2b88686fa135ccad6e1b96ff6314af887a6b04e..ae34e3d6aa445291a34eda228acb6502d9a66265 100644
--- a/include/unistd.h
+++ b/include/unistd.h
@@ -120,32 +120,32 @@ EXTERN int       optopt; /* unrecognized option character */
 
 /* Task Control Interfaces */
 
-EXTERN pid_t getpid(void);
-EXTERN void  _exit(int status) noreturn_function;
+EXTERN pid_t   getpid(void);
+EXTERN void    _exit(int status) noreturn_function;
 EXTERN unsigned int sleep(unsigned int seconds);
-EXTERN void  usleep(unsigned long usec);
+EXTERN void    usleep(unsigned long usec);
 
 /* File descriptor operations */
 
-EXTERN int   close(int fd);
-EXTERN int   dup(int fd);
-EXTERN int   dup2(int fd1, int fd2);
-EXTERN int   fsync(int fd);
-EXTERN off_t lseek(int fd, off_t offset, int whence);
-EXTERN int   read(int fd, FAR void *buf, unsigned int nbytes);
-EXTERN int   write(int fd, FAR const void *buf, unsigned int nbytes);
+EXTERN int     close(int fd);
+EXTERN int     dup(int fd);
+EXTERN int     dup2(int fd1, int fd2);
+EXTERN int     fsync(int fd);
+EXTERN off_t   lseek(int fd, off_t offset, int whence);
+EXTERN ssize_t read(int fd, FAR void *buf, size_t nbytes);
+EXTERN ssize_t write(int fd, FAR const void *buf, size_t nbytes);
 
 /* Special devices */
-EXTERN int   pipe(int filedes[2]);
+EXTERN int     pipe(int filedes[2]);
 
 /* File path operations */
 
-EXTERN int   unlink(FAR const char *pathname);
-EXTERN int   rmdir(FAR const char *pathname);
+EXTERN int     unlink(FAR const char *pathname);
+EXTERN int     rmdir(FAR const char *pathname);
 
 /* Other */
 
-EXTERN int   getopt(int argc, FAR char *const argv[], FAR const char *optstring);
+EXTERN int     getopt(int argc, FAR char *const argv[], FAR const char *optstring);
 
 #undef EXTERN
 #if defined(__cplusplus)