diff --git a/ChangeLog b/ChangeLog
index 5946796bf7de307781e5ac6dfe947a61bfdb48d8..f772c834a67d2d585d9a42bc6d96f552cc6abc9d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -135,5 +135,6 @@
 	* Fix errors in timeslice calculation (several places)
 	* Added missing irqrestore() in timer_deletall().
 	* close() was not closing the underlying device.
+	* Added fsync()
 	* Started m68322
 
diff --git a/Documentation/NuttX.html b/Documentation/NuttX.html
index f7b5c3fc8e8f42fc9c2263ae91069ee8f4787533..5b813de34387c8c6301d93906fb2d1a4dfa414a8 100644
--- a/Documentation/NuttX.html
+++ b/Documentation/NuttX.html
@@ -514,6 +514,7 @@ Other memory:
 	* Fix errors in timeslice calculation (several places)
 	* Added missing irqrestore() in timer_deletall().
 	* close() was not closing the underlying device.
+	* Added fsync()
 	* Started m68322
 </pre></ul>
 
diff --git a/fs/Makefile b/fs/Makefile
index 2691e9ff2e52f600c9f174064ba90f5516a3e9d3..4f2b1e5ba51d280072410206612ac4af7fe4cb63 100644
--- a/fs/Makefile
+++ b/fs/Makefile
@@ -42,7 +42,7 @@ AOBJS		= $(ASRCS:.S=$(OBJEXT))
 
 CSRCS		= fs_open.c fs_close.c fs_read.c fs_write.c fs_ioctl.c fs_dup.c \
 		  fs_opendir.c fs_closedir.c fs_readdir.c fs_readdirr.c \
-		  fs_seekdir.c fs_telldir.c fs_rewinddir.c fs_files.c \
+		  fs_seekdir.c fs_telldir.c fs_rewinddir.c fs_fsync.c fs_files.c \
 		  fs_inode.c fs_inodefind.c fs_inodefinddir.c fs_inodereserve.c \
 		  fs_inoderemove.c fs_registerdriver.c fs_unregisterdriver.c \
 		  fs_registerblockdriver.c fs_unregisterblockdriver.c \
diff --git a/fs/fs_fsync.c b/fs/fs_fsync.c
new file mode 100644
index 0000000000000000000000000000000000000000..7ae7f131b4747802be29dcfa6fb12345086c13b1
--- /dev/null
+++ b/fs/fs_fsync.c
@@ -0,0 +1,140 @@
+/****************************************************************************
+ * fs_fsync.c
+ *
+ *   Copyright (C) 2007 Gregory Nutt. All rights reserved.
+ *   Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ * 3. Neither the name Gregory Nutt nor the names of its contributors may be
+ *    used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <nuttx/fs.h>
+#include <nuttx/sched.h>
+
+#include "fs_internal.h"
+
+#if CONFIG_NFILE_DESCRIPTORS > 0
+
+/****************************************************************************
+ * Definitions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Variables
+ ****************************************************************************/
+
+/****************************************************************************
+ * Public Variables
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: fsync
+ *
+ * Description:
+ *   This func simply binds inode sync methods to the sync system call.
+ *
+ ****************************************************************************/
+
+int fsync(int fd)
+{
+  FAR struct filelist *list;
+  FAR struct file     *this_file;
+  struct inode        *inode;
+  int                  ret;
+
+  /* Get the thread-specific file list */
+
+  list = sched_getfiles();
+  if (!list)
+    {
+      ret = EMFILE;
+      goto errout;
+    }
+
+  /* Did we get a valid file descriptor? */
+
+  if ((unsigned int)fd >= CONFIG_NFILE_DESCRIPTORS)
+    {
+      ret = EBADF;
+      goto errout;
+    }
+
+  /* Was this file opened for write access? */
+
+  this_file = &list->fl_files[fd];
+  if ((this_file->f_oflags & O_WROK) == 0)
+    {
+      ret = EBADF;
+      goto errout;
+    }
+
+  /* Is this inode a registered mountpoint? Does it support the
+   * sync operations may be relevant to device drivers but only
+   * the mountpoint operations vtable contains a sync method.
+   */
+
+  inode = this_file->f_inode;
+  if (!inode || !INODE_IS_MOUNTPT(inode) ||
+      !inode->u.i_mops || !inode->u.i_mops->sync)
+    {
+      ret = EINVAL;
+      goto errout;
+    }
+
+  /* Yes, then tell the mountpoint to sync this file */
+
+  ret = inode->u.i_mops->sync(this_file);
+  if (ret >= 0)
+  {
+      return OK;
+  }
+  ret = -ret;
+
+ errout:
+  *get_errno_ptr() = ret;
+  return ERROR;
+}
+
+#endif /* CONFIG_NFILE_DESCRIPTORS */