diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index fc7b98db907275ebe626a4528d00ba07334c9492..7bd5d1f69218bc0cefd2d92608e1107d340a86b5 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2006-03-25  Thomas Koenig  <Thomas.Koenig@online.de>
+
+	PR libfortran/26735
+	* gfortran.dg/convert_implied_open.f90:  New test case.
+
 2006-03-25  Thomas Koenig  <Thomas.Koenig@online.de>
 
 	PR fortran/26769
diff --git a/gcc/testsuite/gfortran.dg/convert_implied_open.f90 b/gcc/testsuite/gfortran.dg/convert_implied_open.f90
new file mode 100644
index 0000000000000000000000000000000000000000..4066f618cc223f50bd0312ad6a3c781c1caf0d54
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/convert_implied_open.f90
@@ -0,0 +1,15 @@
+! { dg-do run }
+! { dg-options "-fconvert=swap" }
+! PR 26735 - implied open didn't use to honor -fconvert
+program main
+  implicit none
+  integer (kind=8) :: i1, i2, i3
+  write (10) 1_8
+  close (10)
+  open (10, form="unformatted", access="direct", recl=8)
+  read (10,rec=1) i1
+  read (10,rec=2) i2
+  read (10,rec=3) i3
+  if (i1 /= 8 .or. i2 /= 1 .or. i3 /= 8) call abort
+  close (10,status="delete")
+end program main
diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog
index 99daa8de3e23db0331ff123845fa643f83b07761..136556af07e16bfe05b1ba7f70ee91bb75b426d0 100644
--- a/libgfortran/ChangeLog
+++ b/libgfortran/ChangeLog
@@ -1,3 +1,10 @@
+2006-03-25  Thomas Koenig  <Thomas.Koenig@online.de>
+
+	PR libfortran/26735
+	* io/transfer.c (data_transfer_init):  Set u_flags.convert
+	on an unopened unit if specified by environment variable
+	(via get_unformatted_convert) or by compile-time option.
+
 2006-03-25  Thomas Koenig  <Thomas.Koenig@online.de>
 
 	PR fortran/26769
diff --git a/libgfortran/io/transfer.c b/libgfortran/io/transfer.c
index 32e3881c27f790acc2a2e472ee90dc665b37a213..5f5f32303c9e3f31e6016c469e1adb7e870784ba 100644
--- a/libgfortran/io/transfer.c
+++ b/libgfortran/io/transfer.c
@@ -1390,6 +1390,8 @@ data_transfer_init (st_parameter_dt *dtp, int read_flag)
   if (dtp->u.p.current_unit->s == NULL)
   {  /* Open the unit with some default flags.  */
      st_parameter_open opp;
+     unit_convert conv;
+
      if (dtp->common.unit < 0)
      {
        close_unit (dtp->u.p.current_unit);
@@ -1413,6 +1415,35 @@ data_transfer_init (st_parameter_dt *dtp, int read_flag)
      u_flags.blank = BLANK_UNSPECIFIED;
      u_flags.pad = PAD_UNSPECIFIED;
      u_flags.status = STATUS_UNKNOWN;
+
+     conv = get_unformatted_convert (dtp->common.unit);
+
+     if (conv == CONVERT_NONE)
+       conv = compile_options.convert;
+
+     /* We use l8_to_l4_offset, which is 0 on little-endian machines
+	and 1 on big-endian machines.  */
+     switch (conv)
+       {
+       case CONVERT_NATIVE:
+       case CONVERT_SWAP:
+	 break;
+	 
+       case CONVERT_BIG:
+	 conv = l8_to_l4_offset ? CONVERT_NATIVE : CONVERT_SWAP;
+	 break;
+      
+       case CONVERT_LITTLE:
+	 conv = l8_to_l4_offset ? CONVERT_SWAP : CONVERT_NATIVE;
+	 break;
+	 
+       default:
+	 internal_error (&opp.common, "Illegal value for CONVERT");
+	 break;
+       }
+
+     u_flags.convert = conv;
+
      opp.common = dtp->common;
      opp.common.flags &= IOPARM_COMMON_MASK;
      dtp->u.p.current_unit = new_unit (&opp, dtp->u.p.current_unit, &u_flags);