Index: cpukit/libblock/src/blkdev-imfs.c
===================================================================
--- cpukit/libblock/src/blkdev-imfs.c	(revision fed66f991014f40430b256d44231a7828bb8a413)
+++ cpukit/libblock/src/blkdev-imfs.c	(revision 53da07e436df21f078de665d90442ee5c7166ab7)
@@ -76,4 +76,5 @@
 
   if (remaining >= 0) {
+    iop->offset += count;
     rv = (ssize_t) count;
   } else {
@@ -135,4 +136,5 @@
 
   if (remaining >= 0) {
+    iop->offset += count;
     rv = (ssize_t) count;
   } else {
Index: cpukit/libcsupport/include/rtems/libio.h
===================================================================
--- cpukit/libcsupport/include/rtems/libio.h	(revision fed66f991014f40430b256d44231a7828bb8a413)
+++ cpukit/libcsupport/include/rtems/libio.h	(revision 53da07e436df21f078de665d90442ee5c7166ab7)
@@ -787,4 +787,6 @@
  * @brief Reads from a node.
  *
+ * This handler is responsible to update the offset field of the IO descriptor.
+ *
  * @param[in, out] iop The IO pointer.
  * @param[out] buffer The buffer for read data.
@@ -804,4 +806,6 @@
 /**
  * @brief Writes to a node.
+ *
+ * This handler is responsible to update the offset field of the IO descriptor.
  *
  * @param[in, out] iop The IO pointer.
Index: cpukit/libcsupport/src/read.c
===================================================================
--- cpukit/libcsupport/src/read.c	(revision fed66f991014f40430b256d44231a7828bb8a413)
+++ cpukit/libcsupport/src/read.c	(revision 53da07e436df21f078de665d90442ee5c7166ab7)
@@ -23,5 +23,4 @@
 )
 {
-  ssize_t      rc;
   rtems_libio_t *iop;
 
@@ -36,10 +35,5 @@
    *  Now process the read().
    */
-  rc = (*iop->pathinfo.handlers->read_h)( iop, buffer, count );
-
-  if ( rc > 0 )
-    iop->offset += rc;
-
-  return rc;
+  return (*iop->pathinfo.handlers->read_h)( iop, buffer, count );
 }
 
Index: cpukit/libcsupport/src/readv.c
===================================================================
--- cpukit/libcsupport/src/readv.c	(revision fed66f991014f40430b256d44231a7828bb8a413)
+++ cpukit/libcsupport/src/readv.c	(revision 53da07e436df21f078de665d90442ee5c7166ab7)
@@ -107,5 +107,4 @@
 
     if ( bytes > 0 ) {
-      iop->offset += bytes;
       total       += bytes;
     }
Index: cpukit/libcsupport/src/sup_fs_deviceio.c
===================================================================
--- cpukit/libcsupport/src/sup_fs_deviceio.c	(revision fed66f991014f40430b256d44231a7828bb8a413)
+++ cpukit/libcsupport/src/sup_fs_deviceio.c	(revision 53da07e436df21f078de665d90442ee5c7166ab7)
@@ -73,4 +73,6 @@
   status = rtems_io_read( major, minor, &args );
   if ( status == RTEMS_SUCCESSFUL ) {
+    iop->offset += args.bytes_moved;
+
     return (ssize_t) args.bytes_moved;
   } else {
@@ -99,4 +101,6 @@
   status = rtems_io_write( major, minor, &args );
   if ( status == RTEMS_SUCCESSFUL ) {
+    iop->offset += args.bytes_moved;
+
     return (ssize_t) args.bytes_moved;
   } else {
Index: cpukit/libcsupport/src/write.c
===================================================================
--- cpukit/libcsupport/src/write.c	(revision fed66f991014f40430b256d44231a7828bb8a413)
+++ cpukit/libcsupport/src/write.c	(revision 53da07e436df21f078de665d90442ee5c7166ab7)
@@ -30,5 +30,4 @@
 )
 {
-  ssize_t  rc;
   rtems_libio_t     *iop;
 
@@ -43,9 +42,4 @@
    *  Now process the write() request.
    */
-  rc = (*iop->pathinfo.handlers->write_h)( iop, buffer, count );
-
-  if ( rc > 0 )
-    iop->offset += rc;
-
-  return rc;
+  return (*iop->pathinfo.handlers->write_h)( iop, buffer, count );
 }
Index: cpukit/libcsupport/src/writev.c
===================================================================
--- cpukit/libcsupport/src/writev.c	(revision fed66f991014f40430b256d44231a7828bb8a413)
+++ cpukit/libcsupport/src/writev.c	(revision 53da07e436df21f078de665d90442ee5c7166ab7)
@@ -114,5 +114,4 @@
 
     if ( bytes > 0 ) {
-      iop->offset += bytes;
       total       += bytes;
     }
Index: cpukit/libfs/src/dosfs/msdos_file.c
===================================================================
--- cpukit/libfs/src/dosfs/msdos_file.c	(revision fed66f991014f40430b256d44231a7828bb8a413)
+++ cpukit/libfs/src/dosfs/msdos_file.c	(revision 53da07e436df21f078de665d90442ee5c7166ab7)
@@ -118,4 +118,6 @@
     ret = fat_file_read(iop->pathinfo.mt_entry, fat_fd, iop->offset, count,
                         buffer);
+    if (ret > 0)
+        iop->offset += ret;
 
     rtems_semaphore_release(fs_info->vol_sema);
@@ -164,6 +166,7 @@
      * file was extended
      */
-    if (iop->offset + ret > fat_fd->fat_file_size)
-        fat_fd->fat_file_size = iop->offset + ret;
+    iop->offset += ret;
+    if (iop->offset > fat_fd->fat_file_size)
+        fat_fd->fat_file_size = iop->offset;
 
     rtems_semaphore_release(fs_info->vol_sema);
Index: cpukit/libfs/src/imfs/memfile.c
===================================================================
--- cpukit/libfs/src/imfs/memfile.c	(revision fed66f991014f40430b256d44231a7828bb8a413)
+++ cpukit/libfs/src/imfs/memfile.c	(revision 53da07e436df21f078de665d90442ee5c7166ab7)
@@ -122,8 +122,14 @@
 {
   IMFS_jnode_t   *the_jnode;
+  ssize_t         status;
 
   the_jnode = iop->pathinfo.node_access;
 
-  return IMFS_memfile_read( the_jnode, iop->offset, buffer, count );
+  status = IMFS_memfile_read( the_jnode, iop->offset, buffer, count );
+
+  if ( status > 0 )
+    iop->offset += status;
+
+  return status;
 }
 
@@ -148,4 +154,7 @@
 
   status = IMFS_memfile_write( the_jnode, iop->offset, buffer, count );
+
+  if ( status > 0 )
+    iop->offset += status;
 
   return status;
Index: cpukit/libfs/src/nfsclient/src/nfs.c
===================================================================
--- cpukit/libfs/src/nfsclient/src/nfs.c	(revision fed66f991014f40430b256d44231a7828bb8a413)
+++ cpukit/libfs/src/nfsclient/src/nfs.c	(revision 53da07e436df21f078de665d90442ee5c7166ab7)
@@ -2312,4 +2312,8 @@
 	} while (count > 0);
 
+	if (rv > 0) {
+		iop->offset = offset;
+	}
+
 	return rv;
 }
@@ -2419,4 +2423,6 @@
 
 	node->age = nowSeconds();
+
+	iop->offset += count;
 
 	return count;
Index: cpukit/libfs/src/rfs/rtems-rfs-rtems-file.c
===================================================================
--- cpukit/libfs/src/rfs/rtems-rfs-rtems-file.c	(revision fed66f991014f40430b256d44231a7828bb8a413)
+++ cpukit/libfs/src/rfs/rtems-rfs-rtems-file.c	(revision 53da07e436df21f078de665d90442ee5c7166ab7)
@@ -164,4 +164,7 @@
   }
 
+  if (read >= 0)
+    iop->offset = pos + read;
+
   rtems_rfs_rtems_unlock (rtems_rfs_file_fs (file));
 
@@ -221,5 +224,4 @@
       return rtems_rfs_rtems_error ("file-write: write append seek", rc);
     }
-    iop->offset = pos;
   }
 
@@ -251,4 +253,7 @@
     }
   }
+
+  if (write >= 0)
+    iop->offset = pos + write;
 
   rtems_rfs_rtems_unlock (rtems_rfs_file_fs (file));
