diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index bb8bf45d9145ca3ed14c7afe2105be6f9cdb554a..b3ac9e9e0685fb8e24a6759ff1e943cce71a5987 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2005-01-07  Bud Davis  <bdavis9659@comcast.net>
+
+	PR fortran/18398
+	* gfortran.dg/fmt_read.f90: New test.
+
 2005-01-06  Geoffrey Keating  <geoffk@apple.com>
 
 	* gcc.dg/rs6000-ldouble-2.c: New.
diff --git a/gcc/testsuite/gfortran.dg/fmt_read.f90 b/gcc/testsuite/gfortran.dg/fmt_read.f90
new file mode 100644
index 0000000000000000000000000000000000000000..3b33946a5231d23329b509cb5cafd0dc2f8366ea
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/fmt_read.f90
@@ -0,0 +1,11 @@
+! { dg-do run }
+! pr18398, missing data on sequential formatted reads
+! test contributed by Thomas.Koenig@online.de
+      open(7,status='scratch')
+      write (7,'(F12.5)') 1.0, 2.0, 3.0
+      rewind(7)
+      read(7,'(F15.5)') a,b
+!   note the read format is wider than the write
+      if (abs(a-1.0) .gt. 1e-5) call abort
+      if (abs(b-2.0) .gt. 1e-5) call abort
+      end
diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog
index f416be58eab1b5a05635221bffea256d35735365..805cab133a3c4a76b7303855f60a0483d19e6b71 100644
--- a/libgfortran/ChangeLog
+++ b/libgfortran/ChangeLog
@@ -1,3 +1,9 @@
+2005-01-07  Bud Davis  <bdavis9659@comcast.net>
+
+	PR fortran/18398
+	* transfer.c (next_record_r): always skip the
+	eol search if it was found during sf_read.
+
 2004-12-27  Tobias Schlueter  <tobias.schlueter@physik.uni-muenchen.de>
 
 	* libgfortran/libgfortran.h (GFC_UINTEGER_1, GFC_UINTEGER_2): 
diff --git a/libgfortran/io/transfer.c b/libgfortran/io/transfer.c
index fb673042432f5c56caad8a4f2697b7d63b56aa6c..d55110ad30bc0a01dfe718b08a6a22a86b3d03ad 100644
--- a/libgfortran/io/transfer.c
+++ b/libgfortran/io/transfer.c
@@ -1209,7 +1209,8 @@ next_record_r (int done)
 
     case FORMATTED_SEQUENTIAL:
       length = 1;
-      if (sf_seen_eor && done)
+      /* sf_read has already terminated input because of an '\n'  */
+      if (sf_seen_eor) 
          break;
 
       do