[mpich-commits] [mpich] MPICH primary repository branch, master, updated. v3.1-207-g35b06fb

Service Account noreply at mpich.org
Wed Apr 30 22:17:03 CDT 2014


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "MPICH primary repository".

The branch, master has been updated
       via  35b06fb41a51c40479452183c8bb7645a98a73bc (commit)
       via  10925346e3e97bc9c91d44b8cd8ae63fc3bd6b53 (commit)
       via  1aa133142727633ec0e661ba71f388e1e8bebc01 (commit)
       via  fd3f06f6ad89c2d6ab52ac7148151463cd94ad97 (commit)
       via  8ceb188237d7f0c4a64aba28000b29f092271881 (commit)
       via  eb69afdce56750bf79eeaef3dfcce0eabd42a9a2 (commit)
       via  b7cd3b72bb2e888775ac71d8fd5e3e830c216c45 (commit)
       via  5633c4a247d4ea95bc9bb22fff741adb2774d768 (commit)
       via  19cca6bcacac84c163ed8065f8448a37ddd82828 (commit)
       via  4b0e47445df08261e8ca77c35b45ac6ba6aa41dd (commit)
       via  f653bd7cb8d8017578a105040d2ec8aec74af1fc (commit)
       via  c00d40083b0e6b5ab7a60251ba6b99a01cd3dfe6 (commit)
      from  2487b73e5e9b5160d75035d57e745827aaf3564b (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
http://git.mpich.org/mpich.git/commitdiff/35b06fb41a51c40479452183c8bb7645a98a73bc

commit 35b06fb41a51c40479452183c8bb7645a98a73bc
Author: Ken Raffenetti <raffenet at mcs.anl.gov>
Date:   Fri Apr 25 19:13:28 2014 -0500

    isolate F08 binding configure tests
    
    No review since F08 binding is experimental now.

diff --git a/configure.ac b/configure.ac
index 492e67d..8a19977 100644
--- a/configure.ac
+++ b/configure.ac
@@ -2172,7 +2172,6 @@ includebuild_dir=$includebuild_dir
 libbuild_dir=$libbuild_dir
 bashWorks=$bashWorks)
 
-f08_works=no
 if test "$enable_fc" = "yes" ; then
     if test "$enable_f77" != "yes" ; then
         AC_MSG_WARN([Fortran 90 requires Fortran 77])
@@ -2180,16 +2179,18 @@ if test "$enable_fc" = "yes" ; then
     else 
         bindingsubsystems="$bindingsubsystems src/binding/fortran/use_mpi"
         bindings="$bindings f90"
-
-	if test "$enable_f08" = "yes" ; then
-	   PAC_FC_2008_SUPPORT([f08_works=yes],[f08_works=no])
-	fi
     fi
 fi
+
+f08_works=no
+if test "$enable_f08" = "yes" ; then
+    PAC_FC_2008_SUPPORT([f08_works=yes],[f08_works=no])
+fi
 AM_CONDITIONAL([BUILD_F08_BINDING], [test "$f08_works" = "yes"])
 
 if test -n "$f08_works" ; then
     status_f08_works=1
+    bindings="$bindings f08"
 else
     status_f08_works=0
 fi

http://git.mpich.org/mpich.git/commitdiff/10925346e3e97bc9c91d44b8cd8ae63fc3bd6b53

commit 10925346e3e97bc9c91d44b8cd8ae63fc3bd6b53
Author: Ken Raffenetti <raffenet at mcs.anl.gov>
Date:   Wed Apr 23 18:00:39 2014 -0500

    update CHANGES for F08
    
    No review since F08 binding is experimental now.

diff --git a/CHANGES b/CHANGES
index c57a1e6..990437d 100644
--- a/CHANGES
+++ b/CHANGES
@@ -24,6 +24,9 @@
  # The old ROMIO optimization "deferred open" either stopped working or was
    disabled on several platforms.
 
+ # Fortran 2008 bindings (experimental). Build with --enable-fortran=all. Must have
+   a Fortran 2008 + TS 29113 capable compiler.
+
  # Several other minor bug fixes, memory leak fixes, and code cleanup.
 
    A full list of changes is available at the following link:

http://git.mpich.org/mpich.git/commitdiff/1aa133142727633ec0e661ba71f388e1e8bebc01

commit 1aa133142727633ec0e661ba71f388e1e8bebc01
Author: Pavan Balaji <balaji at anl.gov>
Date:   Mon Apr 21 13:11:22 2014 -0500

    build system fixes for f08
    
    No review since F08 binding is experimental now.

diff --git a/Makefile.am b/Makefile.am
index 4f0e7af..e895618 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -134,7 +134,7 @@ endif BUILD_F77_BINDING
 mpi_sources =
 mpi_f77_sources =
 mpi_fc_sources =
-mpi_f08_sources =
+mpi_fc_modules =
 mpi_cxx_sources =
 mpi_core_sources =
 
@@ -178,11 +178,9 @@ lib_lib at MPIFCLIBNAME@_la_CPPFLAGS += -DMPICH_MPI_FROM_PMPI -DUSE_ONLY_MPI_NAMES
 endif BUILD_PROFILING_LIB
 lib_lib at MPIFCLIBNAME@_la_SOURCES = $(mpi_f77_sources)
 if BUILD_FC_BINDING
+modinc_HEADERS = $(mpi_fc_modules)
 lib_lib at MPIFCLIBNAME@_la_SOURCES += $(mpi_fc_sources)
 endif BUILD_FC_BINDING
-if BUILD_F08_BINDING
-lib_lib at MPIFCLIBNAME@_la_SOURCES += $(mpi_f08_sources)
-endif BUILD_F08_BINDING
 lib_lib at MPIFCLIBNAME@_la_LDFLAGS = $(ABIVERSIONFLAGS)
 lib_lib at MPIFCLIBNAME@_la_LIBADD = lib/lib at MPILIBNAME@.la
 endif BUILD_F77_BINDING
diff --git a/confdb/aclocal_fc.m4 b/confdb/aclocal_fc.m4
index 1adcf2b..7b5fee1 100644
--- a/confdb/aclocal_fc.m4
+++ b/confdb/aclocal_fc.m4
@@ -1128,8 +1128,7 @@ AC_COMPILE_IFELSE([
 	AC_LANG_SOURCE(
 [[
 #include <ISO_Fortran_binding.h>
-]],
-[[
+
 int foo_c(CFI_cdesc_t * a_desc, CFI_cdesc_t * b_desc)
 {
 	char * a_row = (char*) a_desc->base_addr;
diff --git a/configure.ac b/configure.ac
index 6991fe6..492e67d 100644
--- a/configure.ac
+++ b/configure.ac
@@ -2182,8 +2182,6 @@ if test "$enable_fc" = "yes" ; then
         bindings="$bindings f90"
 
 	if test "$enable_f08" = "yes" ; then
-	   f08_works=yes
-	elif test "$enable_f08" = "auto" ; then
 	   PAC_FC_2008_SUPPORT([f08_works=yes],[f08_works=no])
 	fi
     fi
diff --git a/src/binding/fortran/use_mpi/buildiface b/src/binding/fortran/use_mpi/buildiface
index ada480c..8159e69 100755
--- a/src/binding/fortran/use_mpi/buildiface
+++ b/src/binding/fortran/use_mpi/buildiface
@@ -1012,19 +1012,16 @@ createModSteps('src/binding/fortran/use_mpi/$(MPIBASEMOD).$(MOD)',
 
 ## shouldn't be necessary, now the deps should be right...
 # avoid dependency problems and attain an effect similar to simplemake's "all-preamble"
-#BUILT_SOURCES += \$(mpi_f90_modules)
+#BUILT_SOURCES += \$(mpi_fc_modules)
 
 print MAKEFD <<EOT;
 
-mpi_f90_modules = \\
+mpi_fc_modules += \\
     src/binding/fortran/use_mpi/\$(MPIMOD).\$(MOD) \\
     src/binding/fortran/use_mpi/\$(MPISIZEOFMOD).\$(MOD) \\
     src/binding/fortran/use_mpi/\$(MPICONSTMOD).\$(MOD) \\
     src/binding/fortran/use_mpi/\$(MPIBASEMOD).\$(MOD)
 
-# the modules are effectively precompiled headers for Fortran programs
-modinc_HEADERS = \$(mpi_f90_modules)
-
 # We need a free-format version of mpif.h with no external commands,
 # including no wtime/wtick (removing MPI_WTICK also removes MPI_WTIME,
 # but leave MPI_WTIME_IS_GLOBAL).
@@ -1042,7 +1039,7 @@ CLEANFILES += src/binding/fortran/use_mpi/mpifnoext.h
 EOT
 
 print MAKEFD "MAINTAINERCLEANFILES += \$(mpi_sources) fproto.h\n";
-print MAKEFD "CLEANFILES += \$(mpi_f90_modules)\n";
+print MAKEFD "CLEANFILES += \$(mpi_fc_modules)\n";
 print MAKEFD "\n";
 
 #print MAKEFD "install_BIN     = mpifort\n";
diff --git a/src/binding/fortran/use_mpi_f08/buildiface b/src/binding/fortran/use_mpi_f08/buildiface
index 4e8c16f..0d879ca 100755
--- a/src/binding/fortran/use_mpi_f08/buildiface
+++ b/src/binding/fortran/use_mpi_f08/buildiface
@@ -95,52 +95,91 @@ if BUILD_F08_BINDING
 
 EOT
 
-print $makefile_fh "AM_FCFLAGS += \@FCINCFLAG\@$cur_dir\n\n";
+print $makefile_fh "AM_FCFLAGS += \@FCINCFLAG\@src/binding/fortran/use_mpi\n\n";
 
-print $makefile_fh "mpi_f08_sources += \\\n";
- at files = glob("*mpi_f08*.F90");
-for (my $i=0; $i<=$#files; $i++) {
-    print $makefile_fh "\t$cur_dir/$files[$i]";
-    if ($i != $#files) {
-        print $makefile_fh " \\\n";
-    } else {
-        print $makefile_fh "\n\n";
-    }
+print $makefile_fh  <<EOT;
+
+mpi_fc_sources += \\
+	src/binding/fortran/use_mpi_f08/pmpi_f08.F90 \\
+	src/binding/fortran/use_mpi_f08/mpi_f08.F90 \\
+	src/binding/fortran/use_mpi_f08/mpi_f08_callbacks.F90 \\
+	src/binding/fortran/use_mpi_f08/mpi_f08_compile_constants.F90 \\
+	src/binding/fortran/use_mpi_f08/mpi_f08_link_constants.F90 \\
+	src/binding/fortran/use_mpi_f08/mpi_f08_types.F90 \\
+	src/binding/fortran/use_mpi_f08/mpi_c_interface_cdesc.F90 \\
+	src/binding/fortran/use_mpi_f08/mpi_c_interface_glue.F90 \\
+	src/binding/fortran/use_mpi_f08/mpi_c_interface_nobuf.F90 \\
+	src/binding/fortran/use_mpi_f08/mpi_c_interface_types.F90 \\
+	src/binding/fortran/use_mpi/pmpi_f08.\$(MOD) \\
+	src/binding/fortran/use_mpi/mpi_f08.\$(MOD) \\
+	src/binding/fortran/use_mpi/mpi_f08_callbacks.\$(MOD) \\
+	src/binding/fortran/use_mpi/mpi_f08_compile_constants.\$(MOD) \\
+	src/binding/fortran/use_mpi/mpi_f08_link_constants.\$(MOD) \\
+	src/binding/fortran/use_mpi/mpi_f08_types.\$(MOD)
+
+EOT
+
+print $makefile_fh "mpi_fc_modules += src/binding/fortran/use_mpi/mpi_f08.\$(MOD)\n\n";
+
+my %f08_mods = (
+    "mpi_c_interface" => "mpi_c_interface_cdesc",
+    "mpi_c_interface_cdesc" => "mpi_c_interface_nobuf",
+    "mpi_c_interface_nobuf" => "mpi_c_interface_glue",
+    "mpi_c_interface_glue" => "mpi_f08",
+    "mpi_f08" => "pmpi_f08",
+    "pmpi_f08" => "mpi_f08_link_constants",
+    "mpi_f08_link_constants" => "mpi_f08_callbacks",
+    "mpi_f08_callbacks" => "mpi_f08_compile_constants",
+    "mpi_f08_compile_constants" => "mpi_f08_types",
+    "mpi_f08_types" => "mpi_c_interface_types",
+    "mpi_c_interface_types" => "",
+    );
+
+print $makefile_fh "BUILT_SOURCES += ";
+foreach my $x (keys %f08_mods) {
+    print $makefile_fh "src/binding/fortran/use_mpi/$x.\$(MOD) ";
 }
+print $makefile_fh "\n\n";
 
-print $makefile_fh "mpi_f08_sources += \\\n";
- at files = glob("*mpi_f08*.F90");
-for (my $i=0; $i<=$#files; $i++) {
-    my $file = $files[$i];
-    $file =~ s{.*/}{};      # removes path
-    $file =~ s{\.[^.]+$}{}; # removes extension
-    print $makefile_fh "\t$cur_dir/$file.\$(MOD)";
-    if ($i != $#files) { print $makefile_fh " \\\n"; } else { print $makefile_fh "\n\n"; }
+print $makefile_fh "CLEANFILES += ";
+foreach my $x (keys %f08_mods) {
+    print $makefile_fh "src/binding/fortran/use_mpi/$x.\$(MOD) ";
 }
+print $makefile_fh "\n\n";
 
-print $makefile_fh "modinc_HEADERS = \$(mpi_f08_modules)\n\n";
+foreach my $x (keys %f08_mods) {
+    print $makefile_fh "src/binding/fortran/use_mpi/$x.\$(MOD) src/binding/fortran/use_mpi_f08/$x.lo:";
+    if ($f08_mods{$x}) {print $makefile_fh " src/binding/fortran/use_mpi/$f08_mods{$x}.\$(MOD)";}
+    print $makefile_fh "\n";
+    print $makefile_fh "\t\$(mod_verbose)\$(FC_COMPILE_MODS) -c src/binding/fortran/use_mpi_f08/`echo \$\@ | cut -f1 -d '.' | sed -e 's+.*/++g'`.F90 -o src/binding/fortran/use_mpi_f08/`echo \$\@ | cut -f1 -d '.' | sed -e 's+.*/++g'`.lo\n\n";
+}
 
-print $makefile_fh "mpi_f08_sources += \\\n";
- at files = glob("mpi_c_interface_*.F90");
+print $makefile_fh "mpi_fc_sources += \\\n";
+ at files = glob("$wrappers_f_dir/*.F90");
 for (my $i=0; $i<=$#files; $i++) {
     print $makefile_fh "\t$cur_dir/$files[$i]";
     if ($i != $#files) { print $makefile_fh " \\\n"; } else { print $makefile_fh "\n\n"; }
 }
 
-print $makefile_fh "mpi_f08_sources += \\\n";
- at files = glob("$wrappers_f_dir/*.F90");
 for (my $i=0; $i<=$#files; $i++) {
-    print $makefile_fh "\t$cur_dir/$files[$i]";
-    if ($i != $#files) { print $makefile_fh " \\\n"; } else { print $makefile_fh "\n\n"; }
+    my $fname = $files[$i];
+    $fname =~ s/\.F90/.lo/g;
+    print $makefile_fh "$cur_dir/$fname: src/binding/fortran/use_mpi/mpi_f08.\$(MOD) src/binding/fortran/use_mpi/mpi_c_interface.\$(MOD)\n\n";
 }
 
-print $makefile_fh "mpi_core_sources += \\\n";
+print $makefile_fh "mpi_fc_sources += \\\n";
 @files = glob("$pmpi_dir/*.F90");
 for (my $i=0; $i<=$#files; $i++) {
     print $makefile_fh "\t$cur_dir/$files[$i]";
     if ($i != $#files) { print $makefile_fh " \\\n"; } else { print $makefile_fh "\n\n"; }
 }
 
+for (my $i=0; $i<=$#files; $i++) {
+    my $fname = $files[$i];
+    $fname =~ s/\.F90/.lo/g;
+    print $makefile_fh "$cur_dir/$fname: src/binding/fortran/use_mpi/mpi_f08.\$(MOD) src/binding/fortran/use_mpi/mpi_c_interface.\$(MOD)\n\n";
+}
+
 print $makefile_fh "include \$(top_srcdir)/src/binding/fortran/use_mpi_f08/wrappers_c/Makefile.mk\n\n";
 
 print $makefile_fh "endif BUILD_F08_BINDING\n";
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_c/buildiface b/src/binding/fortran/use_mpi_f08/wrappers_c/buildiface
index f3b3f1a..4c8987e 100755
--- a/src/binding/fortran/use_mpi_f08/wrappers_c/buildiface
+++ b/src/binding/fortran/use_mpi_f08/wrappers_c/buildiface
@@ -175,7 +175,7 @@ unless (-e "Makefile.mk") {
 EXTRA_DIST += src/binding/fortran/use_mpi_f08/wrappers_c/buildiface
 
 if BUILD_F08_BINDING
-mpi_f08_sources += \\
+mpi_fc_sources += \\
 EOT
 } else {
     open(MAKEFD, ">>Makefile.mk") || die "Could not open Makefile.mk\n";
diff --git a/test/mpi/configure.ac b/test/mpi/configure.ac
index a0f524d..10e61ee 100644
--- a/test/mpi/configure.ac
+++ b/test/mpi/configure.ac
@@ -1181,16 +1181,9 @@ AM_CONDITIONAL([BUILD_F90_TESTS],[test "X$f90dir" = "f90"])
 
 f08dir="#"
 AC_SUBST(f08dir)
-# Determine if tests for Fortran 2008 should be run.
-if test "$enable_f08" = "yes" ; then
-    otherlangs="$otherlangs f08"
-    f08dir=f08
-elif test "$enable_f08" = "auto" ; then
-    # FIXME add a test to compile a Fortran 2008 MPI program
-    PAC_FC_2008_SUPPORT([
-        otherlangs="$otherlangs f08"
-        f08dir=f08
-    ],[no])
+# FIXME if $FROM_MPICH is no, we should test build an MPI F08 program
+if test "$enable_f08" = "yes" -a "$FROM_MPICH" = "yes" ; then
+   f08dir=f08
 fi
 
 # Running C++ compiler tests
@@ -1605,6 +1598,8 @@ AC_OUTPUT(maint/testmerge \
           errors/f77/io/iooffset.h \
           errors/f90/Makefile \
 	  errors/f90/io/Makefile \
+          errors/f08/Makefile \
+	  errors/f08/io/Makefile \
 	  ckpoint/Makefile \
 	  ft/Makefile \
           manual/Makefile \
diff --git a/test/mpi/errors/Makefile.am b/test/mpi/errors/Makefile.am
index 3339885..760e420 100644
--- a/test/mpi/errors/Makefile.am
+++ b/test/mpi/errors/Makefile.am
@@ -11,6 +11,6 @@ include $(top_srcdir)/Makefile.mtest
 # simplemake version for some reason and is also missing from the testlist
 # file
 static_subdirs = attr coll comm datatype group pt2pt rma topo basic faults
-all_lang_subdirs = cxx f77 f90
+all_lang_subdirs = cxx f77 f90 f08
 SUBDIRS = $(static_subdirs) $(iodir) $(otherlangs) $(spawndir)
 DIST_SUBDIRS = $(static_subdirs) io $(all_lang_subdirs) spawn
diff --git a/test/mpi/errors/f08/Makefile.am b/test/mpi/errors/f08/Makefile.am
new file mode 100644
index 0000000..e02c716
--- /dev/null
+++ b/test/mpi/errors/f08/Makefile.am
@@ -0,0 +1,13 @@
+# -*- Mode: Makefile; -*-
+# vim: set ft=automake :
+#
+# (C) 2011 by Argonne National Laboratory.
+#     See COPYRIGHT in top-level directory.
+#
+
+include $(top_srcdir)/Makefile_f08.mtest
+
+EXTRA_DIST = testlist
+
+SUBDIRS = @iodir@
+DIST_SUBDIRS = io
diff --git a/test/mpi/errors/f08/io/Makefile.am b/test/mpi/errors/f08/io/Makefile.am
new file mode 100644
index 0000000..77a6d75
--- /dev/null
+++ b/test/mpi/errors/f08/io/Makefile.am
@@ -0,0 +1,19 @@
+# This Makefile.am generated automatically by f77tof90
+# from test/mpi/errors/f77/io/Makefile.am.  DO NOT EDIT
+# -*- Mode: Makefile; -*-
+# vim: set ft=automake :
+#
+# (C) 2011 by Argonne National Laboratory.
+#     See COPYRIGHT in top-level directory.
+#
+
+include $(top_srcdir)/Makefile_f08.mtest
+
+EXTRA_DIST = testlist
+
+AM_DEFAULT_SOURCE_EXT = .f90
+
+## for all programs that are just built from the single corresponding source
+## file, we don't need per-target _SOURCES rules, automake will infer them
+## correctly
+noinst_PROGRAMS = uerrhandf08
diff --git a/test/mpi/errors/f08/io/testlist b/test/mpi/errors/f08/io/testlist
new file mode 100644
index 0000000..9d40491
--- /dev/null
+++ b/test/mpi/errors/f08/io/testlist
@@ -0,0 +1 @@
+uerrhandf08 1
diff --git a/test/mpi/errors/f08/io/uerrhandf08.f90 b/test/mpi/errors/f08/io/uerrhandf08.f90
new file mode 100644
index 0000000..5f85fa6
--- /dev/null
+++ b/test/mpi/errors/f08/io/uerrhandf08.f90
@@ -0,0 +1,146 @@
+! This file created from test/mpi/errors/f77/io/uerrhandf.f with f77tof90
+! -*- Mode: Fortran; -*-
+!
+!  (C) 2013 by Argonne National Laboratory.
+!      See COPYRIGHT in top-level directory.
+!
+      program main
+      use mpi_f08
+      integer (kind=MPI_ADDRESS_KIND) asize
+
+      integer (kind=MPI_OFFSET_KIND) offset
+
+      integer ierr, rank, i
+      integer errs
+      external comm_errh_fn, win_errh_fn, file_errh_fn
+      TYPE(MPI_Errhandles) comm_errh, win_errh, file_errh
+      integer winbuf(2), wdsize, sizeofint, id
+      TYPE(MPI_Win) winh
+      TYPE(MPI_Comm) wdup
+      integer fh
+      TYPE(MPI_Status) status
+      common /ec/ iseen
+      integer iseen(3)
+      save /ec/
+
+      iseen(1) = 0
+      iseen(2) = 0
+      iseen(3) = 0
+      ierr = -1
+      errs = 0
+      call mtest_init( ierr )
+
+      call mpi_type_size( MPI_INTEGER, sizeofint, ierr )
+
+      call mpi_comm_create_errhandler( comm_errh_fn, comm_errh, ierr )
+      if (ierr .ne. MPI_SUCCESS) then
+         call mtestprinterrormsg( "Comm_create_errhandler:", ierr )
+         errs = errs + 1
+      endif
+      call mpi_win_create_errhandler( win_errh_fn, win_errh, ierr )
+      if (ierr .ne. MPI_SUCCESS) then
+         call mtestprinterrormsg( "Win_create_errhandler:", ierr )
+         errs = errs + 1
+      endif
+      call mpi_file_create_errhandler( file_errh_fn, file_errh, ierr )
+      if (ierr .ne. MPI_SUCCESS) then
+         call mtestprinterrormsg( "File_create_errhandler:", ierr )
+         errs = errs + 1
+      endif
+!
+      call mpi_comm_dup( MPI_COMM_WORLD, wdup, ierr )
+      call mpi_comm_set_errhandler( wdup, comm_errh, ierr )
+      call mpi_comm_size( wdup, wdsize, ierr )
+      call mpi_send( id, 1, MPI_INTEGER, wdsize, -37, wdup, ierr )
+      if (ierr .eq. MPI_SUCCESS) then
+         print *, ' Failed to detect error in use of MPI_SEND'
+         errs = errs + 1
+      else
+         if (iseen(1) .ne. 1) then
+            errs = errs + 1
+            print *, ' Failed to increment comm error counter'
+         endif
+      endif
+
+      asize = 2*sizeofint
+      call mpi_win_create( winbuf, asize, sizeofint, MPI_INFO_NULL &
+      &     , wdup, winh, ierr )
+      if (ierr .ne. MPI_SUCCESS) then
+         call mtestprinterrormsg( "Win_create:", ierr )
+         errs = errs + 1
+      endif
+      call mpi_win_set_errhandler( winh, win_errh, ierr )
+      asize = 0
+      call mpi_put( winbuf, 1, MPI_INT, wdsize, asize, 1, MPI_INT, winh, &
+      &     ierr )
+      if (ierr .eq. MPI_SUCCESS) then
+         print *, ' Failed to detect error in use of MPI_PUT'
+         errs = errs + 1
+      else
+         if (iseen(3) .ne. 1) then
+            errs = errs + 1
+            print *, ' Failed to increment win error counter'
+         endif
+      endif
+
+      call mpi_file_open( MPI_COMM_SELF, 'ftest', MPI_MODE_CREATE + &
+      &     MPI_MODE_RDWR + MPI_MODE_DELETE_ON_CLOSE, MPI_INFO_NULL, fh, &
+      &     ierr )
+      if (ierr .ne. MPI_SUCCESS) then
+         call mtestprinterrormsg( "File_open:", ierr )
+         errs = errs + 1
+      endif
+      call mpi_file_set_errhandler( fh, file_errh, ierr )
+      offset = -100
+      call mpi_file_read_at( fh, offset, winbuf, 1, MPI_INTEGER, status, &
+      &     ierr )
+      if (ierr .eq. MPI_SUCCESS) then
+         print *, ' Failed to detect error in use of MPI_PUT'
+         errs = errs + 1
+      else
+         if (iseen(2) .ne. 1) then
+            errs = errs + 1
+            print *, ' Failed to increment file error counter'
+         endif
+      endif
+
+      call mpi_comm_free( wdup, ierr )
+      call mpi_win_free( winh, ierr )
+      call mpi_file_close( fh, ierr )
+
+      call mpi_errhandler_free( win_errh, ierr )
+      call mpi_errhandler_free( comm_errh, ierr )
+      call mpi_errhandler_free( file_errh, ierr )
+
+      call mtest_finalize( errs )
+      call mpi_finalize( ierr )
+      end
+!
+      subroutine comm_errh_fn( comm, ec )
+      integer comm, ec
+      common /ec/ iseen
+      integer iseen(3)
+      save /ec/
+!
+      iseen(1) = iseen(1) + 1
+!
+      end
+!
+      subroutine win_errh_fn( win, ec )
+      integer win, ec
+      common /ec/ iseen
+      integer iseen(3)
+      save /ec/
+!
+      iseen(3) = iseen(3) + 1
+!
+      end
+      subroutine file_errh_fn( fh, ec )
+      integer fh, ec
+      common /ec/ iseen
+      integer iseen(3)
+      save /ec/
+!
+      iseen(2) = iseen(2) + 1
+!
+      end
diff --git a/test/mpi/errors/f08/testlist b/test/mpi/errors/f08/testlist
new file mode 100644
index 0000000..5de3989
--- /dev/null
+++ b/test/mpi/errors/f08/testlist
@@ -0,0 +1 @@
+io
diff --git a/test/mpi/f08/rma/winattrf90.f90 b/test/mpi/f08/rma/winattrf08.f90
similarity index 100%
rename from test/mpi/f08/rma/winattrf90.f90
rename to test/mpi/f08/rma/winattrf08.f90

http://git.mpich.org/mpich.git/commitdiff/fd3f06f6ad89c2d6ab52ac7148151463cd94ad97

commit fd3f06f6ad89c2d6ab52ac7148151463cd94ad97
Author: Ken Raffenetti <raffenet at mcs.anl.gov>
Date:   Tue Apr 15 10:39:10 2014 -0500

    convert f90 tests to f08
    
    Copies a sampling of tests from the f90 directory and converts them
    to use the f08 bindings.
    
    No review since it is experimental.

diff --git a/test/mpi/.gitignore b/test/mpi/.gitignore
index 64552b0..d4b846f 100644
--- a/test/mpi/.gitignore
+++ b/test/mpi/.gitignore
@@ -398,6 +398,46 @@
 /f90/topo/Makefile.sm
 /f90/topo/testlist
 /f90/topo/cartcrf90.f90
+/f08/ring_usempif08
+/f08/hello_usempif08
+/f08/pt2pt/statusesf08
+/f08/pt2pt/allpairf08
+/f08/pt2pt/greqf08
+/f08/pt2pt/dummyf08
+/f08/pt2pt/mprobef08
+/f08/coll/uallreducef08
+/f08/coll/exscanf08
+/f08/coll/alltoallwf08
+/f08/coll/inplacef08
+/f08/coll/allredint8f08
+/f08/coll/allredopttf08
+/f08/coll/reducelocalf08
+/f08/coll/alltoallvf08
+/f08/coll/redscatf08
+/f08/coll/split_typef08
+/f08/coll/nonblockingf08
+/f08/coll/vw_inplacef08
+/f08/coll/red_scat_blockf08
+/f08/coll/nonblocking_inpf08
+/f08/datatype/typenamef08
+/f08/datatype/typesnamef08
+/f08/datatype/typecntsf08
+/f08/datatype/typesubf08
+/f08/datatype/typem2f08
+/f08/datatype/gaddressf08
+/f08/datatype/packef08
+/f08/datatype/allctypesf08
+/f08/datatype/hindex1f08
+/f08/datatype/hindexed_blockf08
+/f08/datatype/typename3f08
+/f08/datatype/structf
+/f08/datatype/indtype
+/f08/datatype/createf08
+/f08/datatype/sizeof
+/f08/datatype/kinds
+/f08/datatype/trf08
+/f08/datatype/get_elem_d
+/f08/datatype/get_elem_u
 /group/errstring
 /group/grouptest
 /group/groupcreate
diff --git a/test/mpi/configure.ac b/test/mpi/configure.ac
index 3f18211..a0f524d 100644
--- a/test/mpi/configure.ac
+++ b/test/mpi/configure.ac
@@ -1555,6 +1555,12 @@ AC_OUTPUT(maint/testmerge \
 	  f90/profile/Makefile \
 	  f08/Makefile \
 	  f08/util/Makefile \
+	  f08/pt2pt/Makefile \
+	  f08/coll/Makefile \
+	  f08/datatype/Makefile \
+	  f08/attr/Makefile \
+	  f08/comm/Makefile \
+	  f08/rma/Makefile \
           cxx/Makefile \
           cxx/util/Makefile \
           cxx/attr/Makefile \
diff --git a/test/mpi/f08/attr/Makefile.am b/test/mpi/f08/attr/Makefile.am
new file mode 100644
index 0000000..8b59fd5
--- /dev/null
+++ b/test/mpi/f08/attr/Makefile.am
@@ -0,0 +1,37 @@
+# This Makefile.am generated automatically by f77tof90
+# from test/mpi/f77/attr/Makefile.am.  DO NOT EDIT
+# -*- Mode: Makefile; -*-
+# vim: set ft=automake :
+#
+# (C) 2011 by Argonne National Laboratory.
+#     See COPYRIGHT in top-level directory.
+#
+
+include $(top_srcdir)/Makefile_f08.mtest
+
+EXTRA_DIST = testlist
+
+# avoid having to write many "foo_SOURCES = foo.f90" lines
+AM_DEFAULT_SOURCE_EXT = .f90
+
+noinst_PROGRAMS =                   \
+    attrmpi1f08                       \
+    baseattrf08 baseattr2f08            \
+    commattrf08 commattr2f08 commattr3f08 \
+    typeattrf08 typeattr2f08 typeattr3f08
+
+## attraints.h will be distributed because it's listed in AC_CONFIG_FILES/AC_OUTPUT
+
+# ensure that "{comm,type}attr*f.o" will be rebuilt when attraints.h is updated
+
+
+## vim: set ft=automake :
+
+noinst_PROGRAMS += fandcattrf08 baseattr3f08 attrlangf08
+fandcattrf08_SOURCES = fandcattrf08.f90 fandcattrc.c
+baseattr3f08_SOURCES = baseattr3f08.f90
+attrlangf08_SOURCES = attrlangf08.f90 attrlangc.c
+
+# Remove any created module files, if we know the extension of those files
+clean-local:
+	if [ "@FCMODEXT@" != "" ] ; then rm -f *. at FCMODEXT@ ; fi
diff --git a/test/mpi/f08/attr/attrlangc.c b/test/mpi/f08/attr/attrlangc.c
new file mode 100644
index 0000000..a228b13
--- /dev/null
+++ b/test/mpi/f08/attr/attrlangc.c
@@ -0,0 +1,628 @@
+/* -*- Mode: C; c-basic-offset:4 ; -*- */
+/*
+ *
+ *  (C) 2012 by Argonne National Laboratory.
+ *      See COPYRIGHT in top-level directory.
+ */
+
+#include <stdio.h>
+#include "mpi.h"
+#include <stdlib.h>
+#include <string.h>
+#include "../../include/mpitestconf.h"
+
+/* Used to convert Fortran strings (which may not be null terminated) to
+   C strings */
+#define MAX_ATTRTEST_MSG 256
+
+/*
+ * FIXME: This code assumes that character strings are passed from Fortran
+ * by placing the string length, as an int, at the end of the argument list
+ * This is common but not universal.
+ */
+
+/*
+   Name mapping.  All routines are created with names that are lower case
+   with a single trailing underscore.  This matches many compilers.
+   We use #define to change the name for Fortran compilers that do
+   not use the lowercase/underscore pattern
+*/
+
+#ifdef F77_NAME_UPPER
+#define cattrinit_   CATTRINIT
+#define cgetenvbool_ CGETENVBOOL
+#define cgetsizes_   CGETSIZES
+#define ccreatekeys_ CCREATEKEYS
+#define cfreekeys_   CFREEKEYS
+#define ctoctest_    CTOCTEST
+#define cmpif1read_  CMPIF1READ
+#define cmpif2read_  CMPIF2READ
+#define cmpif2readtype_  CMPIF2READTYPE
+#define cmpif2readwin_   CMPIF2READWIN
+#define csetmpi_     CSETMPI
+#define csetmpi2_    CSETMPI2
+#define csetmpitype_ CSETMPITYPE
+#define csetmpiwin_  CSETMPIWIN
+
+#elif defined(F77_NAME_LOWER) || defined(F77_NAME_MIXED)
+/* Mixed is ok because we use lowercase in all uses */
+#define cattrinit_   cattrinit
+#define cgetenvbool_ cgetenvbool
+#define cgetsizes_   cgetsizes
+#define ccreatekeys_ ccreatekeys
+#define cfreekeys_   cfreekeys
+#define ctoctest_    ctoctest
+#define cmpif1read_  cmpif1read
+#define cmpif2read_  cmpif2read
+#define cmpif2readtype_  cmpif2readtype
+#define cmpif2readwin_   cmpif2readwin
+#define csetmpi_     csetmpi
+#define csetmpi2_    csetmpi2
+#define csetmpitype_ csetmpitype
+#define csetmpiwin_  csetmpiwin
+
+#elif defined(F77_NAME_LOWER_2USCORE) || defined(F77_NAME_LOWER_USCORE) || \
+      defined(F77_NAME_MIXED_USCORE)
+/* Else leave name alone (routines have no underscore, so both
+   of these map to a lowercase, single underscore) */
+#else
+#error 'Unrecognized Fortran name mapping'
+#endif
+
+/* */
+static int ccomm1Key, ccomm2Key, ctype2Key, cwin2Key;
+static int ccomm1Extra, ccomm2Extra, ctype2Extra, cwin2Extra;
+static int verbose = 0;
+
+/* Forward references */
+int cmpi1read( MPI_Comm comm, int key, void *expected, const char *msg );
+int cmpi2read( MPI_Comm comm, int key, void *expected, const char *msg );
+int cmpi2readtype( MPI_Datatype dtype, int key, void *expected, const char *msg );
+
+void ccompareint2aint_( MPI_Fint *in1, MPI_Aint *in2, MPI_Fint *result );
+void ccompareint2void_( MPI_Fint *in1, void *in2, MPI_Fint *result );
+void ccompareaint2void_( MPI_Aint *in1, void *in2, MPI_Fint *result );
+
+/* ----------------------------------------------------------------------- */
+/* Initialization functions                                                */
+/* ----------------------------------------------------------------------- */
+void cgetenvbool_( const char str[], MPI_Fint *val, int d )
+{
+    const char *envval;
+    char  envname[1024];
+    /* Note that the Fortran string may not be null terminated; thus
+       we copy d characters and add a null just in case */
+    if (d > sizeof(envname)-1) {
+	fprintf( stderr, "Environment variable name too long (%d)\n", d );
+	MPI_Abort( MPI_COMM_WORLD, 1 );
+    }
+    strncpy( envname, str, d );
+    envname[d] = 0;
+
+    envval = getenv( envname );
+    *val = 0;
+    if (envval) {
+	printf( " envval = %s\n", envval );
+	if (strcmp(envval,"yes") == 0 || strcmp(envval,"YES") == 0 ||
+	    strcmp(envval,"true") == 0 || strcmp(envval,"TRUE") == 0 )
+	    *val = 1;
+    }
+}
+
+/* Keep our own copy of the "is verbose" state */
+void cattrinit_( MPI_Fint *fverbose )
+{
+    verbose = (int)*fverbose;
+}
+
+/* Provide attribute sizes (C, Fortran 1, Fortran 2) */
+void cgetsizes_( MPI_Fint *ptrSize, MPI_Fint *intSize, MPI_Fint *aintSize )
+{
+    *ptrSize  = (MPI_Fint) sizeof(void*);
+    *intSize  = (MPI_Fint) sizeof(MPI_Fint);
+    *aintSize = (MPI_Fint) sizeof(MPI_Aint);
+}
+
+/* ----------------------------------------------------------------------- */
+/* Copy and delete functions attached to keyvals                           */
+/* ----------------------------------------------------------------------- */
+static int CMPI1_COPY_FN( MPI_Comm comm, int keyval, void *extra,
+		      void *inval, void *outval, int *flag )
+{
+    int inValue = *(int *)inval;
+
+    if (verbose) printf( " In C MPI-1 copy function: inval = %p, extra = %p\n",
+			 inval, extra );
+    *flag = 1;
+    /* We don't change the attribute */
+    *(void **)outval = inval;
+    /* But we do change what it points at */
+    *(int*)inval     = inValue + 1;
+    return MPI_SUCCESS;
+}
+static int CMPI1_DELETE_FN( MPI_Comm comm, int keyval, void *outval,
+			void *extra )
+{
+    if (verbose) printf( " In C MPI-1 delete function, extra = %p\n", extra );
+    *(int*)outval = *(int*)outval - 1;
+    return MPI_SUCCESS;
+}
+
+static int TYPE_COPY_FN( MPI_Datatype dtype, int keyval, void *extra,
+			 void *inval, void *outval, int *flag )
+{
+    int inValue = *(int *)inval;
+
+    if (verbose)
+	printf( " In C MPI type copy function, inval = %p, extra = %p\n",
+		inval, extra );
+    *flag = 1;
+    /* We don't change the attribute */
+    *(void **)outval = inval;
+    /* But we do change what it points at */
+    *(int*)inval     = inValue + 1;
+    return MPI_SUCCESS;
+}
+static int TYPE_DELETE_FN( MPI_Datatype dtype, int keyval, void *outval,
+			   void *extra )
+{
+    if (verbose) printf( " In C MPI type delete function, extra = %p\n", extra );
+    /* We reverse the incrment used in copy (checked after free of the type) */
+    *(int*)outval = *(int*)outval - 1;
+    return MPI_SUCCESS;
+}
+
+/* Note that this function cannot be called in MPI since there is no
+   win_dup function */
+static int WIN_COPY_FN( MPI_Win win, int keyval, void *extra,
+			void *inval, void *outval, int *flag )
+{
+    int inValue = *(int *)inval;
+
+    if (verbose) printf( "PANIC: In C MPI win copy function (should never happen)\n" );
+    *flag = 1;
+    return MPI_SUCCESS;
+}
+static int WIN_DELETE_FN( MPI_Win win, int keyval, void *outval,
+			  void *extra )
+{
+    if (verbose) printf( " In C MPI win delete function, extra = %p\n", extra );
+    *(int*)outval = *(int*)outval - 1;
+    return MPI_SUCCESS;
+}
+
+/* ----------------------------------------------------------------------- */
+/* Routines to create keyvals in C (with C copy and delete functions       */
+/* ----------------------------------------------------------------------- */
+
+void ccreatekeys_( MPI_Fint *ccomm1_key, MPI_Fint *ccomm2_key,
+		   MPI_Fint *ctype2_key, MPI_Fint *cwin2_key )
+{
+    MPI_Keyval_create( CMPI1_COPY_FN, CMPI1_DELETE_FN, &ccomm1Key,
+		       &ccomm1Extra );
+    *ccomm1_key = (MPI_Fint)ccomm1Key;
+
+    MPI_Comm_create_keyval( CMPI1_COPY_FN, CMPI1_DELETE_FN, &ccomm2Key,
+			    &ccomm2Extra );
+    *ccomm2_key = (MPI_Fint)ccomm2Key;
+
+    MPI_Type_create_keyval( TYPE_COPY_FN, TYPE_DELETE_FN, &ctype2Key,
+			     &ctype2Extra );
+    *ctype2_key = (MPI_Fint)ctype2Key;
+
+    MPI_Win_create_keyval( WIN_COPY_FN, WIN_DELETE_FN, &cwin2Key,
+			   &cwin2Extra );
+    *cwin2_key = (MPI_Fint)cwin2Key;
+}
+
+void cfreekeys_(void)
+{
+    MPI_Keyval_free( &ccomm1Key );
+    MPI_Comm_free_keyval( &ccomm2Key );
+    MPI_Type_free_keyval( &ctype2Key );
+    MPI_Win_free_keyval( &cwin2Key );
+}
+
+/* ----------------------------------------------------------------------- */
+/* ----------------------------------------------------------------------- */
+
+/* Test c-to-c attributes */
+static int ccomm1Attr, ccomm2Attr, ctype2Attr, cwin2Attr;
+
+void ctoctest_( MPI_Fint *errs )
+{
+    int errcnt = *errs;
+    int baseattrval = (1 << (sizeof(int)*8-2))-3;
+    MPI_Datatype cduptype;
+    MPI_Comm   cdup;
+
+    /* MPI-1 function */
+    ccomm1Attr = baseattrval;
+    MPI_Attr_put( MPI_COMM_SELF, ccomm1Key, &ccomm1Attr );
+    /* Test that we have the same value */
+    errcnt += cmpi1read( MPI_COMM_SELF, ccomm1Key, &ccomm1Attr, "C to C" );
+
+    /* Dup, check that the copy routine does what is expected */
+    MPI_Comm_dup( MPI_COMM_SELF, &cdup );
+    errcnt += cmpi1read( cdup, ccomm1Key, &ccomm1Attr, "C to C dup" );
+    if (ccomm1Attr != baseattrval + 1) {
+	printf( " Did not increment int in C to C dup: %d %d\n",
+		ccomm1Attr, baseattrval + 1 );
+	errcnt ++;
+    }
+
+    MPI_Comm_free( &cdup );
+    if (ccomm1Attr != baseattrval) {
+	printf( " Did not increment int in C to C delete: %d %d\n",
+		ccomm1Attr, baseattrval );
+	errcnt ++;
+    }
+
+    /* MPI-2 functions */
+    ccomm1Attr = 0;
+    ccomm2Attr = baseattrval;
+    MPI_Comm_set_attr( MPI_COMM_SELF, ccomm2Key, &ccomm2Attr );
+    /* Test that we have the same value */
+    errcnt += cmpi2read( MPI_COMM_SELF, ccomm2Key, &ccomm2Attr, "C to C (2)" );
+
+    /* Dup, check that the copy routine does what is expected */
+    MPI_Comm_dup( MPI_COMM_SELF, &cdup );
+    errcnt += cmpi2read( cdup, ccomm2Key, &ccomm2Attr, "C to C dup (2)" );
+    if (ccomm2Attr != baseattrval + 1) {
+	printf( " Did not increment int in C to C dup: %d %d\n",
+		ccomm2Attr, baseattrval + 1 );
+	errcnt ++;
+    }
+
+    MPI_Comm_free( &cdup );
+    if (ccomm2Attr != baseattrval) {
+	printf( " Did not increment int in C to C delete (2): %d %d\n",
+		ccomm2Attr, baseattrval );
+	errcnt ++;
+    }
+
+    /* MPI-2 functions */
+    ctype2Attr = baseattrval;
+    MPI_Type_set_attr( MPI_INTEGER, ctype2Key, &ctype2Attr );
+    /* Test that we have the same value */
+    errcnt += cmpi2readtype( MPI_INTEGER, ctype2Key, &ctype2Attr, "C to C type (2)" );
+
+    /* Dup, check that the copy routine does what is expected */
+    MPI_Type_dup( MPI_INTEGER, &cduptype );
+    errcnt += cmpi2readtype( cduptype, ctype2Key, &ctype2Attr, "C to C typedup (2)" );
+    if (ctype2Attr != baseattrval + 1) {
+	printf( " Did not increment int in C to C typedup: %d %d\n",
+		ctype2Attr, baseattrval + 1 );
+	errcnt ++;
+    }
+    ccomm1Attr = 0;
+
+    MPI_Type_free( &cduptype );
+    if (ctype2Attr != baseattrval) {
+	printf( " Did not increment int in C to C typedelete (2): %d %d\n",
+		ctype2Attr, baseattrval );
+	errcnt ++;
+    }
+
+
+    *errs = errcnt;
+}
+
+/* ----------------------------------------------------------------------- */
+/* Routines to get and check an attribute value.  Returns the number       */
+/*   of errors found                                                       */
+/* ----------------------------------------------------------------------- */
+
+int cmpi1read( MPI_Comm comm, int key, void *expected, const char *msg )
+{
+    void *attrval;
+    int  flag;
+    MPI_Attr_get( comm, key, &attrval, &flag );
+    if (!flag) {
+	printf( " Error: flag false for Attr_get: %s\n", msg );
+	return 1;
+    }
+    if (attrval != expected) {
+	printf( " Error: expected %p but saw %p: %s\n", expected, attrval, msg );
+	return 1;
+    }
+    return 0;
+}
+
+int cmpi2read( MPI_Comm comm, int key, void *expected, const char *msg )
+{
+    void *attrval;
+    int  flag;
+    MPI_Comm_get_attr( comm, key, &attrval, &flag );
+    if (!flag) {
+	printf( " Error: flag false for Comm_get_attr: %s\n", msg );
+	return 1;
+    }
+    if (attrval != expected) {
+	printf( " Error: expected %p but saw %p: %s\n", expected, attrval, msg );
+	return 1;
+    }
+    return 0;
+}
+
+int cmpi2readtype( MPI_Datatype dtype, int key, void *expected, const char *msg )
+{
+    void *attrval;
+    int  flag;
+    MPI_Type_get_attr( dtype, key, &attrval, &flag );
+    if (!flag) {
+	printf( " Error: flag false for Type_get_attr: %s\n", msg );
+	return 1;
+    }
+    if (attrval != expected) {
+	printf( " Error: expected %p but saw %p: %s\n", expected, attrval, msg );
+	return 1;
+    }
+    return 0;
+}
+int cmpi2readwin( MPI_Win win, int key, void *expected, const char *msg )
+{
+    void *attrval;
+    int  flag;
+    MPI_Win_get_attr( win, key, &attrval, &flag );
+    if (!flag) {
+	printf( " Error: flag false for Win_get_attr: %s\n", msg );
+	return 1;
+    }
+    if (attrval != expected) {
+	printf( " Error: expected %p but saw %p: %s\n", expected, attrval, msg );
+	return 1;
+    }
+    return 0;
+}
+
+/* Set in Fortran (MPI-1), read in C */
+void cmpif1read_( MPI_Fint *fcomm, MPI_Fint *fkey, MPI_Fint *expected,
+		  MPI_Fint *errs, const char *msg, int msglen )
+{
+    void *attrval;
+    int  flag, result;
+    MPI_Comm comm = MPI_Comm_f2c( *fcomm );
+    char lmsg[MAX_ATTRTEST_MSG];
+
+    if (msglen > sizeof(lmsg)- 1) {
+	fprintf( stderr, "Message too long for buffer (%d)\n", msglen );
+	MPI_Abort( MPI_COMM_WORLD, 1 );
+    }
+
+    MPI_Attr_get( comm, *fkey, &attrval, &flag );
+    if (!flag) {
+	*errs = *errs + 1;
+	strncpy( lmsg, msg, msglen );
+	lmsg[msglen] = 0;
+	printf( " Error: flag false for Attr_get (set in F1): %s\n", lmsg );
+	return;
+    }
+    /* Must be careful to compare as required in the MPI specification */
+    ccompareint2void_( expected, attrval, &result );
+    if (!result) {
+	*errs = *errs + 1;
+	strncpy( lmsg, msg, msglen );
+	lmsg[msglen] = 0;
+	printf( " Error: (set in F1) expected %d but saw %d: %s\n",
+		*expected, *(MPI_Fint*)attrval, lmsg );
+	return;
+    }
+    return;
+}
+
+/* Set in Fortran (MPI-2), read in C */
+void cmpif2read_( MPI_Fint *fcomm, MPI_Fint *fkey, MPI_Aint *expected,
+		  MPI_Fint *errs, const char *msg, int msglen )
+{
+    void *attrval;
+    int  flag, result;
+    MPI_Comm comm = MPI_Comm_f2c( *fcomm );
+    char lmsg[MAX_ATTRTEST_MSG];
+
+    if (msglen > sizeof(lmsg)- 1) {
+	fprintf( stderr, "Message too long for buffer (%d)\n", msglen );
+	MPI_Abort( MPI_COMM_WORLD, 1 );
+    }
+
+    MPI_Comm_get_attr( comm, *fkey, &attrval, &flag );
+    if (!flag) {
+	*errs = *errs + 1;
+	strncpy( lmsg, msg, msglen );
+	lmsg[msglen] = 0;
+	printf( " Error: flag false for Comm_get_attr (set in F2): %s\n", lmsg );
+	return;
+    }
+    ccompareaint2void_( expected, attrval, &result );
+    if (!result) {
+	*errs = *errs + 1;
+	strncpy( lmsg, msg, msglen );
+	lmsg[msglen] = 0;
+	printf( " Error: (set in F2) expected %ld but saw %ld: %s\n",
+		(long)*expected, (long)*(MPI_Aint*)attrval, lmsg );
+	return;
+    }
+    return;
+}
+
+void cmpif2readtype_( MPI_Fint *ftype, MPI_Fint *fkey, MPI_Aint *expected,
+		      MPI_Fint *errs, const char *msg, int msglen )
+{
+    void *attrval;
+    int  flag, result;
+    MPI_Datatype dtype = MPI_Type_f2c( *ftype );
+    char lmsg[MAX_ATTRTEST_MSG];
+
+    if (msglen > sizeof(lmsg)- 1) {
+	fprintf( stderr, "Message too long for buffer (%d)\n", msglen );
+	MPI_Abort( MPI_COMM_WORLD, 1 );
+    }
+
+    MPI_Type_get_attr( dtype, *fkey, &attrval, &flag );
+    if (!flag) {
+	*errs = *errs + 1;
+	strncpy( lmsg, msg, msglen );
+	lmsg[msglen] = 0;
+	printf( " Error: flag false for Type_get_attr (set in F2): %s\n", lmsg );
+	return;
+    }
+    ccompareaint2void_( expected, attrval, &result );
+    if (!result) {
+	*errs = *errs + 1;
+	strncpy( lmsg, msg, msglen );
+	lmsg[msglen] = 0;
+	printf( " Error: (set in F2/Type) expected %ld but saw %ld: %s\n",
+		(long)*expected, (long)*(MPI_Aint*)attrval, lmsg );
+	return;
+    }
+    return;
+}
+void cmpif2readwin_( MPI_Fint *fwin, MPI_Fint *fkey, MPI_Aint *expected,
+		     MPI_Fint *errs, const char *msg, int msglen )
+{
+    void *attrval;
+    int  flag, result;
+    MPI_Win win = MPI_Win_f2c( *fwin );
+    char lmsg[MAX_ATTRTEST_MSG];
+
+    if (msglen > sizeof(lmsg)- 1) {
+	fprintf( stderr, "Message too long for buffer (%d)\n", msglen );
+	MPI_Abort( MPI_COMM_WORLD, 1 );
+    }
+
+    MPI_Win_get_attr( win, *fkey, &attrval, &flag );
+    if (!flag) {
+	*errs = *errs + 1;
+	strncpy( lmsg, msg, msglen );
+	lmsg[msglen] = 0;
+	printf( " Error: flag false for Win_get_attr (set in F2): %s\n", lmsg );
+	return;
+    }
+    ccompareaint2void_( expected, attrval, &result );
+    if (!result) {
+	*errs = *errs + 1;
+	strncpy( lmsg, msg, msglen );
+	lmsg[msglen] = 0;
+	printf( " Error: (set in F2/Win) expected %ld but saw %ld: %s\n",
+		(long)*expected, (long)*(MPI_Aint*)attrval, lmsg );
+	return;
+    }
+    return;
+}
+
+/* ----------------------------------------------------------------------- */
+/* Given a Fortran attribute (pointer to the value to store), set it using */
+/* the C attribute functions                                               */
+/* ----------------------------------------------------------------------- */
+
+void csetmpi_( MPI_Fint *fcomm, MPI_Fint *fkey, MPI_Fint *val, MPI_Fint *errs )
+{
+    MPI_Comm comm = MPI_Comm_f2c( *fcomm );
+
+    MPI_Comm_set_attr( comm, *fkey, (void *)(MPI_Aint)*val );
+}
+void csetmpi2_( MPI_Fint *fcomm, MPI_Fint *fkey, MPI_Aint *val, MPI_Fint *errs )
+{
+    MPI_Comm comm = MPI_Comm_f2c( *fcomm );
+
+    MPI_Comm_set_attr( comm, *fkey, (void *)*val );
+}
+void csetmpitype_( MPI_Fint *ftype, MPI_Fint *fkey, MPI_Aint *val,
+		   MPI_Fint *errs )
+{
+    MPI_Datatype dtype = MPI_Type_f2c( *ftype );
+
+    MPI_Type_set_attr( dtype, *fkey, (void *)*val );
+}
+void csetmpiwin_( MPI_Fint *fwin, MPI_Fint *fkey, MPI_Aint *val,
+		  MPI_Fint *errs )
+{
+    MPI_Win win = MPI_Win_f2c( *fwin );
+
+    MPI_Win_set_attr( win, *fkey, (void *)*val );
+}
+/* ----------------------------------------------------------------------- */
+/* Comparisons                                                             */
+/*    int with aint                                                        */
+/*    int with void*                                                       */
+/*    aint with void*                                                      */
+/* All routines use similar interfaces, though the routines that involve   */
+/* void * must be called from C                                            */
+/* Defined to be callable from either C or Fortran                         */
+/* Here is the rule, defined in the MPI standard:                          */
+/*    If one item is shorter than the other, take the low bytes.           */
+/*    If one item is longer than the other, sign extend                    */
+/* ----------------------------------------------------------------------- */
+void ccompareint2aint_( MPI_Fint *in1, MPI_Aint *in2, MPI_Fint *result )
+{
+    static int idx = -1;
+    if (sizeof(MPI_Fint) == sizeof(MPI_Aint)) {
+	*result = *in1 == *in2;
+    }
+    else if (sizeof(MPI_Fint) < sizeof(MPI_Aint)) {
+	/* Assume Aint no smaller than Fint, and that size of aint
+	   is a multiple of the size of fint) */
+	MPI_Fint *v2 = (MPI_Fint *)in2;
+	if (idx < 0) {
+	    MPI_Aint av = 1;
+	    MPI_Fint *fa = (MPI_Fint *)&av;
+	    if ((sizeof(MPI_Aint) % sizeof(MPI_Fint)) != 0) {
+		fprintf( stderr,
+	 "PANIC: size of MPI_Aint = %d not a multiple of MPI_Fint = %d\n",
+			 (int)sizeof(MPI_Aint), (int)sizeof(MPI_Fint) );
+		MPI_Abort( MPI_COMM_WORLD, 1 );
+	    }
+	    for (idx = sizeof(MPI_Aint) / sizeof(MPI_Fint); idx >= 0; idx--)
+		if (fa[idx]) break;
+	    if (idx < 0) {
+		fprintf( stderr, "Unable to determine low word of Fint in Aint\n" );
+		MPI_Abort( MPI_COMM_WORLD, 1 );
+	    }
+	    *result = *in1 == v2[idx];
+	}
+    }
+    else {
+	fprintf( stderr, "PANIC: sizeof(MPI_Fint) = %d > sizeof(MPI_Aint) %d\n",
+		 (int)sizeof(MPI_Fint), (int)sizeof(MPI_Aint) );
+	MPI_Abort( MPI_COMM_WORLD, 1 );
+    }
+}
+void ccompareint2void_( MPI_Fint *in1, void *in2, MPI_Fint *result )
+{
+    static int idx = -1;
+    if (sizeof(MPI_Fint) == sizeof(void*)) {
+	*result = *in1 == *(MPI_Fint*)in2;
+    }
+    else if (sizeof(MPI_Fint) < sizeof(void*)) {
+	/* Assume void* no smaller than Fint, and that size of aint
+	   is a multiple of the size of fint) */
+	MPI_Fint *v2 = (MPI_Fint *)in2;
+	if (idx < 0) {
+	    void *av = (void *)1;
+	    MPI_Fint *fa = (MPI_Fint *)&av;
+	    if ((sizeof(void*) % sizeof(MPI_Fint)) != 0) {
+		fprintf( stderr,
+	 "PANIC: size of void * = %d not a multiple of MPI_Fint = %d\n",
+			 (int)sizeof(void*), (int)sizeof(MPI_Fint) );
+		MPI_Abort( MPI_COMM_WORLD, 1 );
+	    }
+	    for (idx = sizeof(void*) / sizeof(MPI_Fint); idx >= 0; idx--)
+		if (fa[idx]) break;
+	    if (idx < 0) {
+		fprintf( stderr, "Unable to determine low word of Fint in void*\n" );
+		MPI_Abort( MPI_COMM_WORLD, 1 );
+	    }
+	    *result = *in1 == v2[idx];
+	}
+    }
+    else {
+	fprintf( stderr, "PANIC: sizeof(MPI_Fint) = %d > sizeof(void*) %d\n",
+		 (int)sizeof(MPI_Fint), (int)sizeof(void*) );
+	MPI_Abort( MPI_COMM_WORLD, 1 );
+    }
+}
+void ccompareaint2void_( MPI_Aint *in1, void *in2, MPI_Fint *result )
+{
+    /* Note that an aint must be >= void * by definition */
+    *result = *in1 == *(MPI_Aint*)in2;
+}
diff --git a/test/mpi/f08/attr/attrlangf08.f90 b/test/mpi/f08/attr/attrlangf08.f90
new file mode 100644
index 0000000..5a87dfd
--- /dev/null
+++ b/test/mpi/f08/attr/attrlangf08.f90
@@ -0,0 +1,944 @@
+!
+! -*- Mode: Fortran; -*-
+!
+!  (C) 2012 by Argonne National Laboratory.
+!      See COPYRIGHT in top-level directory.
+!
+!
+! In MPI 2.2, the behavior of attributes set in one language and retrieved
+! from another was defined.  There are three types of attribute values:
+!  1. pointer (void *): "The C type"
+!  2. INTEGER         : "The MPI-1 Fortran type"
+!  3. INTEGER (KIND=MPI_ADDRESS_KIND) : "The MPI-2 Fortran type"
+!
+! All three apply to Communicator attributes, with case 2 using the
+! deprecated MPI_ATTR_GET and MPI_ATTR_PUT routines. For Datatype and
+! RMA Window attributes, cases 1 and 3 apply.
+!
+! Note, just to make this more complex, there are some reasons why an MPI
+! implementation may choose to make MPI_Aint (and the corresponding
+! Fortran MPI_ADDRESS_KIND) larger than a void pointer.  Specifically,
+! make it as large as MPI_Offset, which simplifies certain operations
+! with datatypes.
+!
+! There are 9 cases:
+! 1. C sets, C gets
+! 2. C sets, Fortran INTEGER gets
+! 3. C sets, Fortran ADDRESS_KIND gets
+! 4. Fortran INTEGER sets, C gets
+! 5. Fortran INTEGER sets, Fortran INTEGER gets
+! 6. Fortran INTEGER sets, Fortran ADDRESS_KIND gets
+! 7. Fortran ADDRESS_KIND sets, C gets
+! 8. Fortran ADDRESS_KIND sets, Fortran INTEGER gets
+! 9. Fortran ADDRESS_KIND sets, Fortran ADDRESS_KIND gets
+!
+! These are the basic cases.  They are complicated by the fact that
+! the attribute values have 3 types: void * (C interface), MPI_Fint
+! (Fortran INTEGER), and MPI_Aint (Fortran ADDRESS_KIND).  These
+! have the following size relationships:
+!
+! sizeof(void *) <= sizeof(MPI_Aint)
+!     (For some systems, MPI_Aint is set to the same size as
+!      MPI_Offset, and may be larger than a void *.)
+! sizeof(MPI_Fint) <= sizeof(MPI_Aint)
+!     (Not strictly defined, but all reasonable implementations will
+!      have this property)
+!
+! When a value is stored, the full value is stored (this may be fewer
+! bytes than the maximum-sized attribute, in which case the high
+! bytes are stored as zero).  When a value is retrieved, if the
+! destination location is smaller, the low bytes (in value) are
+! saved; this is the same as trunction.  If the destination location
+! is longer, then then value is sign-extended (See MPI-3, 17.2.7).
+!
+! Specifically, if the value was set from Fortran, C will return a
+! pointer to the appropriate-sized integer.
+! When the value is set from C but accessed from Fortran, the value
+! is converted to an integer of the appropriate length, possibly truncated.
+!
+! FIXME: The above different-length attribute case is not yet handled
+!  in this code.
+!
+! In addition to setting and getting attributes, they are accessed
+! through duplication (COMM_DUP and TYPE_DUP), and on deletion of the
+! object to which they are attached, when the copy functions will be
+! well-defined.
+!
+! This code was inspired by a code written by Jeff Squyres to test these
+! nine cases. This code, however, is different.
+!
+! So, for each of the same->same tests:
+!    Store largest positive and negative attributes.  Dup them,
+!    retrieve them, delete them.  All bytes should remain value, and
+!    no other.  Use keys created in all three languages for set/get;
+!    use language under test for dup.
+!
+! For X->Y tests:
+!    Using X, store into key created in all three.
+!    Using Y, retrive all attributes.  See above for handling of
+!     truncated or sign-extended
+!
+! Use Fortran to drive tests (Fortran main program).  Call C for
+! C routines and to check data with different sizes (to ensure that
+! the proper bytes are used in the value).
+!
+! Use the same keyval for attributes used in both C and Fortran (both
+! modes).  This found an error in MPICH, where the type of the
+! attribute (e.g., pointer, integer, or address-sized integer) needs
+! to be saved.
+!
+! Module containing the keys and other information, including
+! interfaces to the C routines
+      module keyvals
+        use mpi_f08
+        logical fverbose, useintSize
+        integer ptrSize, intSize, aintSize
+        integer fcomm1_key, fcomm1_extra
+        integer fcomm2_key, ftype2_key, fwin2_key
+        integer ccomm1_key
+        integer ccomm2_key, ctype2_key, cwin2_key
+        TYPE(MPI_Win) win
+        integer (kind=MPI_ADDRESS_KIND) fcomm2_extra, ftype2_extra,&
+             & fwin2_extra
+        interface
+           pure function bigint()
+             integer bigint
+           end function bigint
+           pure function bigaint()
+             use mpi_f08, only : MPI_ADDRESS_KIND
+             integer (kind=MPI_ADDRESS_KIND) bigaint
+           end function bigaint
+           ! Could use bind(c) once we require that level of Fortran support.
+           subroutine csetmpi( fcomm, fkey, val, errs )
+             use mpi_f08
+             TYPE(MPI_Comm), INTENT(IN) :: fcomm
+             integer, INTENT(IN) :: fkey, val
+             integer errs
+           end subroutine csetmpi
+           subroutine csetmpi2( fcomm, fkey, val, errs )
+             use mpi_f08
+             TYPE(MPI_Comm), INTENT(IN) :: fcomm
+             integer, INTENT(IN) :: fkey
+             integer  errs
+             integer (KIND=MPI_ADDRESS_KIND) val
+           end subroutine csetmpi2
+           subroutine cattrinit( fv )
+             integer fv
+           end subroutine cattrinit
+           subroutine cgetsizes( ps, is, as )
+             integer, INTENT(OUT) :: ps, is, as
+           end subroutine cgetsizes
+           subroutine ccreatekeys( k1, k2, k3, k4 )
+             integer, INTENT(OUT) :: k1, k2, k3, k4
+           end subroutine ccreatekeys
+           subroutine cfreekeys()
+           end subroutine cfreekeys
+           subroutine ctoctest( errs )
+             integer errs
+           end subroutine ctoctest
+        end interface
+      end module keyvals
+!
+      program main
+      use mpi_f08
+      use keyvals
+      implicit none
+      integer ierr
+      integer errs, tv, rank
+      integer(MPI_ADDRESS_KIND) tmp
+
+      errs = 0
+      call MPI_INIT( ierr )
+      call MPI_COMM_RANK( MPI_COMM_WORLD, rank, ierr )
+!
+!     Let the C routines know about debugging
+      call cgetenvbool( "MPITEST_VERBOSE", tv )
+      if (tv .eq. 1) then
+         fverbose = .true.
+         call cattrinit( 1 )
+      else
+         fverbose = .false.
+         call cattrinit( 0 )
+      endif
+!
+! If this value is true, define an "big MPI_Aint" value that fits in
+! an MPI_Fint (see function bigaint)
+      call cgetenvbool( "MPITEST_ATTR_INTFORAINT", tv )
+      if (tv .eq. 1) then
+         useintSize = .true.
+      else
+         useintSize = .false.
+      endif
+!
+!     Get the sizes of the three types of attributes
+      call cgetsizes( ptrSize, intSize, aintSize )
+      if (fverbose) then
+         print *, 'sizeof(ptr)=',ptrSize, ' sizeof(int)=', intSize, ' &
+              &sizeof(aint)=', aintSize
+      endif
+!
+!     Create the keyvals
+!
+!     Create the attribute values to use.  We want these to use the full
+!     available width, which depends on both the type and the test,
+!     since when switching between types of different sizes, we need to
+!     check only the "low" bits (those shared in types of each size).
+!
+!
+      if (fverbose) then
+         print *, "Creating Fortran attribute keys"
+      endif
+
+      call fCreateKeys()
+      if (fverbose) then
+         print *, "Creating C attribute keys"
+      endif
+      call ccreatekeys( ccomm1_key, ccomm2_key, ctype2_key, cwin2_key&
+           & )
+!
+!     Create a window to use with the attribute tests in Fortran
+      tmp = 0
+      call MPI_WIN_CREATE( MPI_BOTTOM, tmp, 1, MPI_INFO_NULL,&
+           & MPI_COMM_WORLD, win, ierr )
+!
+      if (fverbose) then
+         print *, "Case 1: C sets and C gets"
+      endif
+      call ctoctest( errs )
+      if (fverbose) then
+         print *, "Case 2: C sets and Fortran (MPI1) gets"
+      endif
+      call ctof1test( errs )
+      if (fverbose) then
+         print *, "Case 3: C sets and Fortran (MPI2) gets"
+      endif
+      call ctof2test( errs )
+      if (fverbose) then
+         print *, "Case 4: Fortran (MPI1) sets and C gets"
+      endif
+      call f1toctest( errs )
+      if (fverbose) then
+         print *, "Case 5: Fortran (MPI1) sets and gets"
+      endif
+      call f1tof1test( errs )
+      if (fverbose) then
+         print *, "Case 6: Fortran (MPI1) sets and Fortran (MPI2) gets"
+      endif
+      call f1tof2test( errs )
+      if (fverbose) then
+         print *, "Case 7: Fortran (MPI2) sets and C gets"
+      endif
+      call f2toctest( errs )
+      if (fverbose) then
+         print *, "Case 8: Fortran (MPI2) sets and Fortran (MPI1) gets"
+      endif
+      call f2tof1test( errs )
+      if (fverbose) then
+         print *, "Case 9: Fortran (MPI2) sets and gets"
+      endif
+      call f2tof2test( errs )
+
+! Cleanup
+      call ffreekeys()
+      call cfreekeys()
+      call MPI_WIN_FREE( win, ierr )
+
+      call MPI_REDUCE( MPI_IN_PLACE, errs, 1, MPI_INT, MPI_SUM, 0,&
+           & MPI_COMM_WORLD, ierr )
+
+      if (rank .eq. 0) then
+         if (errs .eq. 0) then
+            print *, " No Errors"
+         else
+            print *, " Found ", errs, " errors"
+         endif
+      endif
+      call MPI_FINALIZE( ierr )
+
+      end
+!
+! -------------------------------------------------------------------
+! Check attribute set in Fortran (MPI-1) and read from Fortran (MPI-1)
+! -------------------------------------------------------------------
+      integer function FMPI1checkCommAttr( comm, key, expected, msg )
+      use mpi_f08
+      integer key, expected
+      TYPE(MPI_Comm) comm
+      character*(*) msg
+      integer value, ierr
+      logical flag
+!
+      FMPI1checkCommAttr = 0
+      call MPI_ATTR_GET( comm, key, value, flag, ierr )
+      if (.not. flag) then
+         print *, "Error: reading Fortran INTEGER attribute: ", msg
+         FMPI1checkCommAttr = 1
+         return
+      endif
+      if (value .ne. expected) then
+         print *, "Error: Fortran INTEGER attribute: ", msg
+         print *, "Expected ", expected, " but got ", value
+         FMPI1checkCommAttr = 1
+      endif
+      return
+      end
+!
+! -------------------------------------------------------------------
+! Functions associated with attribute copy/delete.
+! -------------------------------------------------------------------
+      subroutine FMPI1_COPY_FN( oldcomm, key, extrastate, inval,&
+           & outval, flag, ierr )
+      use mpi_f08
+      use keyvals, only : fverbose
+      integer key, extrastate, inval, outval, ierr
+      TYPE(MPI_Comm) oldcomm
+      logical flag
+!
+      if (fverbose) then
+         print *, 'FMPI1_COPY: Attr in = ', inval, ' extra = ',&
+              & extrastate
+      endif
+      flag = .true.
+      outval = inval + 1
+      ierr = MPI_SUCCESS
+      end
+!
+      subroutine FMPI1_DELETE_FN( oldcomm, key, extrastate, inval,&
+     &     ierr )
+      use mpi_f08
+      use keyvals, only : fverbose
+      integer key, extrastate, inval, ierr
+      TYPE(MPI_Comm) oldcomm
+      logical flag
+!
+      if (fverbose) then
+         print *, "FMPI1_DELETE: inval = ", inval, " extra = ",&
+              & extrastate
+      endif
+      ierr = MPI_SUCCESS
+      end
+!
+!
+      subroutine FMPI2_COPY_FN( oldcomm, key, extrastate, inval, outval,&
+     &     flag, ierr )
+      use mpi_f08
+      use keyvals, only : fverbose
+      implicit none
+      integer key, ierr
+      TYPE(MPI_Comm) oldcomm
+      integer (KIND=MPI_ADDRESS_KIND) inval, outval, extrastate
+      logical flag
+!
+      if (fverbose) then
+         print *, 'FMPI2_COPY: Attr in = ', inval, ' extra = ',&
+              & extrastate
+      endif
+      flag = .true.
+      outval = inval + 1
+      ierr = MPI_SUCCESS
+      end
+!
+      subroutine FMPI2_DELETE_FN( oldcomm, key, extrastate, inval,&
+     &     ierr )
+      use mpi_f08
+      use keyvals, only : fverbose
+      implicit none
+      integer key, ierr
+      TYPE(MPI_Comm) oldcomm
+      integer (kind=MPI_ADDRESS_KIND) inval, extrastate
+!
+      if (fverbose) then
+         print *, "FMPI2_DELETE: inval = ", inval, " extra = ",&
+              & extrastate
+      endif
+      ierr = MPI_SUCCESS
+      end
+! -------------------------------------------------------------------
+!
+! Typical check pattern
+!
+! Set value
+! Get value (check set in same form)
+! Get value in other modes
+! Dup object (updates value)
+! Get value in other modes
+! Delete dup'ed object; check correct value sent to delete routine
+!
+      subroutine fcreateKeys( )
+        use mpi_f08
+        use keyvals
+        implicit none
+        external FMPI1_COPY_FN, FMPI1_DELETE_FN, FMPI2_COPY_FN,&
+           & FMPI2_DELETE_FN
+        integer ierr
+
+        fcomm1_extra = 0
+        fcomm2_extra = 0
+        ftype2_extra = 0
+        fwin2_extra  = 0
+        call MPI_KEYVAL_CREATE( FMPI1_COPY_FN, FMPI1_DELETE_FN,&
+             & fcomm1_key, fcomm1_extra, ierr )
+        call MPI_COMM_CREATE_KEYVAL( FMPI2_COPY_FN, FMPI2_DELETE_FN,&
+             & fcomm2_key, fcomm2_extra, ierr )
+        call MPI_TYPE_CREATE_KEYVAL( FMPI2_COPY_FN, FMPI2_DELETE_FN,&
+             & ftype2_key, ftype2_extra, ierr )
+        call MPI_WIN_CREATE_KEYVAL( FMPI2_COPY_FN, FMPI2_DELETE_FN,&
+             & fwin2_key, fwin2_extra, ierr )
+
+      end subroutine fcreateKeys
+!
+      subroutine ffreekeys()
+        use mpi_f08
+        use keyvals
+        implicit none
+        integer ierr
+
+        call MPI_KEYVAL_FREE( fcomm1_key, ierr )
+        call MPI_COMM_FREE_KEYVAL( fcomm2_key, ierr )
+        call MPI_TYPE_FREE_KEYVAL( ftype2_key, ierr )
+        call MPI_WIN_FREE_KEYVAL( fwin2_key, ierr )
+
+        return
+      end subroutine ffreekeys
+! -------------------------------------------------------------------
+! Set attributes in Fortran (MPI-1) and read them from Fortran (MPI-1)
+      subroutine f1tof1test(errs)
+        use mpi_f08
+        use keyvals
+        implicit none
+        integer errs
+        integer ierr, attrval, fcomm1attr
+        TYPE(MPI_Comm) fdup
+!
+        fcomm1attr = bigint()
+        attrval    = fcomm1attr
+        call MPI_ATTR_PUT( MPI_COMM_SELF, fcomm1_key, fcomm1attr,&
+             & ierr )
+        call fmpi1read( MPI_COMM_SELF, fcomm1_key, attrval, &
+             &"F to F (check value)", errs )
+        call MPI_COMM_DUP( MPI_COMM_SELF, fdup, ierr )
+        call fmpi1read( fdup, fcomm1_key, attrval + 1, "F to F dup",&
+             & errs )
+        call MPI_COMM_FREE( fdup, ierr )
+!
+! Use a negative value
+        fcomm1attr = -bigint()
+        attrval    = fcomm1attr
+        call MPI_ATTR_PUT( MPI_COMM_SELF, fcomm1_key, fcomm1attr,&
+             & ierr )
+        call fmpi1read( MPI_COMM_SELF, fcomm1_key, attrval, &
+             &"F to F (check neg value)", errs )
+        call MPI_COMM_DUP( MPI_COMM_SELF, fdup, ierr )
+        call fmpi1read( fdup, fcomm1_key, attrval + 1, "F to F dup",&
+             & errs )
+        call MPI_COMM_FREE( fdup, ierr )
+
+      end subroutine f1tof1test
+!
+! Set attributes in C and read them from Fortran (MPI-1)
+      subroutine ctof1test(errs)
+        use mpi_f08
+        use keyvals
+        implicit none
+        integer errs
+        integer ierr, attrval, fcomm1attr
+        TYPE(MPI_Comm) fdup
+!
+        fcomm1attr = bigint()
+        attrval    = fcomm1attr
+        call csetmpi( MPI_COMM_SELF, fcomm1_key, fcomm1attr, errs )
+        call fmpi1read( MPI_COMM_SELF, fcomm1_key, attrval, "C to F",&
+             & errs )
+        if (ptrSize .eq. intSize) then
+           call MPI_COMM_DUP( MPI_COMM_SELF, fdup, ierr )
+           call fmpi1read( fdup, fcomm1_key, attrval + 1, "C to F dup",&
+                & errs )
+           call MPI_COMM_FREE( fdup, ierr )
+        endif
+!
+        fcomm1attr = -bigint()
+        attrval    = fcomm1attr
+        call csetmpi( MPI_COMM_SELF, fcomm1_key, fcomm1attr, errs )
+        call fmpi1read( MPI_COMM_SELF, fcomm1_key, attrval, "C to F",&
+             & errs )
+        if (ptrSize .eq. intSize) then
+           call MPI_COMM_DUP( MPI_COMM_SELF, fdup, ierr )
+           call fmpi1read( fdup, fcomm1_key, attrval + 1, "C to F dup",&
+                & errs )
+           call MPI_COMM_FREE( fdup, ierr )
+        endif
+
+      end subroutine ctof1test
+!
+! Set attributes in Fortran (MPI-1) and read in Fortran (MPI-2)
+      subroutine f1tof2test(errs)
+        use mpi_f08
+        use keyvals
+        implicit none
+        integer errs
+        integer ierr, attrval, fcomm1attr
+        TYPE(MPI_Comm) fdup
+        integer (kind=MPI_ADDRESS_KIND) expected
+!
+        fcomm1attr = bigint()
+        attrval    = fcomm1attr
+        call MPI_ATTR_PUT( MPI_COMM_SELF, fcomm1_key, fcomm1attr,&
+             & ierr )
+        call fmpi1read( MPI_COMM_SELF, fcomm1_key, attrval, &
+             & "F to F (check value for F2 test)", errs )
+        if (intSize .eq. aintSize) then
+           call MPI_COMM_DUP( MPI_COMM_SELF, fdup, ierr )
+           expected = attrval + 1
+           call fmpi2read( fdup, fcomm1_key, expected, "F to F2 dup",&
+                & errs )
+           call MPI_COMM_FREE( fdup, ierr )
+        endif
+!
+        fcomm1attr = -bigint()
+        attrval    = fcomm1attr
+        call MPI_ATTR_PUT( MPI_COMM_SELF, fcomm1_key, fcomm1attr,&
+             & ierr )
+        call fmpi1read( MPI_COMM_SELF, fcomm1_key, attrval, &
+             &"F to F (check neg value for F2 test)", errs )
+        if (intSize .eq. aintSize) then
+           call MPI_COMM_DUP( MPI_COMM_SELF, fdup, ierr )
+           expected = attrval + 1
+           call fmpi2read( fdup, fcomm1_key, expected, "F to F2 dup",&
+                & errs )
+           call MPI_COMM_FREE( fdup, ierr )
+        endif
+
+      end subroutine f1tof2test
+!
+      subroutine fmpi1read( comm, key, expected, msg, errs )
+        use mpi_f08
+        implicit none
+        integer key, expected, errs
+        TYPE(MPI_Comm) comm
+        character *(*) msg
+        logical flag
+        integer ierr, attrval
+!
+        call MPI_ATTR_GET( comm, key, attrval, flag, ierr )
+        if (.not. flag) then
+           print *, 'Error: flag false for Attr_get: ', msg
+           errs = errs + 1
+           return
+        endif
+        if (attrval .ne. expected) then
+           print *, 'Error: expected ', expected, ' but saw ',&
+                & attrval, ':', msg
+           errs = errs + 1
+        endif
+        return
+      end subroutine fmpi1read
+
+      subroutine fmpi2read( comm, key, expected, msg, errs )
+        use mpi_f08
+        implicit none
+        integer key, errs
+        TYPE(MPI_Comm) comm
+        integer (kind=MPI_ADDRESS_KIND) expected
+        character *(*) msg
+        logical flag
+        integer ierr
+        integer (kind=MPI_ADDRESS_KIND) attrval
+!
+        call MPI_COMM_GET_ATTR( comm, key, attrval, flag, ierr )
+        if (.not. flag) then
+           print *, 'Error: flag false for Attr_get: ', msg
+           errs = errs + 1
+           return
+        endif
+        if (attrval .ne. expected) then
+           print *, 'Error: expected ', expected, ' but saw ',&
+                & attrval, ':', msg
+           errs = errs + 1
+        endif
+        return
+      end subroutine fmpi2read
+
+      subroutine fmpi2readwin( win, key, expected, msg, errs )
+        use mpi_f08
+        implicit none
+        integer key, errs
+        TYPE(MPI_Win) win
+        integer (kind=MPI_ADDRESS_KIND) expected
+        character *(*) msg
+        logical flag
+        integer ierr
+        integer (kind=MPI_ADDRESS_KIND) attrval
+!
+        call MPI_WIN_GET_ATTR( win, key, attrval, flag, ierr )
+        if (.not. flag) then
+           print *, 'Error: flag false for Win_get_attr: ', msg
+           errs = errs + 1
+           return
+        endif
+        if (attrval .ne. expected) then
+           print *, 'Error: expected ', expected, ' but saw ',&
+                & attrval, ':', msg
+           errs = errs + 1
+        endif
+        return
+      end subroutine fmpi2readwin
+
+      subroutine fmpi2readtype( dtype, key, expected, msg, errs )
+        use mpi_f08
+        implicit none
+        integer key, errs
+        TYPE(MPI_Datatype) dtype
+        integer (kind=MPI_ADDRESS_KIND) expected
+        character *(*) msg
+        logical flag
+        integer ierr
+        integer (kind=MPI_ADDRESS_KIND) attrval
+!
+        call MPI_TYPE_GET_ATTR( dtype, key, attrval, flag, ierr )
+        if (.not. flag) then
+           print *, 'Error: flag false for Type_get_attr: ', msg
+           errs = errs + 1
+           return
+        endif
+        if (attrval .ne. expected) then
+           print *, 'Error: expected ', expected, ' but saw ',&
+                & attrval, ':', msg
+           errs = errs + 1
+        endif
+        return
+      end subroutine fmpi2readtype
+
+      subroutine f2tof2test(errs)
+        use mpi_f08
+        use keyvals
+        implicit none
+        integer errs
+        integer ierr
+        TYPE(MPI_Comm) fdup
+        TYPE(MPI_Datatype) tdup
+        integer (kind=MPI_ADDRESS_KIND) fcomm2attr, ftype2attr,&
+             & fwin2attr, attrval
+!
+        fcomm2attr = bigaint()
+        attrval    = fcomm2attr
+        call MPI_COMM_SET_ATTR( MPI_COMM_SELF, fcomm2_key, fcomm2attr,&
+             & ierr )
+        call fmpi2read( MPI_COMM_SELF, fcomm2_key, attrval, "F2 to F2",&
+             & errs )
+        call MPI_COMM_DUP( MPI_COMM_SELF, fdup, ierr )
+        call fmpi2read( fdup, fcomm2_key, attrval + 1, "F2 to F2 dup",&
+             & errs )
+        call MPI_COMM_FREE( fdup, ierr )
+!
+        ftype2attr = bigaint()-9
+        attrval    = ftype2attr
+        call MPI_TYPE_SET_ATTR( MPI_INTEGER, ftype2_key, ftype2attr,&
+             & ierr )
+        call fmpi2readtype( MPI_INTEGER, ftype2_key, attrval, "F2 type&
+             & to F2", errs )
+        call MPI_TYPE_DUP( MPI_INTEGER, tdup, ierr )
+        call fmpi2readtype( tdup, ftype2_key, attrval + 1, "F2 type to&
+             & F dup", errs )
+        call MPI_TYPE_FREE( tdup, ierr )
+
+        fwin2attr = bigaint()-9
+        attrval    = fwin2attr
+        call MPI_WIN_SET_ATTR( win, fwin2_key, fwin2attr,&
+             & ierr )
+        call fmpi2readwin( win, fwin2_key, attrval, "F2 win to F2",&
+             & errs )
+!
+        fcomm2attr = -bigaint()
+        attrval    = fcomm2attr
+        call MPI_COMM_SET_ATTR( MPI_COMM_SELF, fcomm2_key, fcomm2attr,&
+             & ierr )
+        call fmpi2read( MPI_COMM_SELF, fcomm2_key, attrval, "F2 to F2",&
+             & errs )
+        call MPI_COMM_DUP( MPI_COMM_SELF, fdup, ierr )
+        call fmpi2read( fdup, fcomm2_key, attrval + 1, "F2 to F2 dup",&
+             & errs )
+        call MPI_COMM_FREE( fdup, ierr )
+!
+        ftype2attr = -(bigaint()-9)
+        attrval    = ftype2attr
+        call MPI_TYPE_SET_ATTR( MPI_INTEGER, ftype2_key, ftype2attr,&
+             & ierr )
+        call fmpi2readtype( MPI_INTEGER, ftype2_key, attrval, "F2 type&
+             & to F2", errs )
+        call MPI_TYPE_DUP( MPI_INTEGER, tdup, ierr )
+        call fmpi2readtype( tdup, ftype2_key, attrval + 1, "F2 type to&
+             & F dup", errs )
+        call MPI_TYPE_FREE( tdup, ierr )
+
+        fwin2attr = -(bigaint()-9)
+        attrval    = fwin2attr
+        call MPI_WIN_SET_ATTR( win, fwin2_key, fwin2attr,&
+             & ierr )
+        call fmpi2readwin( win, fwin2_key, attrval, "F2 win to F2",&
+             & errs )
+
+      end subroutine f2tof2test
+!
+      subroutine f1toctest( errs )
+        use mpi_f08
+        use keyvals
+        implicit none
+        integer errs
+        integer ierr, attrval, fcomm1attr
+        TYPE(MPI_Comm) fdup
+!
+        fcomm1attr = bigint()
+        attrval    = fcomm1attr
+        call MPI_ATTR_PUT( MPI_COMM_SELF, fcomm1_key, fcomm1attr,&
+             & ierr )
+        call fmpi1read( MPI_COMM_SELF, fcomm1_key, attrval, &
+             & "F to F (check for F to C)", errs )
+        if (intSize .eq. ptrSize) then
+           call MPI_COMM_DUP( MPI_COMM_SELF, fdup, ierr )
+           call cmpif1read( fdup, fcomm1_key, attrval + 1, errs, &
+                & "F to F2 dup" )
+           call MPI_COMM_FREE( fdup, ierr )
+        endif
+!
+        fcomm1attr = -bigint()
+        attrval    = fcomm1attr
+        call MPI_ATTR_PUT( MPI_COMM_SELF, fcomm1_key, fcomm1attr,&
+             & ierr )
+        call fmpi1read( MPI_COMM_SELF, fcomm1_key, attrval, &
+             &"F to F (check neg value for F to C)", errs )
+        if (intSize .eq. ptrSize) then
+           call MPI_COMM_DUP( MPI_COMM_SELF, fdup, ierr )
+           call cmpif1read( fdup, fcomm1_key, attrval + 1, errs, &
+                "F to C dup" )
+           call MPI_COMM_FREE( fdup, ierr )
+        endif
+
+      end subroutine f1toctest
+
+      subroutine f2tof1test(errs)
+        use mpi_f08
+        use keyvals
+        implicit none
+        integer errs
+        integer ierr
+        TYPE(MPI_Comm) fdup
+        TYPE(MPI_Datatype) tdup
+        integer (kind=MPI_ADDRESS_KIND) fcomm2attr, ftype2attr,&
+             & fwin2attr, attrval
+        integer expected
+!
+        fcomm2attr = bigaint()
+        attrval    = fcomm2attr
+        call MPI_COMM_SET_ATTR( MPI_COMM_SELF, fcomm2_key, fcomm2attr,&
+             & ierr )
+        call fmpi2read( MPI_COMM_SELF, fcomm2_key, attrval, "F2 to F2",&
+             & errs )
+        if (aintSize .eq. intSize) then
+           call MPI_COMM_DUP( MPI_COMM_SELF, fdup, ierr )
+           expected = attrval + 1
+           call fmpi1read( fdup, fcomm2_key, expected, "F2 to F1 dup",&
+                & errs )
+           call MPI_COMM_FREE( fdup, ierr )
+        endif
+!
+        fcomm2attr = -bigaint()
+        attrval    = fcomm2attr
+        call MPI_COMM_SET_ATTR( MPI_COMM_SELF, fcomm2_key, fcomm2attr,&
+             & ierr )
+        call fmpi2read( MPI_COMM_SELF, fcomm2_key, attrval, "F2 to F2",&
+             & errs )
+        if (aintSize .eq. intSize) then
+           call MPI_COMM_DUP( MPI_COMM_SELF, fdup, ierr )
+           expected = attrval + 1
+           call fmpi1read( fdup, fcomm2_key, expected, "F2 to F1 dup",&
+                & errs )
+           call MPI_COMM_FREE( fdup, ierr )
+        endif
+
+!
+      end subroutine f2tof1test
+!
+      subroutine f2toctest(errs)
+        use mpi_f08
+        use keyvals
+        implicit none
+        integer errs
+        integer ierr
+        TYPE(MPI_Comm) fdup
+        TYPE(MPI_Datatype) tdup
+        integer (kind=MPI_ADDRESS_KIND) fcomm2attr, ftype2attr,&
+             & fwin2attr, attrval
+!
+        fcomm2attr = bigaint()
+        attrval    = fcomm2attr
+        call MPI_COMM_SET_ATTR( MPI_COMM_SELF, fcomm2_key, fcomm2attr,&
+             & ierr )
+        call fmpi2read( MPI_COMM_SELF, fcomm2_key, attrval, "F2 to F2",&
+             & errs )
+        if (aintSize .eq. ptrSize) then
+           call MPI_COMM_DUP( MPI_COMM_SELF, fdup, ierr )
+           call cmpif2read( fdup, fcomm2_key, attrval + 1, errs, "F2 t&
+                &o c dup")
+           call MPI_COMM_FREE( fdup, ierr )
+        endif
+!
+        ftype2attr = bigaint()-9
+        attrval    = ftype2attr
+        call MPI_TYPE_SET_ATTR( MPI_INTEGER, ftype2_key, ftype2attr,&
+             & ierr )
+        call fmpi2readtype( MPI_INTEGER, ftype2_key, attrval, "F2 type&
+             & to F2", errs )
+        if (aintSize .eq. ptrSize) then
+           call MPI_TYPE_DUP( MPI_INTEGER, tdup, ierr )
+           call cmpif2readtype( tdup, ftype2_key, attrval + 1, errs, "F2 &
+                &type toF dup" )
+           call MPI_TYPE_FREE( tdup, ierr )
+        endif
+
+        fwin2attr = bigaint()-9
+        attrval    = fwin2attr
+        call MPI_WIN_SET_ATTR( win, fwin2_key, fwin2attr, ierr )
+        call cmpif2readwin( win, fwin2_key, attrval, errs, "F2 win to &
+             &c" )
+!
+        fcomm2attr = -bigaint()
+        attrval    = fcomm2attr
+        call MPI_COMM_SET_ATTR( MPI_COMM_SELF, fcomm2_key, fcomm2attr,&
+             & ierr )
+        call fmpi2read( MPI_COMM_SELF, fcomm2_key, attrval, "F2 to F2",&
+             & errs )
+        if (aintSize .eq. ptrSize) then
+           call MPI_COMM_DUP( MPI_COMM_SELF, fdup, ierr )
+           call cmpif2read( fdup, fcomm2_key, attrval + 1, errs, "F2 t&
+                &o c dup")
+           call MPI_COMM_FREE( fdup, ierr )
+        endif
+!
+        ftype2attr = -(bigaint()-9)
+        attrval    = ftype2attr
+        call MPI_TYPE_SET_ATTR( MPI_INTEGER, ftype2_key, ftype2attr,&
+             & ierr )
+        call fmpi2readtype( MPI_INTEGER, ftype2_key, attrval, "F2 type&
+             & to F2", errs )
+        if (aintSize .eq. ptrSize) then
+           call MPI_TYPE_DUP( MPI_INTEGER, tdup, ierr )
+           call cmpif2readtype( tdup, ftype2_key, attrval + 1, errs, "F2 &
+                &type toF dup" )
+           call MPI_TYPE_FREE( tdup, ierr )
+        endif
+
+        fwin2attr = -(bigaint()-9)
+        attrval    = fwin2attr
+        call MPI_WIN_SET_ATTR( win, fwin2_key, fwin2attr, ierr )
+        call cmpif2readwin( win, fwin2_key, attrval, errs, "F2 win to &
+             &c" )
+
+      end subroutine f2toctest
+!
+      subroutine ctof2test(errs)
+        use mpi_f08
+        use keyvals
+        implicit none
+        integer errs
+        integer ierr
+        TYPE(MPI_Comm) fdup
+        TYPE(MPI_Datatype) tdup
+        integer (kind=MPI_ADDRESS_KIND) fcomm2attr, ftype2attr,&
+             & fwin2attr, attrval
+!
+        fcomm2attr = bigaint()
+        attrval    = fcomm2attr
+        call csetmpi2( MPI_COMM_SELF, fcomm2_key, fcomm2attr, errs )
+        call fmpi2read( MPI_COMM_SELF, fcomm2_key, attrval, "c to F2",&
+             & errs )
+        if (aintSize .eq. ptrSize) then
+           call MPI_COMM_DUP( MPI_COMM_SELF, fdup, ierr )
+           call fmpi2read( fdup, fcomm2_key, attrval + 1, "c to F2 dup",&
+                & errs )
+           call MPI_COMM_FREE( fdup, ierr )
+        endif
+!
+        ftype2attr = bigaint()-9
+        attrval    = ftype2attr
+        call csetmpitype( MPI_INTEGER, ftype2_key, ftype2attr, errs )
+        call fmpi2readtype( MPI_INTEGER, ftype2_key, attrval, "c type&
+             & to F2", errs )
+        if (aintSize .eq. ptrSize) then
+           call MPI_TYPE_DUP( MPI_INTEGER, tdup, ierr )
+           call fmpi2readtype( tdup, ftype2_key, attrval + 1, "c type to&
+                & F2 dup", errs )
+           call MPI_TYPE_FREE( tdup, ierr )
+        endif
+
+        fwin2attr = bigaint()-9
+        attrval    = fwin2attr
+        call csetmpiwin( win%MPI_VAL, fwin2_key, fwin2attr, errs )
+        call fmpi2readwin( win, fwin2_key, attrval, "c win to F2",&
+             & errs )
+!
+        fcomm2attr = -bigaint()
+        attrval    = fcomm2attr
+        call csetmpi2( MPI_COMM_SELF, fcomm2_key, fcomm2attr, errs )
+        call fmpi2read( MPI_COMM_SELF, fcomm2_key, attrval, "c to F2",&
+             & errs )
+        if (aintSize .eq. ptrSize) then
+           call MPI_COMM_DUP( MPI_COMM_SELF, fdup, ierr )
+           call fmpi2read( fdup, fcomm2_key, attrval + 1, "c to F2 dup",&
+                & errs )
+           call MPI_COMM_FREE( fdup, ierr )
+        endif
+!
+        ftype2attr = -(bigaint()-9)
+        attrval    = ftype2attr
+        call csetmpitype( MPI_INTEGER, ftype2_key, ftype2attr, errs )
+        call fmpi2readtype( MPI_INTEGER, ftype2_key, attrval, "c type&
+             & to F2", errs )
+        if (aintSize .eq. ptrSize) then
+           call MPI_TYPE_DUP( MPI_INTEGER, tdup, ierr )
+           call fmpi2readtype( tdup, ftype2_key, attrval + 1, "c type to&
+                & F2 dup", errs )
+           call MPI_TYPE_FREE( tdup, ierr )
+        endif
+
+        fwin2attr = -(bigaint()-9)
+        attrval    = fwin2attr
+        call csetmpiwin( win, fwin2_key, fwin2attr, errs )
+        call fmpi2readwin( win, fwin2_key, attrval, "c win to F2",&
+             & errs )
+
+      end subroutine ctof2test
+
+! -------------------------------------------------------------------
+! Return an integer value that fills all of the bytes
+      pure integer function bigint()
+        integer i, v, digits
+        digits = range(i)
+        v = 0
+        do i=1,digits
+           v = v * 10 + i
+        enddo
+        bigint = v
+        return
+      end function bigint
+!
+! Return an integer value that fill all of the bytes in an AINT
+! The logical "useintsize" allows us to specify that only an int-sized
+! result should be returned
+      pure function bigaint()
+        use mpi_f08, only : MPI_ADDRESS_KIND
+        use keyvals, only : useintsize
+        implicit none
+        integer (kind=MPI_ADDRESS_KIND) bigaint, v
+        integer i, digits
+        if (useintsize) then
+           digits = range(i)
+        else
+           digits = range(v)
+        endif
+        v = 0
+        do i=1,digits
+           v = v * 10 + i
+        enddo
+        bigaint = v
+        return
+      end function bigaint
diff --git a/test/mpi/f08/attr/attrmpi1f08.f90 b/test/mpi/f08/attr/attrmpi1f08.f90
new file mode 100644
index 0000000..242ee1b
--- /dev/null
+++ b/test/mpi/f08/attr/attrmpi1f08.f90
@@ -0,0 +1,63 @@
+! This file created from test/mpi/f77/attr/attrmpi1f.f with f77tof90
+! -*- Mode: Fortran; -*-
+!
+!  (C) 2003 by Argonne National Laboratory.
+!      See COPYRIGHT in top-level directory.
+!
+      program main
+      use mpi
+      integer value, wsize, wrank, extra, mykey
+      integer rvalue, svalue
+      TYPE(MPI_Comm) ncomm
+      logical flag
+      integer ierr, errs
+!
+      errs = 0
+      call mtest_init( ierr )
+      call mpi_comm_size( MPI_COMM_WORLD, wsize, ierr )
+      call mpi_comm_rank( MPI_COMM_WORLD, wrank, ierr )
+!
+!     Simple attribute put and get
+!
+      call mpi_keyval_create( MPI_NULL_COPY_FN, MPI_NULL_DELETE_FN, &
+      &     mykey, extra,ierr )
+      call mpi_attr_get( MPI_COMM_WORLD, mykey, value, flag, ierr )
+      if (flag) then
+         errs = errs + 1
+         print *, &
+      &       "Did not get flag==.false. for attribute that was not set"
+      endif
+!
+      value = 1234567
+      svalue = value
+      call mpi_attr_put( MPI_COMM_WORLD, mykey, value, ierr )
+      value = -9876543
+      call mpi_attr_get( MPI_COMM_WORLD, mykey, rvalue, flag, ierr )
+      if (.not. flag) then
+         errs = errs + 1
+         print *, "Did not find attribute after set"
+      else
+         if (rvalue .ne. svalue) then
+            errs = errs + 1
+            print *, "Attribute value ", rvalue, " should be ", svalue
+         endif
+      endif
+      value = -123456
+      svalue = value
+      call mpi_attr_put( MPI_COMM_WORLD, mykey, value, ierr )
+      value = 987654
+      call mpi_attr_get( MPI_COMM_WORLD, mykey, rvalue, flag, ierr )
+      if (.not. flag) then
+         errs = errs + 1
+         print *, "Did not find attribute after set (neg)"
+      else
+         if (rvalue .ne. svalue) then
+            errs = errs + 1
+            print *, "Neg Attribute value ", rvalue," should be ",svalue
+         endif
+      endif
+!
+      call mpi_keyval_free( mykey, ierr )
+      call mtest_finalize( errs )
+      call mpi_finalize( ierr )
+      end
diff --git a/test/mpi/f08/attr/baseattr2f08.f90 b/test/mpi/f08/attr/baseattr2f08.f90
new file mode 100644
index 0000000..61ffc48
--- /dev/null
+++ b/test/mpi/f08/attr/baseattr2f08.f90
@@ -0,0 +1,113 @@
+! This file created from test/mpi/f77/attr/baseattr2f.f with f77tof90
+! -*- Mode: Fortran; -*-
+!
+!
+! (C) 2001 by Argonne National Laboratory.
+!     See COPYRIGHT in top-level directory.
+!
+        program main
+        use mpi_f08
+        integer ierr, errs
+        logical flag
+        integer value, commsize, commrank
+
+        errs = 0
+        call mpi_init( ierr )
+
+        call mpi_comm_size( MPI_COMM_WORLD, commsize, ierr )
+        call mpi_comm_rank( MPI_COMM_WORLD, commrank, ierr )
+
+        call mpi_attr_get( MPI_COMM_WORLD, MPI_TAG_UB, value, flag, ierr &
+      &       )
+        if (.not. flag) then
+           errs = errs + 1
+           print *, "Could not get TAG_UB"
+        else
+           if (value .lt. 32767) then
+              errs = errs + 1
+              print *, "Got too-small value (", value, ") for TAG_UB"
+           endif
+        endif
+
+        call mpi_attr_get( MPI_COMM_WORLD, MPI_HOST, value, flag, ierr )
+        if (.not. flag) then
+           errs = errs + 1
+           print *, "Could not get HOST"
+        else
+           if ((value .lt. 0 .or. value .ge. commsize) .and. value .ne. &
+      &          MPI_PROC_NULL) then
+              errs = errs + 1
+              print *, "Got invalid value ", value, " for HOST"
+           endif
+        endif
+
+        call mpi_attr_get( MPI_COMM_WORLD, MPI_IO, value, flag, ierr )
+        if (.not. flag) then
+           errs = errs + 1
+           print *, "Could not get IO"
+        else
+           if ((value .lt. 0 .or. value .ge. commsize) .and. value .ne. &
+      &          MPI_ANY_SOURCE .and. value .ne. MPI_PROC_NULL) then
+              errs = errs + 1
+              print *, "Got invalid value ", value, " for IO"
+           endif
+        endif
+
+        call mpi_attr_get( MPI_COMM_WORLD, MPI_WTIME_IS_GLOBAL, value, &
+      &       flag, ierr )
+        if (flag) then
+!          Wtime need not be set
+           if (value .lt.  0 .or. value .gt. 1) then
+              errs = errs + 1
+              print *, "Invalid value for WTIME_IS_GLOBAL (got ", value, &
+      &             ")"
+           endif
+        endif
+
+        call mpi_attr_get( MPI_COMM_WORLD, MPI_APPNUM, value, flag, ierr &
+      &       )
+!     appnum need not be set
+        if (flag) then
+           if (value .lt. 0) then
+              errs = errs + 1
+              print *, "MPI_APPNUM is defined as ", value, &
+      &             " but must be nonnegative"
+           endif
+        endif
+
+        call mpi_attr_get( MPI_COMM_WORLD, MPI_UNIVERSE_SIZE, value, &
+      &       flag, ierr )
+!     MPI_UNIVERSE_SIZE need not be set
+        if (flag) then
+           if (value .lt. commsize) then
+              errs = errs + 1
+              print *, "MPI_UNIVERSE_SIZE = ", value, &
+      &             ", less than comm world (", commsize, ")"
+           endif
+        endif
+
+        call mpi_attr_get( MPI_COMM_WORLD, MPI_LASTUSEDCODE, value, flag &
+      &       , ierr )
+! Last used code must be defined and >= MPI_ERR_LASTCODE
+        if (flag) then
+           if (value .lt. MPI_ERR_LASTCODE) then
+            errs = errs + 1
+            print *, "MPI_LASTUSEDCODE points to an integer (", &
+      &           MPI_ERR_LASTCODE, ") smaller than MPI_ERR_LASTCODE (", &
+      &           value, ")"
+            endif
+         else
+            errs = errs + 1
+            print *, "MPI_LASTUSECODE is not defined"
+         endif
+
+!     Check for errors
+      if (errs .eq. 0) then
+         print *, " No Errors"
+      else
+         print *, " Found ", errs, " errors"
+      endif
+
+      call MPI_Finalize( ierr )
+
+      end
diff --git a/test/mpi/f08/attr/baseattr3f08.f90 b/test/mpi/f08/attr/baseattr3f08.f90
new file mode 100644
index 0000000..bf29eae
--- /dev/null
+++ b/test/mpi/f08/attr/baseattr3f08.f90
@@ -0,0 +1,118 @@
+! -*- Mode: Fortran; -*-
+!
+!
+! (C) 2012 by Argonne National Laboratory.
+!     See COPYRIGHT in top-level directory.
+!
+! This is a MPI-2 version of baseattr2f90.f90 which uses COMM_GET_ATTR
+! instead of ATTR_GET, using an address-sized integer instead of
+! an INTEGER.
+        program main
+        use mpi_f08
+        integer ierr, errs
+        logical flag
+        integer commsize, commrank
+        integer (KIND=MPI_ADDRESS_KIND) value
+
+        errs = 0
+        call mpi_init( ierr )
+
+        call mpi_comm_size( MPI_COMM_WORLD, commsize, ierr )
+        call mpi_comm_rank( MPI_COMM_WORLD, commrank, ierr )
+
+        call mpi_comm_get_attr( MPI_COMM_WORLD, MPI_TAG_UB, value,   &
+             & flag, ierr )
+        if (.not. flag) then
+           errs = errs + 1
+           print *, "Could not get TAG_UB"
+        else
+           if (value .lt. 32767) then
+              errs = errs + 1
+              print *, "Got too-small value (", value, ") for TAG_UB"
+           endif
+        endif
+
+        call mpi_comm_get_attr( MPI_COMM_WORLD, MPI_HOST, value, flag&
+             &, ierr )
+        if (.not. flag) then
+           errs = errs + 1
+           print *, "Could not get HOST"
+        else
+           if ((value .lt. 0 .or. value .ge. commsize) .and. value .ne. &
+      &          MPI_PROC_NULL) then
+              errs = errs + 1
+              print *, "Got invalid value ", value, " for HOST"
+           endif
+        endif
+
+        call mpi_comm_get_attr( MPI_COMM_WORLD, MPI_IO, value, flag,&
+             & ierr )
+        if (.not. flag) then
+           errs = errs + 1
+           print *, "Could not get IO"
+        else
+           if ((value .lt. 0 .or. value .ge. commsize) .and. value .ne. &
+      &          MPI_ANY_SOURCE .and. value .ne. MPI_PROC_NULL) then
+              errs = errs + 1
+              print *, "Got invalid value ", value, " for IO"
+           endif
+        endif
+
+        call mpi_comm_get_attr( MPI_COMM_WORLD, MPI_WTIME_IS_GLOBAL,&
+             & value, flag, ierr )
+        if (flag) then
+!          Wtime need not be set
+           if (value .lt.  0 .or. value .gt. 1) then
+              errs = errs + 1
+              print *, "Invalid value for WTIME_IS_GLOBAL (got ", value, &
+      &             ")"
+           endif
+        endif
+
+        call mpi_comm_get_attr( MPI_COMM_WORLD, MPI_APPNUM, value,&
+             & flag, ierr )
+!     appnum need not be set
+        if (flag) then
+           if (value .lt. 0) then
+              errs = errs + 1
+              print *, "MPI_APPNUM is defined as ", value, &
+      &             " but must be nonnegative"
+           endif
+        endif
+
+        call mpi_comm_get_attr( MPI_COMM_WORLD, MPI_UNIVERSE_SIZE,&
+             & value, flag, ierr )
+!     MPI_UNIVERSE_SIZE need not be set
+        if (flag) then
+           if (value .lt. commsize) then
+              errs = errs + 1
+              print *, "MPI_UNIVERSE_SIZE = ", value, &
+      &             ", less than comm world (", commsize, ")"
+           endif
+        endif
+
+        call mpi_comm_get_attr( MPI_COMM_WORLD, MPI_LASTUSEDCODE,&
+             & value, flag, ierr )
+! Last used code must be defined and >= MPI_ERR_LASTCODE
+        if (flag) then
+           if (value .lt. MPI_ERR_LASTCODE) then
+            errs = errs + 1
+            print *, "MPI_LASTUSEDCODE points to an integer (", &
+      &           MPI_ERR_LASTCODE, ") smaller than MPI_ERR_LASTCODE (", &
+      &           value, ")"
+            endif
+         else
+            errs = errs + 1
+            print *, "MPI_LASTUSECODE is not defined"
+         endif
+
+!     Check for errors
+      if (errs .eq. 0) then
+         print *, " No Errors"
+      else
+         print *, " Found ", errs, " errors"
+      endif
+
+      call MPI_Finalize( ierr )
+
+      end
diff --git a/test/mpi/f08/attr/baseattrf08.f90 b/test/mpi/f08/attr/baseattrf08.f90
new file mode 100644
index 0000000..9af3309
--- /dev/null
+++ b/test/mpi/f08/attr/baseattrf08.f90
@@ -0,0 +1,63 @@
+! This file created from test/mpi/f77/attr/baseattrf.f with f77tof90
+! -*- Mode: Fortran; -*-
+!
+!  (C) 2003 by Argonne National Laboratory.
+!      See COPYRIGHT in top-level directory.
+!
+      program main
+      use mpi_f08
+      integer value, commsize
+      logical flag
+      integer ierr, errs
+
+      errs = 0
+      call mpi_init( ierr )
+
+      call mpi_comm_size( MPI_COMM_WORLD, commsize, ierr )
+      call mpi_attr_get( MPI_COMM_WORLD, MPI_UNIVERSE_SIZE, value, flag &
+      &     , ierr)
+      ! MPI_UNIVERSE_SIZE need not be set
+      if (flag) then
+         if (value .lt. commsize) then
+            print *, "MPI_UNIVERSE_SIZE is ", value, " less than world " &
+      &           , commsize
+            errs = errs + 1
+         endif
+      endif
+
+      call mpi_attr_get( MPI_COMM_WORLD, MPI_LASTUSEDCODE, value, flag, &
+      &     ierr )
+      ! Last used code must be defined and >= MPI_ERR_LASTCODE
+      if (flag) then
+         if (value .lt. MPI_ERR_LASTCODE) then
+            errs = errs + 1
+            print *, "MPI_LASTUSEDCODE points to an integer &
+      &           (", value, ") smaller than MPI_ERR_LASTCODE (", &
+      &           MPI_ERR_LASTCODE, ")"
+         endif
+      else
+         errs = errs + 1
+         print *, "MPI_LASTUSECODE is not defined"
+      endif
+
+      call mpi_attr_get( MPI_COMM_WORLD, MPI_APPNUM, value, flag, ierr )
+      ! appnum need not be set
+      if (flag) then
+         if (value .lt. 0) then
+            errs = errs + 1
+            print *, "MPI_APPNUM is defined as ", value, &
+      &           " but must be nonnegative"
+         endif
+      endif
+
+      ! Check for errors
+      if (errs .eq. 0) then
+         print *, " No Errors"
+      else
+         print *, " Found ", errs, " errors"
+      endif
+
+      call MPI_Finalize( ierr )
+
+      end
+
diff --git a/test/mpi/f08/attr/commattr2f08.f90 b/test/mpi/f08/attr/commattr2f08.f90
new file mode 100644
index 0000000..1bb0050
--- /dev/null
+++ b/test/mpi/f08/attr/commattr2f08.f90
@@ -0,0 +1,104 @@
+! This file created from test/mpi/f77/attr/commattr2f.f with f77tof90
+! -*- Mode: Fortran; -*-
+!
+!  (C) 2003 by Argonne National Laboratory.
+!      See COPYRIGHT in top-level directory.
+!  This is a modified version of commattrf.f that uses two of the
+!  default functions
+!
+      program main
+      use mpi_f08
+      integer errs, ierr
+      integer (kind=MPI_ADDRESS_KIND) extrastate, valin, valout, val
+
+      TYPE(MPI_Comm) comm1, comm2
+      integer keyval
+      logical flag
+!
+! The only difference between the MPI-2 and MPI-1 attribute caching
+! routines in Fortran is that the take an address-sized integer
+! instead of a simple integer.  These still are not pointers,
+! so the values are still just integers.
+!
+      errs      = 0
+      call mtest_init( ierr )
+      call mpi_comm_dup( MPI_COMM_WORLD, comm1, ierr )
+!
+      extrastate = 1001
+      call mpi_comm_create_keyval( MPI_COMM_DUP_FN,  &
+      &                             MPI_COMM_NULL_DELETE_FN, keyval,  &
+      &                             extrastate, ierr )
+      flag = .true.
+      call mpi_comm_get_attr( comm1, keyval, valout, flag, ierr )
+      if (flag) then
+         errs = errs + 1
+         print *, ' get attr returned true when no attr set'
+      endif
+
+      valin = 2003
+      call mpi_comm_set_attr( comm1, keyval, valin, ierr )
+      flag = .false.
+      valout = -1
+      call mpi_comm_get_attr( comm1, keyval, valout, flag, ierr )
+      if (valout .ne. 2003) then
+         errs = errs + 1
+         print *, 'Unexpected value (should be 2003)', valout,  &
+      &            ' from attr'
+      endif
+
+      valin = 2001
+      call mpi_comm_set_attr( comm1, keyval, valin, ierr )
+      flag = .false.
+      valout = -1
+      call mpi_comm_get_attr( comm1, keyval, valout, flag, ierr )
+      if (valout .ne. 2001) then
+         errs = errs + 1
+         print *, 'Unexpected value (should be 2001)', valout,  &
+      &            ' from attr'
+      endif
+
+!
+! Test the copy function
+      valin = 5001
+      call mpi_comm_set_attr( comm1, keyval, valin, ierr )
+      call mpi_comm_dup( comm1, comm2, ierr )
+      flag = .false.
+      call mpi_comm_get_attr( comm1, keyval, valout, flag, ierr )
+      if (valout .ne. 5001) then
+         errs = errs + 1
+         print *, 'Unexpected output value in comm ', valout
+      endif
+      flag = .false.
+      call mpi_comm_get_attr( comm2, keyval, valout, flag, ierr )
+      if (valout .ne. 5001) then
+         errs = errs + 1
+         print *, 'Unexpected output value in comm2 ', valout
+      endif
+! Test the delete function
+      call mpi_comm_free( comm2, ierr )
+!
+! Test the attr delete function
+      call mpi_comm_dup( comm1, comm2, ierr )
+      valin      = 6001
+      extrastate = 1001
+      call mpi_comm_set_attr( comm2, keyval, valin, ierr )
+      call mpi_comm_delete_attr( comm2, keyval, ierr )
+      flag = .true.
+      call mpi_comm_get_attr( comm2, keyval, valout, flag, ierr )
+      if (flag) then
+         errs = errs + 1
+         print *, ' Delete_attr did not delete attribute'
+      endif
+      call mpi_comm_free( comm2, ierr )
+!
+      ierr = -1
+      call mpi_comm_free_keyval( keyval, ierr )
+      if (ierr .ne. MPI_SUCCESS) then
+         errs = errs + 1
+         call mtestprinterror( ierr )
+      endif
+      call mpi_comm_free( comm1, ierr )
+
+      call mtest_finalize( errs )
+      call mpi_finalize( ierr )
+      end
diff --git a/test/mpi/f08/attr/commattr3f08.f90 b/test/mpi/f08/attr/commattr3f08.f90
new file mode 100644
index 0000000..0afaf95
--- /dev/null
+++ b/test/mpi/f08/attr/commattr3f08.f90
@@ -0,0 +1,85 @@
+! This file created from test/mpi/f77/attr/commattr3f.f with f77tof90
+! -*- Mode: Fortran; -*-
+!
+!  (C) 2004 by Argonne National Laboratory.
+!      See COPYRIGHT in top-level directory.
+!
+!  This tests the null copy function (returns flag false; thus the
+!  attribute should not be propagated to a dup'ed communicator
+!  This is must like the test in commattr2f
+!
+      program main
+      use mpi_f08
+      integer errs, ierr
+      integer (kind=MPI_ADDRESS_KIND) extrastate, valin, valout, val
+
+      TYPE(MPI_Comm) comm1, comm2
+      integer keyval
+      logical flag
+!
+! The only difference between the MPI-2 and MPI-1 attribute caching
+! routines in Fortran is that the take an address-sized integer
+! instead of a simple integer.  These still are not pointers,
+! so the values are still just integers.
+!
+      errs      = 0
+      call mtest_init( ierr )
+      call mpi_comm_dup( MPI_COMM_WORLD, comm1, ierr )
+!
+      extrastate = 1001
+      call mpi_comm_create_keyval( MPI_COMM_NULL_COPY_FN,  &
+      &                             MPI_COMM_NULL_DELETE_FN, keyval,  &
+      &                             extrastate, ierr )
+      flag = .true.
+      call mpi_comm_get_attr( comm1, keyval, valout, flag, ierr )
+      if (flag) then
+         errs = errs + 1
+         print *, ' get attr returned true when no attr set'
+      endif
+
+! Test the null copy function
+      valin = 5001
+      call mpi_comm_set_attr( comm1, keyval, valin, ierr )
+      call mpi_comm_dup( comm1, comm2, ierr )
+! Because we set NULL_COPY_FN, the attribute should not
+! appear on the dup'ed communicator
+      flag = .false.
+      call mpi_comm_get_attr( comm1, keyval, valout, flag, ierr )
+      if (valout .ne. 5001) then
+         errs = errs + 1
+         print *, 'Unexpected output value in comm ', valout
+      endif
+      flag = .true.
+      call mpi_comm_get_attr( comm2, keyval, valout, flag, ierr )
+      if (flag) then
+         errs = errs + 1
+         print *, ' Attribute incorrectly present on dup communicator'
+      endif
+! Test the delete function
+      call mpi_comm_free( comm2, ierr )
+!
+! Test the attr delete function
+      call mpi_comm_dup( comm1, comm2, ierr )
+      valin      = 6001
+      extrastate = 1001
+      call mpi_comm_set_attr( comm2, keyval, valin, ierr )
+      call mpi_comm_delete_attr( comm2, keyval, ierr )
+      flag = .true.
+      call mpi_comm_get_attr( comm2, keyval, valout, flag, ierr )
+      if (flag) then
+         errs = errs + 1
+         print *, ' Delete_attr did not delete attribute'
+      endif
+      call mpi_comm_free( comm2, ierr )
+!
+      ierr = -1
+      call mpi_comm_free_keyval( keyval, ierr )
+      if (ierr .ne. MPI_SUCCESS) then
+         errs = errs + 1
+         call mtestprinterror( ierr )
+      endif
+      call mpi_comm_free( comm1, ierr )
+
+      call mtest_finalize( errs )
+      call mpi_finalize( ierr )
+      end
diff --git a/test/mpi/f08/attr/commattrf08.f90 b/test/mpi/f08/attr/commattrf08.f90
new file mode 100644
index 0000000..6652644
--- /dev/null
+++ b/test/mpi/f08/attr/commattrf08.f90
@@ -0,0 +1,155 @@
+! This file created from test/mpi/f77/attr/commattrf.f with f77tof90
+! -*- Mode: Fortran; -*-
+!
+!  (C) 2003 by Argonne National Laboratory.
+!      See COPYRIGHT in top-level directory.
+!
+      program main
+      use mpi_f08
+      integer errs, ierr
+      integer (kind=MPI_ADDRESS_KIND) extrastate, valin, valout, val
+
+      TYPE(MPI_Comm) comm1, comm2
+      integer curcount, keyval
+      logical flag
+      external mycopyfn, mydelfn
+      integer callcount, delcount
+      common /myattr/ callcount, delcount
+!
+! The only difference between the MPI-2 and MPI-1 attribute caching
+! routines in Fortran is that the take an address-sized integer
+! instead of a simple integer.  These still are not pointers,
+! so the values are still just integers.
+!
+      errs      = 0
+      callcount = 0
+      delcount  = 0
+      call mtest_init( ierr )
+      call mpi_comm_dup( MPI_COMM_WORLD, comm1, ierr )
+!
+      extrastate = 1001
+      call mpi_comm_create_keyval( mycopyfn, mydelfn, keyval,  &
+      &                             extrastate, ierr )
+      flag = .true.
+      call mpi_comm_get_attr( comm1, keyval, valout, flag, ierr )
+      if (flag) then
+         errs = errs + 1
+         print *, ' get attr returned true when no attr set'
+      endif
+
+      valin = 2003
+      call mpi_comm_set_attr( comm1, keyval, valin, ierr )
+      flag = .false.
+      valout = -1
+      call mpi_comm_get_attr( comm1, keyval, valout, flag, ierr )
+      if (valout .ne. 2003) then
+         errs = errs + 1
+         print *, 'Unexpected value (should be 2003)', valout,  &
+      &            ' from attr'
+      endif
+
+      valin = 2001
+      call mpi_comm_set_attr( comm1, keyval, valin, ierr )
+      flag = .false.
+      valout = -1
+      call mpi_comm_get_attr( comm1, keyval, valout, flag, ierr )
+      if (valout .ne. 2001) then
+         errs = errs + 1
+         print *, 'Unexpected value (should be 2001)', valout,  &
+      &            ' from attr'
+      endif
+
+!
+! Test the copy function
+      valin = 5001
+      call mpi_comm_set_attr( comm1, keyval, valin, ierr )
+      call mpi_comm_dup( comm1, comm2, ierr )
+      flag = .false.
+      call mpi_comm_get_attr( comm1, keyval, valout, flag, ierr )
+      if (valout .ne. 5001) then
+         errs = errs + 1
+         print *, 'Unexpected output value in comm ', valout
+      endif
+      flag = .false.
+      call mpi_comm_get_attr( comm2, keyval, valout, flag, ierr )
+      if (valout .ne. 5003) then
+         errs = errs + 1
+         print *, 'Unexpected output value in comm2 ', valout
+      endif
+! Test the delete function
+      curcount = delcount
+      call mpi_comm_free( comm2, ierr )
+      if (delcount .ne. curcount + 1) then
+         errs = errs + 1
+         print *, ' did not get expected value of delcount ',  &
+      &          delcount, curcount + 1
+      endif
+!
+! Test the attr delete function
+      call mpi_comm_dup( comm1, comm2, ierr )
+      valin      = 6001
+      extrastate = 1001
+      call mpi_comm_set_attr( comm2, keyval, valin, ierr )
+      delcount   = 0
+      call mpi_comm_delete_attr( comm2, keyval, ierr )
+      if (delcount .ne. 1) then
+         errs = errs + 1
+         print *, ' Delete_attr did not call delete function'
+      endif
+      flag = .true.
+      call mpi_comm_get_attr( comm2, keyval, valout, flag, ierr )
+      if (flag) then
+         errs = errs + 1
+         print *, ' Delete_attr did not delete attribute'
+      endif
+      call mpi_comm_free( comm2, ierr )
+!
+      ierr = -1
+      call mpi_comm_free_keyval( keyval, ierr )
+      if (ierr .ne. MPI_SUCCESS) then
+         errs = errs + 1
+         call mtestprinterror( ierr )
+      endif
+      call mpi_comm_free( comm1, ierr )
+
+      call mtest_finalize( errs )
+      call mpi_finalize( ierr )
+      end
+!
+      subroutine mycopyfn( oldcomm, keyval, extrastate, valin, valout, &
+      &                     flag, ierr )
+      use mpi
+      integer oldcomm, keyval, ierr
+      integer (kind=MPI_ADDRESS_KIND) extrastate, valin, valout, val
+
+      logical flag
+      integer callcount, delcount
+      common /myattr/ callcount, delcount
+! increment the attribute by 2
+      valout = valin + 2
+      callcount = callcount + 1
+      if (extrastate .eq. 1001) then
+         flag = .true.
+         ierr = MPI_SUCCESS
+      else
+         print *, ' Unexpected value of extrastate = ', extrastate
+         flag = .false.
+         ierr = MPI_ERR_OTHER
+      endif
+      end
+!
+      subroutine mydelfn( comm, keyval, val, extrastate, ierr )
+      use mpi
+      integer comm, keyval, ierr
+      integer (kind=MPI_ADDRESS_KIND) extrastate, valin, valout, val
+
+      integer callcount, delcount
+      common /myattr/ callcount, delcount
+      delcount = delcount + 1
+      if (extrastate .eq. 1001) then
+         ierr = MPI_SUCCESS
+      else
+         print *, ' Unexpected value of extrastate = ', extrastate
+         ierr = MPI_ERR_OTHER
+      endif
+      end
diff --git a/test/mpi/f08/attr/fandcattrc.c b/test/mpi/f08/attr/fandcattrc.c
new file mode 100644
index 0000000..e084338
--- /dev/null
+++ b/test/mpi/f08/attr/fandcattrc.c
@@ -0,0 +1,121 @@
+/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
+/*
+ *
+ *  (C) 2001 by Argonne National Laboratory.
+ *      See COPYRIGHT in top-level directory.
+ */
+
+/* style: allow:fprintf:10 sig:0 */
+#include <stdio.h>
+#include "mpi.h"
+#include "../../include/mpitestconf.h"
+#include <string.h>
+
+/*
+   Name mapping.  All routines are created with names that are lower case
+   with a single trailing underscore.  This matches many compilers.
+   We use #define to change the name for Fortran compilers that do
+   not use the lowercase/underscore pattern
+*/
+
+#ifdef F77_NAME_UPPER
+#define chkcomm2inc_ CHKCOMM2INC
+#define chkckeyvals_ CHKCKEYVALS
+
+#elif defined(F77_NAME_LOWER) || defined(F77_NAME_MIXED)
+/* Mixed is ok because we use lowercase in all uses */
+#define chkcomm2inc_ chkcomm2inc
+#define chkckeyvals_ chkckeyvals
+
+#elif defined(F77_NAME_LOWER_2USCORE) || defined(F77_NAME_LOWER_USCORE) || \
+      defined(F77_NAME_MIXED_USCORE)
+/* Else leave name alone (routines have no underscore, so both
+   of these map to a lowercase, single underscore) */
+#else
+#error 'Unrecognized Fortran name mapping'
+#endif
+
+
+int chkcomm2inc_ (int *keyval, const int *expected, int *ierr);
+int chkcomm2inc_ (int *keyval, const int *expected, int *ierr)
+{
+    int      flag;
+    MPI_Aint *val;
+
+    /* See Example 16.19 in MPI 2.2, part B.  The use of MPI_Aint *val
+       and the address of val in the get_attr call is correct, as is
+       the use of *val to access the value. */
+    MPI_Comm_get_attr( MPI_COMM_WORLD, *keyval, &val, &flag );
+    if (!flag) {
+	*ierr = 1;
+    }
+    else {
+	if (*val != *expected) {
+	    /* In some cases, using printf from a c routine linked
+	       with a Fortran routine can cause linking difficulties.
+	       To avoid problems in running the tests, this print
+	       is commented out */
+	    /* printf( "Val = %x, expected = %d\n", val, *expected ); */
+	    *ierr = *ierr + 1;
+	}
+    }
+    return 0;
+}
+
+/* Attribute delete and copy functions for each type */
+int myCommCopyfn( MPI_Comm comm, int keyval, void *extra_state,
+		  void *attr_val_in, void *attr_val_out, int *flag );
+int myCommCopyfn( MPI_Comm comm, int keyval, void *extra_state,
+		  void *attr_val_in, void *attr_val_out, int *flag )
+{
+    *(void **)attr_val_out = (char *)attr_val_in + 2;
+    *flag = 1;
+    return MPI_SUCCESS;
+}
+
+int myCommDelfn( MPI_Comm comm, int keyval, void *attr_val, void *extra_state );
+int myCommDelfn( MPI_Comm comm, int keyval, void *attr_val, void *extra_state )
+{
+    return MPI_SUCCESS;
+}
+
+int myTypeCopyfn( MPI_Datatype dtype, int keyval, void *extra_state,
+		  void *attr_val_in, void *attr_val_out, int *flag );
+int myTypeCopyfn( MPI_Datatype dtype, int keyval, void *extra_state,
+		  void *attr_val_in, void *attr_val_out, int *flag )
+{
+    *(void **)attr_val_out = (char *)attr_val_in + 2;
+    *flag = 1;
+    return MPI_SUCCESS;
+}
+
+int myTypeDelfn( MPI_Datatype dtype, int keyval, void *attr_val, void *extra_state );
+int myTypeDelfn( MPI_Datatype dtype, int keyval, void *attr_val, void *extra_state )
+{
+    return MPI_SUCCESS;
+}
+
+int myWinCopyfn( MPI_Win win, int keyval, void *extra_state,
+		  void *attr_val_in, void *attr_val_out, int *flag );
+int myWinCopyfn( MPI_Win win, int keyval, void *extra_state,
+		  void *attr_val_in, void *attr_val_out, int *flag )
+{
+    *(void **)attr_val_out = (char *)attr_val_in + 2;
+    *flag = 1;
+    return MPI_SUCCESS;
+}
+
+int myWinDelfn( MPI_Win win, int keyval, void *attr_val, void *extra_state );
+int myWinDelfn( MPI_Win win, int keyval, void *attr_val, void *extra_state )
+{
+    return MPI_SUCCESS;
+}
+
+int chkckeyvals_( int *comm_keyval, int *type_keyval, int *win_keyval );
+int chkckeyvals_( int *comm_keyval, int *type_keyval, int *win_keyval )
+{
+    MPI_Comm_create_keyval( myCommCopyfn, myCommDelfn, comm_keyval, 0 );
+    MPI_Type_create_keyval( myTypeCopyfn, myTypeDelfn, type_keyval, 0 );
+    MPI_Win_create_keyval( myWinCopyfn, myWinDelfn, win_keyval, 0 );
+    return 0;
+}
diff --git a/test/mpi/f08/attr/fandcattrf08.f90 b/test/mpi/f08/attr/fandcattrf08.f90
new file mode 100644
index 0000000..f9a8f27
--- /dev/null
+++ b/test/mpi/f08/attr/fandcattrf08.f90
@@ -0,0 +1,138 @@
+! -*- Mode: Fortran; -*-
+!
+!  (C) 2008 by Argonne National Laboratory.
+!      See COPYRIGHT in top-level directory.
+!
+!
+! To do: Create a keyval from c, then change the attribute from Fortran,
+! then dup.  The C attribute copy function should be passed a pointer to
+! the Fortran attribute value (e.g., it should dereference it to check
+! its value)
+!
+      program main
+      use mpi_f08
+      integer (kind=MPI_ADDRESS_KIND) val
+      integer ierr, errs, fcomm2_keyval, ftype2_keyval
+      integer ccomm2_keyval, ctype2_keyval, cwin2_keyval
+      integer callcount, delcount
+      integer (kind=MPI_ADDRESS_KIND) commextra, typeextra
+      common /myattr/ callcount, delcount
+      external mycopyfn, mydelfn, mytcopyfn, mytdelfn
+
+      callcount = 0
+      delcount  = 0
+
+      errs      = 0
+      call mpi_init(ierr)
+      commextra = 1001
+      call mpi_comm_create_keyval( mycopyfn, mydelfn,                     &
+     &                             fcomm2_keyval, commextra, ierr )
+      typeextra = 2001
+      call mpi_type_create_keyval( mytcopyfn, mytdelfn,                   &
+                                   ftype2_keyval, typeextra, ierr )
+      call chkckeyvals( ccomm2_keyval, ctype2_keyval, cwin2_keyval )
+
+      ! Address-sized ints may be 32, 64, or something else in size;
+      ! we can't assume any particular size.  We can use the Fortran 90
+      ! intrinsic range to determine the available size and compute
+      ! a suitable value.
+      val = 5555
+      call mpi_comm_set_attr( MPI_COMM_WORLD, fcomm2_keyval, val, ierr )
+
+      call chkcomm2inc( fcomm2_keyval, 5555, errs )
+
+      call mpi_comm_free_keyval( fcomm2_keyval, ierr )
+      call mpi_type_free_keyval( ftype2_keyval, ierr )
+
+      call mpi_comm_free_keyval( ccomm2_keyval, ierr )
+      call mpi_type_free_keyval( ctype2_keyval, ierr )
+      call mpi_win_free_keyval( cwin2_keyval, ierr )
+
+      if (errs .eq. 0) then
+         print *, ' No Errors'
+      else
+         print *, ' Found ', errs, ' errors'
+      endif
+
+      call mpi_finalize(ierr)
+      end
+!
+      subroutine mycopyfn( oldcomm, keyval, extrastate, valin, valout, &
+      &                     flag, ierr )
+      use mpi_f08
+      integer keyval, ierr
+      TYPE(MPI_Comm) oldcomm
+      integer (kind=MPI_ADDRESS_KIND) extrastate, valin, valout, val
+
+      logical flag
+      integer callcount, delcount
+      common /myattr/ callcount, delcount
+! increment the attribute by 2
+      valout = valin + 2
+      callcount = callcount + 1
+      if (extrastate .eq. 1001) then
+         flag = .true.
+         ierr = MPI_SUCCESS
+      else
+         print *, ' Unexpected value of extrastate = ', extrastate
+         flag = .false.
+         ierr = MPI_ERR_OTHER
+      endif
+      end
+!
+      subroutine mydelfn( comm, keyval, val, extrastate, ierr )
+      use mpi_f08
+      integer keyval, ierr
+      TYPE(MPI_Comm) comm
+      integer (kind=MPI_ADDRESS_KIND) extrastate, valin, valout, val
+
+      integer callcount, delcount
+      common /myattr/ callcount, delcount
+      delcount = delcount + 1
+      if (extrastate .eq. 1001) then
+         ierr = MPI_SUCCESS
+      else
+         print *, ' Unexpected value of extrastate = ', extrastate
+         ierr = MPI_ERR_OTHER
+      endif
+      end
+!
+      subroutine mytcopyfn( oldtype, keyval, extrastate, valin, valout, &
+      &                     flag, ierr )
+      use mpi_f08
+      integer keyval, ierr
+      TYPE(MPI_Datatype) oldtype
+      integer (kind=MPI_ADDRESS_KIND) extrastate, valin, valout, val
+
+      logical flag
+      integer callcount, delcount
+      common /myattr/ callcount, delcount
+! increment the attribute by 2
+      valout = valin + 2
+      callcount = callcount + 1
+      if (extrastate .eq. 2001) then
+         flag = .true.
+         ierr = MPI_SUCCESS
+      else
+         print *, ' Unexpected value of extrastate = ', extrastate
+         flag = .false.
+         ierr = MPI_ERR_OTHER
+      endif
+      end
+!
+      subroutine mytdelfn( dtype, keyval, val, extrastate, ierr )
+      use mpi_f08
+      integer keyval, ierr
+      TYPE(MPI_Datatype) dtype
+      integer (kind=MPI_ADDRESS_KIND) extrastate, valin, valout, val
+
+      integer callcount, delcount
+      common /myattr/ callcount, delcount
+      delcount = delcount + 1
+      if (extrastate .eq. 2001) then
+         ierr = MPI_SUCCESS
+      else
+         print *, ' Unexpected value of extrastate = ', extrastate
+         ierr = MPI_ERR_OTHER
+      endif
+      end
diff --git a/test/mpi/f08/attr/testlist b/test/mpi/f08/attr/testlist
new file mode 100644
index 0000000..7c0dc32
--- /dev/null
+++ b/test/mpi/f08/attr/testlist
@@ -0,0 +1,12 @@
+attrmpi1f08 1
+baseattrf08 1
+baseattr2f08 1
+commattrf08 1
+commattr2f08 1
+commattr3f08 1
+typeattrf08 1
+typeattr2f08 1
+typeattr3f08 1
+fandcattrf08 1
+baseattr3f08 1
+attrlangf08 1
diff --git a/test/mpi/f08/attr/typeattr2f08.f90 b/test/mpi/f08/attr/typeattr2f08.f90
new file mode 100644
index 0000000..668e0e7
--- /dev/null
+++ b/test/mpi/f08/attr/typeattr2f08.f90
@@ -0,0 +1,103 @@
+! This file created from test/mpi/f77/attr/typeattr2f.f with f77tof90
+! -*- Mode: Fortran; -*-
+!
+!  (C) 2003 by Argonne National Laboratory.
+!      See COPYRIGHT in top-level directory.
+!  This is a modified version of typeattrf.f that uses two of the
+!  default functions
+!
+      program main
+      use mpi_f08
+      integer errs, ierr
+      integer (kind=MPI_ADDRESS_KIND) extrastate, valin, valout, val
+
+      TYPE(MPI_Datatype) type1, type2
+      integer keyval
+      logical flag
+!
+! The only difference between the MPI-2 and MPI-1 attribute caching
+! routines in Fortran is that the take an address-sized integer
+! instead of a simple integer.  These still are not pointers,
+! so the values are still just integers.
+!
+      errs      = 0
+      call mtest_init( ierr )
+      type1 = MPI_INTEGER
+!
+      extrastate = 1001
+      call mpi_type_create_keyval( MPI_TYPE_DUP_FN,  &
+      &                             MPI_TYPE_NULL_DELETE_FN, keyval,  &
+      &                             extrastate, ierr )
+      flag = .true.
+      call mpi_type_get_attr( type1, keyval, valout, flag, ierr )
+      if (flag) then
+         errs = errs + 1
+         print *, ' get attr returned true when no attr set'
+      endif
+
+      valin = 2003
+      call mpi_type_set_attr( type1, keyval, valin, ierr )
+      flag = .false.
+      valout = -1
+      call mpi_type_get_attr( type1, keyval, valout, flag, ierr )
+      if (valout .ne. 2003) then
+         errs = errs + 1
+         print *, 'Unexpected value (should be 2003)', valout,  &
+      &            ' from attr'
+      endif
+
+      valin = 2001
+      call mpi_type_set_attr( type1, keyval, valin, ierr )
+      flag = .false.
+      valout = -1
+      call mpi_type_get_attr( type1, keyval, valout, flag, ierr )
+      if (valout .ne. 2001) then
+         errs = errs + 1
+         print *, 'Unexpected value (should be 2001)', valout,  &
+      &            ' from attr'
+      endif
+
+!
+! Test the copy function
+      valin = 5001
+      call mpi_type_set_attr( type1, keyval, valin, ierr )
+      call mpi_type_dup( type1, type2, ierr )
+      flag = .false.
+      call mpi_type_get_attr( type1, keyval, valout, flag, ierr )
+      if (valout .ne. 5001) then
+         errs = errs + 1
+         print *, 'Unexpected output value in type ', valout
+      endif
+      flag = .false.
+      call mpi_type_get_attr( type2, keyval, valout, flag, ierr )
+      if (valout .ne. 5001) then
+         errs = errs + 1
+         print *, 'Unexpected output value in type2 ', valout
+      endif
+! Test the delete function
+      call mpi_type_free( type2, ierr )
+!
+! Test the attr delete function
+      call mpi_type_dup( type1, type2, ierr )
+      valin      = 6001
+      extrastate = 1001
+      call mpi_type_set_attr( type2, keyval, valin, ierr )
+      call mpi_type_delete_attr( type2, keyval, ierr )
+      flag = .true.
+      call mpi_type_get_attr( type2, keyval, valout, flag, ierr )
+      if (flag) then
+         errs = errs + 1
+         print *, ' Delete_attr did not delete attribute'
+      endif
+      call mpi_type_free( type2, ierr )
+!
+      ierr = -1
+      call mpi_type_free_keyval( keyval, ierr )
+      if (ierr .ne. MPI_SUCCESS) then
+         errs = errs + 1
+         call mtestprinterror( ierr )
+      endif
+
+      call mtest_finalize( errs )
+      call mpi_finalize( ierr )
+      end
diff --git a/test/mpi/f08/attr/typeattr3f08.f90 b/test/mpi/f08/attr/typeattr3f08.f90
new file mode 100644
index 0000000..976d923
--- /dev/null
+++ b/test/mpi/f08/attr/typeattr3f08.f90
@@ -0,0 +1,84 @@
+! This file created from test/mpi/f77/attr/typeattr3f.f with f77tof90
+! -*- Mode: Fortran; -*-
+!
+!  (C) 2004 by Argonne National Laboratory.
+!      See COPYRIGHT in top-level directory.
+!
+!  This tests the null copy function (returns flag false; thus the
+!  attribute should not be propagated to a dup'ed communicator
+!  This is much like the test in typeattr2f
+!
+      program main
+      use mpi_f08
+      integer errs, ierr
+      integer (kind=MPI_ADDRESS_KIND) extrastate, valin, valout, val
+
+      TYPE(MPI_Datatype) type1, type2
+      integer keyval
+      logical flag
+!
+! The only difference between the MPI-2 and MPI-1 attribute caching
+! routines in Fortran is that the take an address-sized integer
+! instead of a simple integer.  These still are not pointers,
+! so the values are still just integers.
+!
+      errs      = 0
+      call mtest_init( ierr )
+      type1 = MPI_INTEGER
+!
+      extrastate = 1001
+      call mpi_type_create_keyval( MPI_TYPE_NULL_COPY_FN,  &
+      &                             MPI_TYPE_NULL_DELETE_FN, keyval,  &
+      &                             extrastate, ierr )
+      flag = .true.
+      call mpi_type_get_attr( type1, keyval, valout, flag, ierr )
+      if (flag) then
+         errs = errs + 1
+         print *, ' get attr returned true when no attr set'
+      endif
+
+! Test the null copy function
+      valin = 5001
+      call mpi_type_set_attr( type1, keyval, valin, ierr )
+      call mpi_type_dup( type1, type2, ierr )
+! Because we set NULL_COPY_FN, the attribute should not
+! appear on the dup'ed communicator
+      flag = .false.
+      call mpi_type_get_attr( type1, keyval, valout, flag, ierr )
+      if (valout .ne. 5001) then
+         errs = errs + 1
+         print *, 'Unexpected output value in type ', valout
+      endif
+      flag = .true.
+      call mpi_type_get_attr( type2, keyval, valout, flag, ierr )
+      if (flag) then
+         errs = errs + 1
+         print *, ' Attribute incorrectly present on dup datatype'
+      endif
+! Test the delete function
+      call mpi_type_free( type2, ierr )
+!
+! Test the attr delete function
+      call mpi_type_dup( type1, type2, ierr )
+      valin      = 6001
+      extrastate = 1001
+      call mpi_type_set_attr( type2, keyval, valin, ierr )
+      call mpi_type_delete_attr( type2, keyval, ierr )
+      flag = .true.
+      call mpi_type_get_attr( type2, keyval, valout, flag, ierr )
+      if (flag) then
+         errs = errs + 1
+         print *, ' Delete_attr did not delete attribute'
+      endif
+      call mpi_type_free( type2, ierr )
+!
+      ierr = -1
+      call mpi_type_free_keyval( keyval, ierr )
+      if (ierr .ne. MPI_SUCCESS) then
+         errs = errs + 1
+         call mtestprinterror( ierr )
+      endif
+
+      call mtest_finalize( errs )
+      call mpi_finalize( ierr )
+      end
diff --git a/test/mpi/f08/attr/typeattrf08.f90 b/test/mpi/f08/attr/typeattrf08.f90
new file mode 100644
index 0000000..8980568
--- /dev/null
+++ b/test/mpi/f08/attr/typeattrf08.f90
@@ -0,0 +1,158 @@
+! This file created from test/mpi/f77/attr/typeattrf.f with f77tof90
+! -*- Mode: Fortran; -*-
+!
+!  (C) 2003 by Argonne National Laboratory.
+!      See COPYRIGHT in top-level directory.
+!
+      program main
+      use mpi_f08
+      integer errs, ierr
+      integer (kind=MPI_ADDRESS_KIND) extrastate, valin, valout, val
+
+      TYPE(MPI_Comm) comm
+      TYPE(MPI_Datatype) type1, type2
+      integer curcount, keyval
+      logical flag
+      external mycopyfn, mydelfn
+      integer callcount, delcount
+      common /myattr/ callcount, delcount
+!
+! The only difference between the MPI-2 and MPI-1 attribute caching
+! routines in Fortran is that the take an address-sized integer
+! instead of a simple integer.  These still are not pointers,
+! so the values are still just integers.
+!
+      errs      = 0
+      callcount = 0
+      delcount  = 0
+      call mtest_init( ierr )
+!
+! Attach an attribute to a predefined object
+      type1 = MPI_INTEGER
+      extrastate = 1001
+      call mpi_type_create_keyval( mycopyfn, mydelfn, keyval,  &
+      &                             extrastate, ierr )
+      flag = .true.
+      call mpi_type_get_attr( type1, keyval, valout, flag, ierr )
+      if (flag) then
+         errs = errs + 1
+         print *, ' get attr returned true when no attr set'
+      endif
+
+      valin = 2003
+      call mpi_type_set_attr( type1, keyval, valin, ierr )
+      flag = .false.
+      valout = -1
+      call mpi_type_get_attr( type1, keyval, valout, flag, ierr )
+      if (valout .ne. 2003) then
+         errs = errs + 1
+         print *, 'Unexpected value (should be 2003)', valout,  &
+      &            ' from attr'
+      endif
+
+      valin = 2001
+      call mpi_type_set_attr( type1, keyval, valin, ierr )
+      flag = .false.
+      valout = -1
+      call mpi_type_get_attr( type1, keyval, valout, flag, ierr )
+      if (valout .ne. 2001) then
+         errs = errs + 1
+         print *, 'Unexpected value (should be 2001)', valout,  &
+      &            ' from attr'
+      endif
+
+!
+! Test the copy function
+      valin = 5001
+      call mpi_type_set_attr( type1, keyval, valin, ierr )
+      call mpi_type_dup( type1, type2, ierr )
+      flag = .false.
+      call mpi_type_get_attr( type1, keyval, valout, flag, ierr )
+      if (valout .ne. 5001) then
+         errs = errs + 1
+         print *, 'Unexpected output value in type ', valout
+      endif
+      flag = .false.
+      call mpi_type_get_attr( type2, keyval, valout, flag, ierr )
+      if (valout .ne. 5003) then
+         errs = errs + 1
+         print *, 'Unexpected output value in type2 ', valout
+      endif
+! Test the delete function
+      curcount = delcount
+      call mpi_type_free( type2, ierr )
+      if (delcount .ne. curcount + 1) then
+         errs = errs + 1
+         print *, ' did not get expected value of delcount ',  &
+      &          delcount, curcount + 1
+      endif
+!
+! Test the attr delete function
+      call mpi_type_dup( type1, type2, ierr )
+      valin      = 6001
+      extrastate = 1001
+      call mpi_type_set_attr( type2, keyval, valin, ierr )
+      delcount   = 0
+      call mpi_type_delete_attr( type2, keyval, ierr )
+      if (delcount .ne. 1) then
+         errs = errs + 1
+         print *, ' Delete_attr did not call delete function'
+      endif
+      flag = .true.
+      call mpi_type_get_attr( type2, keyval, valout, flag, ierr )
+      if (flag) then
+         errs = errs + 1
+         print *, ' Delete_attr did not delete attribute'
+      endif
+      call mpi_type_free( type2, ierr )
+
+      ierr = -1
+      call mpi_type_free_keyval( keyval, ierr )
+      if (ierr .ne. MPI_SUCCESS) then
+         errs = errs + 1
+         call mtestprinterror( ierr )
+      endif
+
+      call mtest_finalize( errs )
+      call mpi_finalize( ierr )
+      end
+!
+      subroutine mycopyfn( oldtype, keyval, extrastate, valin, valout, &
+      &                     flag, ierr )
+      use mpi_f08
+      integer keyval, ierr
+      TYPE(MPI_Datatype) oldtype
+      integer (kind=MPI_ADDRESS_KIND) extrastate, valin, valout, val
+
+      logical flag
+      integer callcount, delcount
+      common /myattr/ callcount, delcount
+! increment the attribute by 2
+      valout = valin + 2
+      callcount = callcount + 1
+      if (extrastate .eq. 1001) then
+         flag = .true.
+         ierr = MPI_SUCCESS
+      else
+         print *, ' Unexpected value of extrastate = ', extrastate
+         flag = .false.
+         ierr = MPI_ERR_OTHER
+      endif
+      end
+!
+      subroutine mydelfn( type, keyval, val, extrastate, ierr )
+      use mpi_f08
+      integer keyval, ierr
+      TYPE(MPI_Datatype) type
+      integer (kind=MPI_ADDRESS_KIND) extrastate, valin, valout, val
+
+      integer callcount, delcount
+      common /myattr/ callcount, delcount
+      delcount = delcount + 1
+      if (extrastate .eq. 1001) then
+         ierr = MPI_SUCCESS
+      else
+         print *, ' Unexpected value of extrastate = ', extrastate
+         ierr = MPI_ERR_OTHER
+      endif
+      end
diff --git a/test/mpi/f08/coll/Makefile.am b/test/mpi/f08/coll/Makefile.am
new file mode 100644
index 0000000..46ac1a1
--- /dev/null
+++ b/test/mpi/f08/coll/Makefile.am
@@ -0,0 +1,26 @@
+# -*- Mode: Makefile; -*-
+# vim: set ft=automake :
+#
+# (C) 2011 by Argonne National Laboratory.
+#     See COPYRIGHT in top-level directory.
+#
+
+include $(top_srcdir)/Makefile_f08.mtest
+
+# avoid having to write many "foo_SOURCES = foo.f90" lines
+AM_DEFAULT_SOURCE_EXT = .f90
+
+noinst_PROGRAMS = uallreducef08       \
+                  exscanf08           \
+                  alltoallwf08        \
+                  inplacef08          \
+                  allredint8f08       \
+                  allredopttf08       \
+                  reducelocalf08      \
+                  alltoallvf08        \
+                  redscatf08          \
+                  split_typef08       \
+                  nonblockingf08      \
+                  vw_inplacef08       \
+                  red_scat_blockf08   \
+                  nonblocking_inpf08
diff --git a/test/mpi/f08/coll/allredint8f08.f90 b/test/mpi/f08/coll/allredint8f08.f90
new file mode 100644
index 0000000..802f86c
--- /dev/null
+++ b/test/mpi/f08/coll/allredint8f08.f90
@@ -0,0 +1,22 @@
+! -*- Mode: Fortran; -*-
+!
+!  (C) 2006 by Argonne National Laboratory.
+!      See COPYRIGHT in top-level directory.
+!
+      program main
+      use mpi_f08
+      integer*8 inbuf, outbuf
+      integer errs, ierr
+
+      errs = 0
+
+      call mtest_init( ierr )
+!
+! A simple test of allreduce for the optional integer*8 type
+
+      call mpi_allreduce(inbuf, outbuf, 1, MPI_INTEGER8, MPI_SUM,  &
+      &                   MPI_COMM_WORLD, ierr)
+
+      call mtest_finalize( errs )
+      call mpi_finalize( ierr )
+      end
diff --git a/test/mpi/f08/coll/allredopttf08.f90 b/test/mpi/f08/coll/allredopttf08.f90
new file mode 100644
index 0000000..f799486
--- /dev/null
+++ b/test/mpi/f08/coll/allredopttf08.f90
@@ -0,0 +1,46 @@
+! This file created from test/mpi/f77/coll/allredopttf.f with f77tof90
+! -*- Mode: Fortran; -*-
+!
+!  (C) 2007 by Argonne National Laboratory.
+!      See COPYRIGHT in top-level directory.
+!
+      program main
+      use mpi_f08
+      integer*8 inbuf, outbuf
+      double complex zinbuf, zoutbuf
+      integer wsize
+      integer errs, ierr
+
+      errs = 0
+
+      call mtest_init( ierr )
+      call mpi_comm_size( MPI_COMM_WORLD, wsize, ierr )
+!
+! A simple test of allreduce for the optional integer*8 type
+
+      inbuf = 1
+      outbuf = 0
+      call mpi_allreduce(inbuf, outbuf, 1, MPI_INTEGER8, MPI_SUM,  &
+      &                   MPI_COMM_WORLD, ierr)
+      if (outbuf .ne. wsize ) then
+         errs = errs + 1
+         print *, "result wrong for sum with integer*8 = got ", outbuf,  &
+      & " but should have ", wsize
+      endif
+      zinbuf = (1,1)
+      zoutbuf = (0,0)
+      call mpi_allreduce(zinbuf, zoutbuf, 1, MPI_DOUBLE_COMPLEX,  &
+      &                   MPI_SUM,  MPI_COMM_WORLD, ierr)
+      if (dreal(zoutbuf) .ne. wsize ) then
+         errs = errs + 1
+         print *, "result wrong for sum with double complex = got ",  &
+      & outbuf, " but should have ", wsize
+      endif
+      if (dimag(zoutbuf) .ne. wsize ) then
+         errs = errs + 1
+         print *, "result wrong for sum with double complex = got ",  &
+      & outbuf, " but should have ", wsize
+      endif
+      call mtest_finalize( errs )
+      call mpi_finalize( ierr )
+      end
diff --git a/test/mpi/f08/coll/alltoallvf08.f90 b/test/mpi/f08/coll/alltoallvf08.f90
new file mode 100644
index 0000000..e67af97
--- /dev/null
+++ b/test/mpi/f08/coll/alltoallvf08.f90
@@ -0,0 +1,148 @@
+! This file created from test/mpi/f77/coll/alltoallvf.f with f77tof90
+! -*- Mode: Fortran; -*-
+!
+!  (C) 2011 by Argonne National Laboratory.
+!      See COPYRIGHT in top-level directory.
+!
+      program main
+      use mpi_f08
+      integer ierr, errs
+      integer i, ans, size, rank, color
+      TYPE(MPI_Comm) comm, newcomm
+      integer maxSize, displ
+      parameter (maxSize=128)
+      integer scounts(maxSize), sdispls(maxSize)
+      integer rcounts(maxSize), rdispls(maxSize)
+      TYPE(MPI_Datatype) stype, rtype
+      integer sbuf(maxSize), rbuf(maxSize)
+
+      errs = 0
+
+      call mtest_init( ierr )
+
+! Get a comm
+      call mpi_comm_dup( MPI_COMM_WORLD, comm, ierr )
+      call mpi_comm_size( comm, size, ierr )
+      if (size .gt. maxSize) then
+         call mpi_comm_rank( comm, rank, ierr )
+         color = 1
+         if (rank .lt. maxSize) color = 0
+         call mpi_comm_split( comm, color, rank, newcomm, ierr )
+         call mpi_comm_free( comm, ierr )
+         comm = newcomm
+         call mpi_comm_size( comm, size, ierr )
+      endif
+      call mpi_comm_rank( comm, rank, ierr )
+!
+      if (size .le. maxSize) then
+! Initialize the data.  Just use this as an all to all
+! Use the same test as alltoallwf.c , except displacements are in units of
+! integers instead of bytes
+         do i=1, size
+            scounts(i) = 1
+            sdispls(i) = (i-1)
+            stype      = MPI_INTEGER
+            sbuf(i) = rank * size + i
+            rcounts(i) = 1
+            rdispls(i) = (i-1)
+            rtype      = MPI_INTEGER
+            rbuf(i) = -1
+         enddo
+         call mpi_alltoallv( sbuf, scounts, sdispls, stype, &
+      &        rbuf, rcounts, rdispls, rtype, comm, ierr )
+!
+! check rbuf(i) = data from the ith location of the ith send buf, or
+!       rbuf(i) = (i-1) * size + i
+         do i=1, size
+            ans = (i-1) * size + rank + 1
+            if (rbuf(i) .ne. ans) then
+               errs = errs + 1
+               print *, rank, ' rbuf(', i, ') = ', rbuf(i),  &
+      &               ' expected ', ans
+            endif
+         enddo
+!
+!     A halo-exchange example - mostly zero counts
+!
+         do i=1, size
+            scounts(i) = 0
+            sdispls(i) = 0
+            stype      = MPI_INTEGER
+            sbuf(i) = -1
+            rcounts(i) = 0
+            rdispls(i) = 0
+            rtype      = MPI_INTEGER
+            rbuf(i) = -1
+         enddo
+
+!
+!     Note that the arrays are 1-origin
+         displ = 0
+         if (rank .gt. 0) then
+            scounts(1+rank-1) = 1
+            rcounts(1+rank-1) = 1
+            sdispls(1+rank-1) = displ
+            rdispls(1+rank-1) = rank - 1
+            sbuf(1+displ)     = rank
+            displ             = displ + 1
+         endif
+         scounts(1+rank)   = 1
+         rcounts(1+rank)   = 1
+         sdispls(1+rank)   = displ
+         rdispls(1+rank)   = rank
+         sbuf(1+displ)     = rank
+         displ           = displ + 1
+         if (rank .lt. size-1) then
+            scounts(1+rank+1) = 1
+            rcounts(1+rank+1) = 1
+            sdispls(1+rank+1) = displ
+            rdispls(1+rank+1) = rank+1
+            sbuf(1+displ)     = rank
+            displ             = displ + 1
+         endif
+
+         call mpi_alltoallv( sbuf, scounts, sdispls, stype, &
+      &        rbuf, rcounts, rdispls, rtype, comm, ierr )
+!
+!   Check the neighbor values are correctly moved
+!
+         if (rank .gt. 0) then
+            if (rbuf(1+rank-1) .ne. rank-1) then
+               errs = errs + 1
+               print *, rank, ' rbuf(',1+rank-1, ') = ', rbuf(1+rank-1), &
+      &              'expected ', rank-1
+            endif
+         endif
+         if (rbuf(1+rank) .ne. rank) then
+            errs = errs + 1
+            print *, rank, ' rbuf(', 1+rank, ') = ', rbuf(1+rank), &
+      &           'expected ', rank
+         endif
+         if (rank .lt. size-1) then
+            if (rbuf(1+rank+1) .ne. rank+1) then
+               errs = errs + 1
+               print *, rank, ' rbuf(', 1+rank+1, ') = ',rbuf(1+rank+1), &
+      &              'expected ', rank+1
+            endif
+         endif
+         do i=0,rank-2
+            if (rbuf(1+i) .ne. -1) then
+               errs = errs + 1
+               print *, rank, ' rbuf(', 1+i, ') = ', rbuf(1+i),  &
+      &              'expected -1'
+            endif
+         enddo
+         do i=rank+2,size-1
+            if (rbuf(1+i) .ne. -1) then
+               errs = errs + 1
+               print *, rank, ' rbuf(', i, ') = ', rbuf(1+i),  &
+      &              'expected -1'
+            endif
+         enddo
+      endif
+      call mpi_comm_free( comm, ierr )
+
+      call mtest_finalize( errs )
+      call mpi_finalize( ierr )
+      end
+
diff --git a/test/mpi/f08/coll/alltoallwf08.f90 b/test/mpi/f08/coll/alltoallwf08.f90
new file mode 100644
index 0000000..176cbc8
--- /dev/null
+++ b/test/mpi/f08/coll/alltoallwf08.f90
@@ -0,0 +1,69 @@
+! This file created from test/mpi/f77/coll/alltoallwf.f with f77tof90
+! -*- Mode: Fortran; -*-
+!
+!  (C) 2003 by Argonne National Laboratory.
+!      See COPYRIGHT in top-level directory.
+!
+      program main
+      use mpi_f08
+      integer ierr, errs
+      integer i, intsize, ans, size, rank, color
+      TYPE(MPI_Comm) comm, newcomm
+      integer maxSize
+      parameter (maxSize=32)
+      integer scounts(maxSize), sdispls(maxSize)
+      integer rcounts(maxSize), rdispls(maxSize)
+      TYPE(MPI_Datatype) stypes(maxSize), rtypes(maxSize)
+      integer sbuf(maxSize), rbuf(maxSize)
+      errs = 0
+
+      call mtest_init( ierr )
+
+      call mpi_type_size( MPI_INTEGER, intsize, ierr )
+
+! Get a comm
+      call mpi_comm_dup( MPI_COMM_WORLD, comm, ierr )
+      call mpi_comm_size( comm, size, ierr )
+      if (size .gt. maxSize) then
+         call mpi_comm_rank( comm, rank, ierr )
+         color = 1
+         if (rank .lt. maxSize) color = 0
+         call mpi_comm_split( comm, color, rank, newcomm, ierr )
+         call mpi_comm_free( comm, ierr )
+         comm = newcomm
+         call mpi_comm_size( comm, size, ierr )
+      endif
+      call mpi_comm_rank( comm, rank, ierr )
+
+      if (size .le. maxSize) then
+! Initialize the data.  Just use this as an all to all
+         do i=1, size
+            scounts(i) = 1
+            sdispls(i) = (i-1)*intsize
+            stypes(i)  = MPI_INTEGER
+            sbuf(i) = rank * size + i
+            rcounts(i) = 1
+            rdispls(i) = (i-1)*intsize
+            rtypes(i)  = MPI_INTEGER
+            rbuf(i) = -1
+         enddo
+         call mpi_alltoallw( sbuf, scounts, sdispls, stypes, &
+      &        rbuf, rcounts, rdispls, rtypes, comm, ierr )
+!
+! check rbuf(i) = data from the ith location of the ith send buf, or
+!       rbuf(i) = (i-1) * size + i
+         do i=1, size
+            ans = (i-1) * size + rank + 1
+            if (rbuf(i) .ne. ans) then
+               errs = errs + 1
+               print *, rank, ' rbuf(', i, ') = ', rbuf(i),  &
+      &               ' expected ', ans
+            endif
+         enddo
+      endif
+      call mpi_comm_free( comm, ierr )
+
+      call mtest_finalize( errs )
+      call mpi_finalize( ierr )
+      end
+
diff --git a/test/mpi/f08/coll/exscanf08.f90 b/test/mpi/f08/coll/exscanf08.f90
new file mode 100644
index 0000000..816d4a4
--- /dev/null
+++ b/test/mpi/f08/coll/exscanf08.f90
@@ -0,0 +1,108 @@
+! This file created from test/mpi/f77/coll/exscanf.f with f77tof90
+! -*- Mode: Fortran; -*-
+!
+!  (C) 2003 by Argonne National Laboratory.
+!      See COPYRIGHT in top-level directory.
+!
+      subroutine uop( cin, cout, count, datatype )
+      use mpi_f08
+      integer cin(*), cout(*)
+      integer count
+      TYPE(MPI_Datatype) datatype
+      integer i
+
+      if (datatype .ne. MPI_INTEGER) then
+         write(6,*) 'Invalid datatype passed to user_op()'
+         return
+      endif
+
+      do i=1, count
+         cout(i) = cin(i) + cout(i)
+      enddo
+      end
+!
+      program main
+      use mpi_f08
+      integer inbuf(2), outbuf(2)
+      integer ans, rank, size
+      TYPE(MPI_Comm) comm
+      integer errs, ierr
+      TYPE(MPI_Op) sumop
+      external uop
+
+      errs = 0
+
+      call mtest_init( ierr )
+!
+! A simple test of exscan
+      comm = MPI_COMM_WORLD
+
+      call mpi_comm_rank( comm, rank, ierr )
+      call mpi_comm_size( comm, size, ierr )
+
+      inbuf(1) = rank
+      inbuf(2) = -rank
+      call mpi_exscan( inbuf, outbuf, 2, MPI_INTEGER, MPI_SUM, comm,  &
+      &                 ierr )
+! this process has the sum of i from 0 to rank-1, which is
+! (rank)(rank-1)/2 and -i
+      ans = (rank * (rank - 1))/2
+      if (rank .gt. 0) then
+         if (outbuf(1) .ne. ans) then
+            errs = errs + 1
+            print *, rank, ' Expected ', ans, ' got ', outbuf(1)
+         endif
+         if (outbuf(2) .ne. -ans) then
+            errs = errs + 1
+            print *, rank, ' Expected ', -ans, ' got ', outbuf(1)
+         endif
+      endif
+!
+! Try a user-defined operation
+!
+      call mpi_op_create( uop, .true., sumop, ierr )
+      inbuf(1) = rank
+      inbuf(2) = -rank
+      call mpi_exscan( inbuf, outbuf, 2, MPI_INTEGER, sumop, comm,  &
+      &                 ierr )
+! this process has the sum of i from 0 to rank-1, which is
+! (rank)(rank-1)/2 and -i
+      ans = (rank * (rank - 1))/2
+      if (rank .gt. 0) then
+         if (outbuf(1) .ne. ans) then
+            errs = errs + 1
+            print *, rank, ' sumop: Expected ', ans, ' got ', outbuf(1)
+         endif
+         if (outbuf(2) .ne. -ans) then
+            errs = errs + 1
+            print *, rank, ' sumop: Expected ', -ans, ' got ', outbuf(1)
+         endif
+      endif
+      call mpi_op_free( sumop, ierr )
+
+!
+! Try a user-defined operation (and don't claim it is commutative)
+!
+      call mpi_op_create( uop, .false., sumop, ierr )
+      inbuf(1) = rank
+      inbuf(2) = -rank
+      call mpi_exscan( inbuf, outbuf, 2, MPI_INTEGER, sumop, comm,  &
+      &                 ierr )
+! this process has the sum of i from 0 to rank-1, which is
+! (rank)(rank-1)/2 and -i
+      ans = (rank * (rank - 1))/2
+      if (rank .gt. 0) then
+         if (outbuf(1) .ne. ans) then
+            errs = errs + 1
+            print *, rank, ' sumop2: Expected ', ans, ' got ', outbuf(1)
+         endif
+         if (outbuf(2) .ne. -ans) then
+            errs = errs + 1
+            print *, rank, ' sumop2: Expected ', -ans, ' got ',outbuf(1)
+         endif
+      endif
+      call mpi_op_free( sumop, ierr )
+
+      call mtest_finalize( errs )
+      call mpi_finalize( ierr )
+      end
diff --git a/test/mpi/f08/coll/inplacef08.f90 b/test/mpi/f08/coll/inplacef08.f90
new file mode 100644
index 0000000..2d3b643
--- /dev/null
+++ b/test/mpi/f08/coll/inplacef08.f90
@@ -0,0 +1,92 @@
+! This file created from test/mpi/f77/coll/inplacef.f with f77tof90
+! -*- Mode: Fortran; -*-
+!
+! (C) 2005 by Argonne National Laboratory.
+!     See COPYRIGHT in top-level directory.
+!
+! This is a simple test that Fortran support the MPI_IN_PLACE value
+!
+       program main
+       use mpi_f08
+       integer ierr, errs
+       integer root
+       TYPE(MPI_Comm) comm
+       integer rank, size
+       integer i
+       integer MAX_SIZE
+       parameter (MAX_SIZE=1024)
+       integer rbuf(MAX_SIZE), rdispls(MAX_SIZE), rcount(MAX_SIZE), &
+      &      sbuf(MAX_SIZE)
+
+       errs = 0
+       call mtest_init( ierr )
+
+       comm = MPI_COMM_WORLD
+       call mpi_comm_rank( comm, rank, ierr )
+       call mpi_comm_size( comm, size, ierr )
+
+       root = 0
+! Gather with inplace
+       do i=1,size
+          rbuf(i) = - i
+       enddo
+       rbuf(1+root) = root
+       if (rank .eq. root) then
+          call mpi_gather( MPI_IN_PLACE, 1, MPI_INTEGER, rbuf, 1, &
+      &         MPI_INTEGER, root, comm, ierr )
+          do i=1,size
+             if (rbuf(i) .ne. i-1) then
+                errs = errs + 1
+                print *, '[',rank,'] rbuf(', i, ') = ', rbuf(i),  &
+      &                   ' in gather'
+             endif
+          enddo
+       else
+          call mpi_gather( rank, 1, MPI_INTEGER, rbuf, 1, MPI_INTEGER, &
+      &         root, comm, ierr )
+       endif
+
+! Gatherv with inplace
+       do i=1,size
+          rbuf(i) = - i
+          rcount(i) = 1
+          rdispls(i) = i-1
+       enddo
+       rbuf(1+root) = root
+       if (rank .eq. root) then
+          call mpi_gatherv( MPI_IN_PLACE, 1, MPI_INTEGER, rbuf, rcount, &
+      &         rdispls, MPI_INTEGER, root, comm, ierr )
+          do i=1,size
+             if (rbuf(i) .ne. i-1) then
+                errs = errs + 1
+                print *, '[', rank, '] rbuf(', i, ') = ', rbuf(i),  &
+      &                ' in gatherv'
+             endif
+          enddo
+       else
+          call mpi_gatherv( rank, 1, MPI_INTEGER, rbuf, rcount, rdispls, &
+      &         MPI_INTEGER, root, comm, ierr )
+       endif
+
+! Scatter with inplace
+       do i=1,size
+          sbuf(i) = i
+       enddo
+       rbuf(1) = -1
+       if (rank .eq. root) then
+          call mpi_scatter( sbuf, 1, MPI_INTEGER, MPI_IN_PLACE, 1, &
+      &         MPI_INTEGER, root, comm, ierr )
+       else
+          call mpi_scatter( sbuf, 1, MPI_INTEGER, rbuf, 1, &
+      &         MPI_INTEGER, root, comm, ierr )
+          if (rbuf(1) .ne. rank+1) then
+             errs = errs + 1
+             print *, '[', rank, '] rbuf  = ', rbuf(1), &
+      &            ' in scatter'
+          endif
+       endif
+
+       call mtest_finalize( errs )
+       call mpi_finalize( ierr )
+
+       end
diff --git a/test/mpi/f08/coll/nonblocking_inpf08.f90 b/test/mpi/f08/coll/nonblocking_inpf08.f90
new file mode 100644
index 0000000..7769dec
--- /dev/null
+++ b/test/mpi/f08/coll/nonblocking_inpf08.f90
@@ -0,0 +1,127 @@
+! This file created from test/mpi/f77/coll/nonblocking_inpf.f with f77tof90
+! -*- Mode: Fortran; -*-
+!
+! (C) 2012 by Argonne National Laboratory.
+!     See COPYRIGHT in top-level directory.
+!
+! A simple test for Fortran support of the MPI_IN_PLACE value in Alltoall[vw].
+!
+       program main
+       use mpi_f08
+       integer SIZEOFINT
+       integer MAX_SIZE
+       parameter (MAX_SIZE=1024)
+       integer rbuf(MAX_SIZE)
+       integer rdispls(MAX_SIZE), rcounts(MAX_SIZE)
+       TYPE(MPI_Datatype) rtypes(MAX_SIZE)
+       integer rank, size
+       TYPE(MPI_Comm) comm
+       TYPE(MPI_Request) req
+       integer sumval, ierr, errs
+       integer iexpected, igot
+       integer i, j
+
+       errs = 0
+       call mtest_init( ierr )
+
+       comm = MPI_COMM_WORLD
+       call mpi_comm_rank( comm, rank, ierr )
+       call mpi_comm_size( comm, size, ierr )
+       call mpi_type_size( MPI_INTEGER, SIZEOFINT, ierr )
+
+       do i=1,MAX_SIZE
+           rbuf(i) = -1
+       enddo
+       do i=1,size
+          rbuf(i) = (i-1) * size + rank
+       enddo
+       call mpi_ialltoall( MPI_IN_PLACE, -1, MPI_DATATYPE_NULL, &
+      &                      rbuf, 1, MPI_INTEGER, comm, req, ierr )
+       call mpi_wait( req, MPI_STATUS_IGNORE, ierr )
+       do i=1,size
+          if (rbuf(i) .ne. (rank*size + i - 1)) then
+             errs = errs + 1
+             print *, '[', rank, ']: IALLTOALL rbuf(', i, ') = ', &
+      &             rbuf(i), ', should be', rank * size + i - 1
+          endif
+       enddo
+
+       do i=1,MAX_SIZE
+           rbuf(i) = -1
+       enddo
+       do i=1,size
+           rcounts(i) = i-1 + rank
+           rdispls(i) = (i-1) * (2*size)
+           do j=0,rcounts(i)-1
+               rbuf(rdispls(i)+j+1) = 100 * rank + 10 * (i-1) + j
+           enddo
+       enddo
+       call mpi_ialltoallv( MPI_IN_PLACE, [0], [0], MPI_DATATYPE_NULL, &
+      &                       rbuf, rcounts, rdispls, MPI_INTEGER, &
+      &                       comm, req, ierr )
+       call mpi_wait( req, MPI_STATUS_IGNORE, ierr )
+       do i=1,size
+           do j=0,rcounts(i)-1
+               iexpected = 100 * (i-1) + 10 * rank + j
+               igot      = rbuf(rdispls(i)+j+1)
+               if ( igot .ne. iexpected ) then
+                   errs = errs + 1
+                   print *, '[', rank, ']: IALLTOALLV got ', igot, &
+      &                   ',but expected ', iexpected, &
+      &                   ' for block=', i-1, ' element=', j
+               endif
+           enddo
+       enddo
+
+       do i=1,MAX_SIZE
+           rbuf(i) = -1
+       enddo
+       do i=1,size
+           rcounts(i) = i-1 + rank
+           rdispls(i) = (i-1) * (2*size) * SIZEOFINT
+           rtypes(i)  = MPI_INTEGER
+           do j=0,rcounts(i)-1
+               rbuf(rdispls(i)/SIZEOFINT+j+1) = 100 * rank &
+      &                                        + 10 * (i-1) + j
+           enddo
+       enddo
+       call mpi_ialltoallw( MPI_IN_PLACE, [0], [0], [MPI_DATATYPE_NULL], &
+      &                       rbuf, rcounts, rdispls, rtypes, &
+      &                       comm, req, ierr )
+       call mpi_wait( req, MPI_STATUS_IGNORE, ierr )
+       do i=1,size
+           do j=0,rcounts(i)-1
+               iexpected = 100 * (i-1) + 10 * rank + j
+               igot      = rbuf(rdispls(i)/SIZEOFINT+j+1)
+               if ( igot .ne. iexpected ) then
+                   errs = errs + 1
+                   print *, '[', rank, ']: IALLTOALLW got ', igot, &
+      &                   ',but expected ', iexpected, &
+      &                   ' for block=', i-1, ' element=', j
+               endif
+           enddo
+       enddo
+
+       do i=1,MAX_SIZE
+           rbuf(i) = -1
+       enddo
+       do i = 1, size
+           rbuf(i) = rank + (i-1)
+       enddo
+       call mpi_ireduce_scatter_block( MPI_IN_PLACE, rbuf, 1, &
+      &                                  MPI_INTEGER, MPI_SUM, comm, &
+      &                                  req, ierr )
+       call mpi_wait( req, MPI_STATUS_IGNORE, ierr )
+
+       sumval = size * rank + ((size-1) * size)/2
+       if ( rbuf(1) .ne. sumval ) then
+           errs = errs + 1
+           print *, 'Ireduce_scatter_block does not get expected value.'
+           print *, '[', rank, ']:', 'Got ', rbuf(1), ' but expected ', &
+      &              sumval, '.'
+       endif
+
+       call mtest_finalize( errs )
+       call mpi_finalize( ierr )
+
+       end
diff --git a/test/mpi/f08/coll/nonblockingf08.f90 b/test/mpi/f08/coll/nonblockingf08.f90
new file mode 100644
index 0000000..eaed7f9
--- /dev/null
+++ b/test/mpi/f08/coll/nonblockingf08.f90
@@ -0,0 +1,100 @@
+! This file created from test/mpi/f77/coll/nonblockingf.f with f77tof90
+! -*- Mode: Fortran; -*-
+!
+!  (C) 2012 by Argonne National Laboratory.
+!      See COPYRIGHT in top-level directory.
+!
+      program main
+      use mpi_f08
+      integer NUM_INTS
+      parameter (NUM_INTS=2)
+      integer maxSize
+      parameter (maxSize=128)
+      integer scounts(maxSize), sdispls(maxSize)
+      integer rcounts(maxSize), rdispls(maxSize)
+      TYPE(MPI_Datatype) types(maxSize)
+      integer sbuf(maxSize), rbuf(maxSize)
+      integer size, rank
+      TYPE(MPI_Comm) comm
+      TYPE(MPI_Request) req
+      integer ierr, errs
+      integer ii, ans
+
+      errs = 0
+
+      call mtest_init(ierr)
+
+      comm = MPI_COMM_WORLD
+      call MPI_Comm_size(comm, size, ierr)
+      call MPI_Comm_rank(comm, rank, ierr)
+!
+      do ii = 1, size
+         sbuf(2*ii-1) = ii
+         sbuf(2*ii)   = ii
+         sbuf(2*ii-1) = ii
+         sbuf(2*ii)   = ii
+         scounts(ii)  = NUM_INTS
+         rcounts(ii)  = NUM_INTS
+         sdispls(ii)  = (ii-1) * NUM_INTS
+         rdispls(ii)  = (ii-1) * NUM_INTS
+         types(ii)    = MPI_INTEGER
+      enddo
+
+      call MPI_Ibarrier(comm, req, ierr)
+      call MPI_Wait(req, MPI_STATUS_IGNORE, ierr)
+
+      call MPI_Ibcast(sbuf, NUM_INTS, MPI_INTEGER, 0, comm, req, ierr)
+      call MPI_Wait(req, MPI_STATUS_IGNORE, ierr)
+
+      call MPI_Igather(sbuf, NUM_INTS, MPI_INTEGER, &
+      &                  rbuf, NUM_INTS, MPI_INTEGER, &
+      &                  0, comm, req, ierr)
+      call MPI_Wait(req, MPI_STATUS_IGNORE, ierr)
+
+      call MPI_Igatherv(sbuf, NUM_INTS, MPI_INTEGER, &
+      &                   rbuf, rcounts, rdispls, MPI_INTEGER, &
+      &                   0, comm, req, ierr)
+      call MPI_Wait(req, MPI_STATUS_IGNORE, ierr)
+
+      call MPI_Ialltoall(sbuf, NUM_INTS, MPI_INTEGER, &
+      &                    rbuf, NUM_INTS, MPI_INTEGER, &
+      &                    comm, req, ierr)
+      call MPI_Wait(req, MPI_STATUS_IGNORE, ierr)
+
+      call MPI_Ialltoallv(sbuf, scounts, sdispls, MPI_INTEGER, &
+      &                     rbuf, rcounts, rdispls, MPI_INTEGER, &
+      &                     comm, req, ierr)
+      call MPI_Wait(req, MPI_STATUS_IGNORE, ierr)
+
+      call MPI_Ialltoallw(sbuf, scounts, sdispls, types, &
+      &                     rbuf, rcounts, rdispls, types, &
+      &                     comm, req, ierr)
+      call MPI_Wait(req, MPI_STATUS_IGNORE, ierr)
+
+      call MPI_Ireduce(sbuf, rbuf, NUM_INTS, MPI_INTEGER, &
+      &                  MPI_SUM, 0, comm, req, ierr)
+      call MPI_Wait(req, MPI_STATUS_IGNORE, ierr)
+
+      call MPI_Iallreduce(sbuf, rbuf, NUM_INTS, MPI_INTEGER, &
+      &                     MPI_SUM, comm, req, ierr)
+      call MPI_Wait(req, MPI_STATUS_IGNORE, ierr)
+
+      call MPI_Ireduce_scatter(sbuf, rbuf, rcounts, MPI_INTEGER, &
+      &                          MPI_SUM, comm, req, ierr)
+      call MPI_Wait(req, MPI_STATUS_IGNORE, ierr)
+
+      call MPI_Ireduce_scatter_block(sbuf, rbuf, NUM_INTS, MPI_INTEGER, &
+      &                                MPI_SUM, comm, req, ierr)
+      call MPI_Wait(req, MPI_STATUS_IGNORE, ierr)
+
+      call MPI_Iscan(sbuf, rbuf, NUM_INTS, MPI_INTEGER, &
+      &                MPI_SUM, comm, req, ierr)
+      call MPI_Wait(req, MPI_STATUS_IGNORE, ierr)
+
+      call MPI_Iexscan(sbuf, rbuf, NUM_INTS, MPI_INTEGER, &
+      &                  MPI_SUM, comm, req, ierr)
+      call MPI_Wait(req, MPI_STATUS_IGNORE, ierr)
+
+      call mtest_finalize( errs )
+      call MPI_Finalize( ierr )
+      end
diff --git a/test/mpi/f08/coll/red_scat_blockf08.f90 b/test/mpi/f08/coll/red_scat_blockf08.f90
new file mode 100644
index 0000000..e3757b8
--- /dev/null
+++ b/test/mpi/f08/coll/red_scat_blockf08.f90
@@ -0,0 +1,57 @@
+! This file created from test/mpi/f77/coll/red_scat_blockf.f with f77tof90
+! -*- Mode: Fortran; -*-
+!
+! (C) 2012 by Argonne National Laboratory.
+!     See COPYRIGHT in top-level directory.
+!
+! A simple test for Fortran support of Reduce_scatter_block
+! with or withoutMPI_IN_PLACE.
+!
+       program main
+       use mpi_f08
+       integer MAX_SIZE
+       parameter (MAX_SIZE=1024)
+       integer sbuf(MAX_SIZE), rbuf(MAX_SIZE)
+       integer rank, size
+       TYPE(MPI_Comm) comm
+       integer sumval, ierr, errs, i
+
+       errs = 0
+       call mtest_init( ierr )
+
+       comm = MPI_COMM_WORLD
+       call mpi_comm_rank( comm, rank, ierr )
+       call mpi_comm_size( comm, size, ierr )
+
+       do i = 1, size
+           sbuf(i) = rank + (i-1)
+       enddo
+
+       call MPI_Reduce_scatter_block(sbuf, rbuf, 1, MPI_INTEGER, &
+      &                               MPI_SUM, comm, ierr)
+
+       sumval = size * rank + ((size-1) * size)/2
+       if ( rbuf(1) .ne. sumval ) then
+           errs = errs + 1
+           print *, 'Reduce_scatter_block does not get expected value.'
+           print *, '[', rank, ']', 'Got ', rbuf(1), ' but expected ', &
+      &              sumval, '.'
+       endif
+
+! Try MPI_IN_PLACE
+       do i = 1, size
+           rbuf(i) = rank + (i-1)
+       enddo
+       call MPI_Reduce_scatter_block(MPI_IN_PLACE, rbuf, 1, MPI_INTEGER, &
+      &                               MPI_SUM, comm, ierr)
+       if ( rbuf(1) .ne. sumval ) then
+           errs = errs + 1
+           print *, 'Reduce_scatter_block does not get expected value.'
+           print *, '[', rank, ']', 'Got ', rbuf(1), ' but expected ', &
+      &              sumval, '.'
+       endif
+
+       call mtest_finalize( errs )
+       call mpi_finalize( ierr )
+
+       end
diff --git a/test/mpi/f08/coll/redscatf08.f90 b/test/mpi/f08/coll/redscatf08.f90
new file mode 100644
index 0000000..e34c414
--- /dev/null
+++ b/test/mpi/f08/coll/redscatf08.f90
@@ -0,0 +1,86 @@
+! This file created from test/mpi/f77/coll/redscatf.f with f77tof90
+! -*- Mode: Fortran; -*-
+!
+!  (C) 2011 by Argonne National Laboratory.
+!      See COPYRIGHT in top-level directory.
+!
+      subroutine uop( cin, cout, count, datatype )
+      use mpi_f08
+      integer cin(*), cout(*)
+      integer count
+      TYPE(MPI_Datatype) datatype
+      integer i
+
+      if (datatype .ne. MPI_INTEGER) then
+         write(6,*) 'Invalid datatype ',datatype,' passed to user_op()'
+         return
+      endif
+
+      do i=1, count
+         cout(i) = cin(i) + cout(i)
+      enddo
+      end
+!
+! Test of reduce scatter.
+!
+! Each processor contributes its rank + the index to the reduction,
+! then receives the ith sum
+!
+! Can be called with any number of processors.
+!
+
+      program main
+      use mpi_f08
+      integer errs, ierr, toterr
+      integer maxsize
+      parameter (maxsize=1024)
+      integer sendbuf(maxsize), recvbuf, recvcounts(maxsize)
+      integer size, rank, i, sumval
+      TYPE(MPI_Comm) comm
+      TYPE(MPI_Op) sumop
+      external uop
+
+      errs = 0
+
+      call mtest_init( ierr )
+
+      comm = MPI_COMM_WORLD
+
+      call mpi_comm_size( comm, size, ierr )
+      call mpi_comm_rank( comm, rank, ierr )
+
+      if (size .gt. maxsize) then
+      endif
+      do i=1, size
+         sendbuf(i) = rank + i - 1
+         recvcounts(i) = 1
+      enddo
+
+      call mpi_reduce_scatter( sendbuf, recvbuf, recvcounts,  &
+      &     MPI_INTEGER, MPI_SUM, comm, ierr )
+
+      sumval = size * rank + ((size - 1) * size)/2
+! recvbuf should be size * (rank + i)
+      if (recvbuf .ne. sumval) then
+         errs = errs + 1
+         print *, "Did not get expected value for reduce scatter"
+         print *, rank, " Got ", recvbuf, " expected ", sumval
+      endif
+
+      call mpi_op_create( uop, .true., sumop, ierr )
+      call mpi_reduce_scatter( sendbuf, recvbuf, recvcounts,  &
+      &     MPI_INTEGER, sumop, comm, ierr )
+
+      sumval = size * rank + ((size - 1) * size)/2
+! recvbuf should be size * (rank + i)
+      if (recvbuf .ne. sumval) then
+         errs = errs + 1
+         print *, "sumop: Did not get expected value for reduce scatter"
+         print *, rank, " Got ", recvbuf, " expected ", sumval
+      endif
+      call mpi_op_free( sumop, ierr )
+
+      call mtest_finalize( errs )
+      call mpi_finalize( ierr )
+
+      end
diff --git a/test/mpi/f08/coll/reducelocalf08.f90 b/test/mpi/f08/coll/reducelocalf08.f90
new file mode 100644
index 0000000..6f14369
--- /dev/null
+++ b/test/mpi/f08/coll/reducelocalf08.f90
@@ -0,0 +1,98 @@
+! This file created from test/mpi/f77/coll/reducelocalf.f with f77tof90
+! -*- Mode: Fortran; -*-
+!
+!  (C) 2009 by Argonne National Laboratory.
+!      See COPYRIGHT in top-level directory.
+!
+!
+! Test Fortran MPI_Reduce_local with MPI_OP_SUM and with user-defined operation.
+!
+      subroutine user_op( invec, outvec, count, datatype )
+      use mpi_f08
+      integer invec(*), outvec(*)
+      integer count
+      TYPE(MPI_Datatype) datatype
+      integer ii
+
+      if (datatype .ne. MPI_INTEGER) then
+         write(6,*) 'Invalid datatype passed to user_op()'
+         return
+      endif
+
+      do ii=1, count
+         outvec(ii) = invec(ii) * 2 + outvec(ii)
+      enddo
+
+      end
+
+      program main
+      use mpi_f08
+      integer max_buf_size
+      parameter (max_buf_size=65000)
+      integer vin(max_buf_size), vout(max_buf_size)
+      external user_op
+      integer ierr, errs
+      integer count
+      TYPE(MPI_Op) myop
+      integer ii
+
+      errs = 0
+
+      call mtest_init(ierr)
+
+      count = 0
+      do while (count .le. max_buf_size )
+         do ii = 1,count
+            vin(ii) = ii
+            vout(ii) = ii
+         enddo
+         call mpi_reduce_local( vin, vout, count, &
+      &                          MPI_INTEGER, MPI_SUM, ierr )
+!        Check if the result is correct
+         do ii = 1,count
+            if ( vin(ii) .ne. ii ) then
+               errs = errs + 1
+            endif
+            if ( vout(ii) .ne. 2*ii ) then
+               errs = errs + 1
+            endif
+         enddo
+         if ( count .gt. 0 ) then
+            count = count + count
+         else
+            count = 1
+         endif
+      enddo
+
+      call mpi_op_create( user_op, .false., myop, ierr )
+
+      count = 0
+      do while (count .le. max_buf_size)
+         do ii = 1, count
+            vin(ii) = ii
+            vout(ii) = ii
+         enddo
+         call mpi_reduce_local( vin, vout, count, &
+      &                          MPI_INTEGER, myop, ierr )
+!        Check if the result is correct
+         do ii = 1, count
+            if ( vin(ii) .ne. ii ) then
+               errs = errs + 1
+            endif
+            if ( vout(ii) .ne. 3*ii ) then
+               errs = errs + 1
+            endif
+         enddo
+         if ( count .gt. 0 ) then
+            count = count + count
+         else
+            count = 1
+         endif
+      enddo
+
+      call mpi_op_free( myop, ierr )
+
+      call mtest_finalize(errs)
+      call mpi_finalize(ierr)
+
+      end
diff --git a/test/mpi/f08/coll/split_typef08.f90 b/test/mpi/f08/coll/split_typef08.f90
new file mode 100644
index 0000000..50e5b6e
--- /dev/null
+++ b/test/mpi/f08/coll/split_typef08.f90
@@ -0,0 +1,48 @@
+! This file created from test/mpi/f77/coll/split_typef.f with f77tof90
+! -*- Mode: Fortran; -*-
+!
+!  (C) 2012 by Argonne National Laboratory.
+!      See COPYRIGHT in top-level directory.
+!
+      program main
+      use mpi_f08
+      integer ierr, errs
+      integer i, ans, size, rank, color
+      TYPE(MPI_Comm) comm, newcomm
+      integer maxSize, displ
+      parameter (maxSize=128)
+      integer scounts(maxSize), sdispls(maxSize)
+      integer rcounts(maxSize), rdispls(maxSize)
+      TYPE(MPI_Datatype) stype, rtype
+      integer sbuf(maxSize), rbuf(maxSize)
+
+      errs = 0
+
+      call mtest_init( ierr )
+
+      call mpi_comm_dup( MPI_COMM_WORLD, comm, ierr )
+
+      call mpi_comm_split_type( comm, MPI_COMM_TYPE_SHARED, rank, &
+      &     MPI_INFO_NULL, newcomm, ierr )
+      call mpi_comm_rank( newcomm, rank, ierr )
+      call mpi_comm_size( newcomm, size, ierr )
+
+      do i=1, size
+         scounts(i) = 1
+         sdispls(i) = (i-1)
+         stype      = MPI_INTEGER
+         sbuf(i) = rank * size + i
+         rcounts(i) = 1
+         rdispls(i) = (i-1)
+         rtype      = MPI_INTEGER
+         rbuf(i) = -1
+      enddo
+      call mpi_alltoallv( sbuf, scounts, sdispls, stype, &
+      &     rbuf, rcounts, rdispls, rtype, newcomm, ierr )
+
+      call mpi_comm_free( newcomm, ierr )
+      call mpi_comm_free( comm, ierr )
+
+      call mtest_finalize( errs )
+      call mpi_finalize( ierr )
+      end
diff --git a/test/mpi/f08/coll/testlist b/test/mpi/f08/coll/testlist
new file mode 100644
index 0000000..42502d4
--- /dev/null
+++ b/test/mpi/f08/coll/testlist
@@ -0,0 +1,12 @@
+uallreducef08 4
+exscanf08 5
+alltoallwf08 7
+alltoallvf08 7
+inplacef08 4
+reducelocalf08 2 mpiversion=2.2
+redscatf08 4
+split_typef08 4 mpiversion=3.0
+nonblockingf08 4 mpiversion=3.0
+vw_inplacef08 4 mpiversion=2.2
+red_scat_blockf08 4 mpiversion=2.2
+nonblocking_inpf08 4 mpiversion=3.0
diff --git a/test/mpi/f08/coll/uallreducef08.f90 b/test/mpi/f08/coll/uallreducef08.f90
new file mode 100644
index 0000000..64cf82a
--- /dev/null
+++ b/test/mpi/f08/coll/uallreducef08.f90
@@ -0,0 +1,64 @@
+! This file created from test/mpi/f77/coll/uallreducef.f with f77tof90
+! -*- Mode: Fortran; -*-
+!
+!  (C) 2003 by Argonne National Laboratory.
+!      See COPYRIGHT in top-level directory.
+!
+!
+! Test user-defined operations.  This tests a simple commutative operation
+!
+      subroutine uop( cin, cout, count, datatype )
+      use mpi_f08
+      integer cin(*), cout(*)
+      integer count
+      TYPE(MPI_Datatype) datatype
+      integer i
+
+      if (datatype .ne. MPI_INTEGER) then
+         print *, 'Invalid datatype (',datatype,') passed to user_op()'
+         return
+      endif
+
+      do i=1, count
+         cout(i) = cin(i) + cout(i)
+      enddo
+      end
+
+      program main
+      use mpi_f08
+      external uop
+      integer ierr, errs
+      integer count, vin(65000), vout(65000), i, size
+      TYPE(MPI_Op) sumop
+      TYPE(MPI_Comm) comm
+
+      errs = 0
+
+      call mtest_init(ierr)
+      call mpi_op_create( uop, .true., sumop, ierr )
+
+      comm = MPI_COMM_WORLD
+      call mpi_comm_size( comm, size, ierr )
+      count = 1
+      do while (count .lt. 65000)
+         do i=1, count
+            vin(i) = i
+            vout(i) = -1
+         enddo
+         call mpi_allreduce( vin, vout, count, MPI_INTEGER, sumop,  &
+      &                       comm, ierr )
+!         Check that all results are correct
+         do i=1, count
+            if (vout(i) .ne. i * size) then
+               errs = errs + 1
+               if (errs .lt. 10) print *, "vout(",i,") = ", vout(i)
+            endif
+         enddo
+         count = count + count
+      enddo
+
+      call mpi_op_free( sumop, ierr )
+
+      call mtest_finalize(errs)
+      call mpi_finalize(ierr)
+      end
diff --git a/test/mpi/f08/coll/vw_inplacef08.f90 b/test/mpi/f08/coll/vw_inplacef08.f90
new file mode 100644
index 0000000..23ebc90
--- /dev/null
+++ b/test/mpi/f08/coll/vw_inplacef08.f90
@@ -0,0 +1,111 @@
+! This file created from test/mpi/f77/coll/vw_inplacef.f with f77tof90
+! -*- Mode: Fortran; -*-
+!
+! (C) 2012 by Argonne National Laboratory.
+!     See COPYRIGHT in top-level directory.
+!
+! A simple test for Fortran support of the MPI_IN_PLACE value in Alltoall[vw].
+!
+       program main
+       use mpi_f08
+       integer SIZEOFINT
+       integer MAX_SIZE
+       parameter (MAX_SIZE=1024)
+       integer rbuf(MAX_SIZE)
+       integer rdispls(MAX_SIZE), rcounts(MAX_SIZE)
+       TYPE(MPI_Datatype) rtypes(MAX_SIZE)
+       integer ierr, errs
+       integer root
+       TYPE(MPI_Comm) comm
+       integer rank, size
+       integer iexpected, igot
+       integer i, j
+
+       errs = 0
+       call mtest_init( ierr )
+
+       comm = MPI_COMM_WORLD
+       call mpi_comm_rank( comm, rank, ierr )
+       call mpi_comm_size( comm, size, ierr )
+       call mpi_type_size( MPI_INTEGER, SIZEOFINT, ierr )
+
+       if (size .gt. MAX_SIZE) then
+          print *, ' At most ', MAX_SIZE, ' processes allowed'
+          call mpi_abort( MPI_COMM_WORLD, 1, ierr )
+       endif
+!
+       do i=1,MAX_SIZE
+           rbuf(i) = -1
+       enddo
+       do i=1,size
+          rbuf(i) = (i-1) * size + rank
+       enddo
+       call mpi_alltoall( MPI_IN_PLACE, -1, MPI_DATATYPE_NULL, &
+      &      rbuf, 1, MPI_INTEGER, comm, ierr )
+       do i=1,size
+          if (rbuf(i) .ne. (rank*size + i - 1)) then
+             errs = errs + 1
+             print *, '[', rank, '] rbuf(', i, ') = ', rbuf(i), &
+      &             ', should be', rank * size + i - 1
+          endif
+       enddo
+
+       do i=1,MAX_SIZE
+           rbuf(i) = -1
+       enddo
+       do i=1,size
+           rcounts(i) = (i-1) + rank
+           rdispls(i) = (i-1) * (2*size)
+           do j=0,rcounts(i)-1
+               rbuf(rdispls(i)+j+1) = 100 * rank + 10 * (i-1) + j
+           enddo
+       enddo
+       call mpi_alltoallv( MPI_IN_PLACE, [0], [0], MPI_DATATYPE_NULL, &
+      &                     rbuf, rcounts, rdispls, MPI_INTEGER, &
+      &                     comm, ierr )
+       do i=1,size
+           do j=0,rcounts(i)-1
+               iexpected = 100 * (i-1) + 10 * rank + j
+               igot      = rbuf(rdispls(i)+j+1)
+               if ( igot .ne. iexpected ) then
+                   errs = errs + 1
+                   print *, '[', rank, '] ALLTOALLV got ', igot, &
+      &                   ',but expected ', iexpected, &
+      &                   ' for block=', i-1, ' element=', j
+               endif
+           enddo
+       enddo
+
+       do i=1,MAX_SIZE
+           rbuf(i) = -1
+       enddo
+!          Alltoallw's displs[] are in bytes not in type extents.
+       do i=1,size
+           rcounts(i) = (i-1) + rank
+           rdispls(i) = (i-1) * (2*size) * SIZEOFINT
+           rtypes(i)   = MPI_INTEGER
+           do j=0,rcounts(i)-1
+               rbuf(rdispls(i)/SIZEOFINT+j+1) = 100 * rank &
+      &                                        + 10 * (i-1) + j
+           enddo
+       enddo
+       call mpi_alltoallw( MPI_IN_PLACE, [0], [0], [MPI_DATATYPE_NULL], &
+      &                     rbuf, rcounts, rdispls, rtypes, &
+      &                     comm, ierr )
+       do i=1,size
+           do j=0,rcounts(i)-1
+               iexpected = 100 * (i-1) + 10 * rank + j
+               igot      = rbuf(rdispls(i)/SIZEOFINT+j+1)
+               if ( igot .ne. iexpected ) then
+                   errs = errs + 1
+                   print *, '[', rank, '] ALLTOALLW got ', igot, &
+      &                   ',but expected ', iexpected, &
+      &                   ' for block=', i-1, ' element=', j
+               endif
+           enddo
+       enddo
+
+       call mtest_finalize( errs )
+       call mpi_finalize( ierr )
+
+       end
diff --git a/test/mpi/f08/comm/Makefile.am b/test/mpi/f08/comm/Makefile.am
new file mode 100644
index 0000000..268c13f
--- /dev/null
+++ b/test/mpi/f08/comm/Makefile.am
@@ -0,0 +1,18 @@
+# This Makefile.am generated automatically by f77tof90
+# from test/mpi/f77/comm/Makefile.am.  DO NOT EDIT
+# -*- Mode: Makefile; -*-
+# vim: set ft=automake :
+#
+# (C) 2011 by Argonne National Laboratory.
+#     See COPYRIGHT in top-level directory.
+#
+
+include $(top_srcdir)/Makefile_f08.mtest
+
+EXTRA_DIST = testlist
+
+# avoid having to write many "foo_SOURCES = foo.f90" lines
+AM_DEFAULT_SOURCE_EXT = .f90
+
+noinst_PROGRAMS = commnamef08 commerrf08
+
diff --git a/test/mpi/f08/comm/commerrf08.f90 b/test/mpi/f08/comm/commerrf08.f90
new file mode 100644
index 0000000..d6e824a
--- /dev/null
+++ b/test/mpi/f08/comm/commerrf08.f90
@@ -0,0 +1,127 @@
+! This file created from test/mpi/f77/comm/commerrf.f with f77tof90
+! -*- Mode: Fortran; -*-
+!
+!  (C) 2003 by Argonne National Laboratory.
+!      See COPYRIGHT in top-level directory.
+!
+       program main
+       use mpi_f08
+       integer errs, ierr, code(2), newerrclass, eclass
+       character*(MPI_MAX_ERROR_STRING) errstring
+       integer rlen
+       TYPE(MPI_Comm) comm
+       external myerrhanfunc
+       TYPE(MPI_Errhandler) myerrhan, qerr
+       integer callcount, codesSeen(3)
+       common /myerrhan/ callcount, codesSeen
+
+       errs = 0
+       callcount = 0
+       call mtest_init( ierr )
+!
+! Setup some new codes and classes
+       call mpi_add_error_class( newerrclass, ierr )
+       call mpi_add_error_code( newerrclass, code(1), ierr )
+       call mpi_add_error_code( newerrclass, code(2), ierr )
+       call mpi_add_error_string( newerrclass, "New Class", ierr )
+       call mpi_add_error_string( code(1), "First new code", ierr )
+       call mpi_add_error_string( code(2), "Second new code", ierr )
+!
+!
+       call mpi_comm_create_errhandler( myerrhanfunc, myerrhan, ierr )
+!
+! Create a new communicator so that we can leave the default errors-abort
+! on MPI_COMM_WORLD
+       call mpi_comm_dup( MPI_COMM_WORLD, comm, ierr )
+!
+       call mpi_comm_set_errhandler( comm, myerrhan, ierr )
+
+       call mpi_comm_get_errhandler( comm, qerr, ierr )
+       if (qerr .ne. myerrhan) then
+          errs = errs + 1
+          print *, ' Did not get expected error handler'
+       endif
+       call mpi_errhandler_free( qerr, ierr )
+! We can free our error handler now
+       call mpi_errhandler_free( myerrhan, ierr )
+
+       call mpi_comm_call_errhandler( comm, newerrclass, ierr )
+       call mpi_comm_call_errhandler( comm, code(1), ierr )
+       call mpi_comm_call_errhandler( comm, code(2), ierr )
+
+       if (callcount .ne. 3) then
+          errs = errs + 1
+          print *, ' Expected 3 calls to error handler, found ',  &
+      &             callcount
+       else
+          if (codesSeen(1) .ne. newerrclass) then
+             errs = errs + 1
+             print *, 'Expected class ', newerrclass, ' got ',  &
+      &                codesSeen(1)
+          endif
+          if (codesSeen(2) .ne. code(1)) then
+             errs = errs + 1
+             print *, 'Expected code ', code(1), ' got ',  &
+      &                codesSeen(2)
+          endif
+          if (codesSeen(3) .ne. code(2)) then
+             errs = errs + 1
+             print *, 'Expected code ', code(2), ' got ',  &
+      &                codesSeen(3)
+          endif
+       endif
+
+       call mpi_comm_free( comm, ierr )
+!
+! Check error strings while here...
+       call mpi_error_string( newerrclass, errstring, rlen, ierr )
+       if (errstring(1:rlen) .ne. "New Class") then
+          errs = errs + 1
+          print *, ' Wrong string for error class: ', errstring(1:rlen)
+       endif
+       call mpi_error_class( code(1), eclass, ierr )
+       if (eclass .ne. newerrclass) then
+          errs = errs + 1
+          print *, ' Class for new code is not correct'
+       endif
+       call mpi_error_string( code(1), errstring, rlen, ierr )
+       if (errstring(1:rlen) .ne. "First new code") then
+          errs = errs + 1
+          print *, ' Wrong string for error code: ', errstring(1:rlen)
+       endif
+       call mpi_error_class( code(2), eclass, ierr )
+       if (eclass .ne. newerrclass) then
+          errs = errs + 1
+          print *, ' Class for new code is not correct'
+       endif
+       call mpi_error_string( code(2), errstring, rlen, ierr )
+       if (errstring(1:rlen) .ne. "Second new code") then
+          errs = errs + 1
+          print *, ' Wrong string for error code: ', errstring(1:rlen)
+       endif
+
+       call mtest_finalize( errs )
+       call mpi_finalize( ierr )
+
+       end
+!
+       subroutine myerrhanfunc( comm, errcode )
+       use mpi_f08
+       integer errcode
+       TYPE(MPI_Comm) comm
+       integer rlen, ierr
+       integer callcount, codesSeen(3)
+       character*(MPI_MAX_ERROR_STRING) errstring
+       common /myerrhan/ callcount, codesSeen
+
+       callcount = callcount + 1
+! Remember the code we've seen
+       if (callcount .le. 3) then
+          codesSeen(callcount) = errcode
+       endif
+       call mpi_error_string( errcode, errstring, rlen, ierr )
+       if (ierr .ne. MPI_SUCCESS) then
+          print *, ' Panic! could not get error string'
+          call mpi_abort( MPI_COMM_WORLD, 1, ierr )
+       endif
+       end
diff --git a/test/mpi/f08/comm/commnamef08.f90 b/test/mpi/f08/comm/commnamef08.f90
new file mode 100644
index 0000000..c584a02
--- /dev/null
+++ b/test/mpi/f08/comm/commnamef08.f90
@@ -0,0 +1,83 @@
+! This file created from test/mpi/f77/comm/commnamef.f with f77tof90
+! -*- Mode: Fortran; -*-
+!
+!  (C) 2003 by Argonne National Laboratory.
+!      See COPYRIGHT in top-level directory.
+!
+      program main
+      use mpi_f08
+      integer errs, ierr
+      integer i, rlen, ln
+      TYPE(MPI_Comm) comm(4)
+      integer ncomm
+      character*(MPI_MAX_OBJECT_NAME) inname(4), cname
+      logical MTestGetIntracomm
+
+      errs = 0
+      call mtest_init( ierr )
+
+! Test the predefined communicators
+      do ln=1,MPI_MAX_OBJECT_NAME
+         cname(ln:ln) = 'X'
+      enddo
+      call mpi_comm_get_name( MPI_COMM_WORLD, cname, rlen, ierr )
+      do ln=MPI_MAX_OBJECT_NAME,1,-1
+         if (cname(ln:ln) .ne. ' ') then
+            if (ln .ne. rlen) then
+               errs = errs + 1
+               print *, 'result len ', rlen,' not equal to actual len ', &
+      &              ln
+            endif
+            goto 110
+         endif
+      enddo
+      if (cname(1:rlen) .ne. 'MPI_COMM_WORLD') then
+         errs = errs + 1
+         print *, 'Did not get MPI_COMM_WORLD for world'
+      endif
+ 110  continue
+!
+      do ln=1,MPI_MAX_OBJECT_NAME
+         cname(ln:ln) = 'X'
+      enddo
+      call mpi_comm_get_name( MPI_COMM_SELF, cname, rlen, ierr )
+      do ln=MPI_MAX_OBJECT_NAME,1,-1
+         if (cname(ln:ln) .ne. ' ') then
+            if (ln .ne. rlen) then
+               errs = errs + 1
+               print *, 'result len ', rlen,' not equal to actual len ', &
+      &              ln
+            endif
+            goto 120
+         endif
+      enddo
+      if (cname(1:rlen) .ne. 'MPI_COMM_SELF') then
+         errs = errs + 1
+         print *, 'Did not get MPI_COMM_SELF for world'
+      endif
+ 120  continue
+!
+      do i = 1, 4
+         if (MTestGetIntracomm( comm(i), 1, .true. )) then
+            ncomm = i
+            write( inname(i), '(a,i1)') 'myname',i
+            call mpi_comm_set_name( comm(i), inname(i), ierr )
+         else
+            goto 130
+         endif
+      enddo
+ 130   continue
+!
+!     Now test them all
+      do i=1, ncomm
+         call mpi_comm_get_name( comm(i), cname, rlen, ierr )
+         if (inname(i) .ne. cname) then
+            errs = errs + 1
+            print *, ' Expected ', inname(i), ' got ', cname
+         endif
+         call MTestFreeComm( comm(i) )
+      enddo
+!
+      call mtest_finalize( errs )
+      call mpi_finalize( ierr )
+      end
diff --git a/test/mpi/f08/comm/testlist b/test/mpi/f08/comm/testlist
new file mode 100644
index 0000000..4c9b102
--- /dev/null
+++ b/test/mpi/f08/comm/testlist
@@ -0,0 +1,2 @@
+commnamef08 2
+commerrf08 2
diff --git a/test/mpi/f08/datatype/Makefile.am b/test/mpi/f08/datatype/Makefile.am
new file mode 100644
index 0000000..2de5301
--- /dev/null
+++ b/test/mpi/f08/datatype/Makefile.am
@@ -0,0 +1,17 @@
+# This Makefile.am generated automatically by f77tof90
+# from test/mpi/f77/datatype/Makefile.am.  DO NOT EDIT
+# -*- Mode: Makefile; -*-
+# vim: set ft=automake :
+#
+# (C) 2011 by Argonne National Laboratory.
+#     See COPYRIGHT in top-level directory.
+#
+
+include $(top_srcdir)/Makefile_f08.mtest
+
+# avoid having to write many "foo_SOURCES = foo.f90" lines
+AM_DEFAULT_SOURCE_EXT = .f90
+
+noinst_PROGRAMS = typenamef08 typesnamef08 typecntsf08 typesubf08 typem2f08 gaddressf08 \
+                  packef08 allctypesf08 hindex1f08 hindexed_blockf08 typename3f08 structf \
+                  indtype createf08 sizeof kinds trf08 get_elem_d get_elem_u
diff --git a/test/mpi/f08/datatype/allctypesf08.f90 b/test/mpi/f08/datatype/allctypesf08.f90
new file mode 100644
index 0000000..11ec393
--- /dev/null
+++ b/test/mpi/f08/datatype/allctypesf08.f90
@@ -0,0 +1,141 @@
+! This file created from test/mpi/f77/datatype/allctypesf.f with f77tof90
+! -*- Mode: Fortran; -*-
+!
+!  (C) 2004 by Argonne National Laboratory.
+!      See COPYRIGHT in top-level directory.
+!
+      program main
+      use mpi_f08
+      integer atype, ierr
+!
+      call mtest_init(ierr)
+      call mpi_comm_set_errhandler( MPI_COMM_WORLD, MPI_ERRORS_RETURN,  &
+      &                              ierr )
+!
+!     Check that all Ctypes are available in Fortran (MPI 2.1, p 483, line 46)
+!
+       call checkdtype( MPI_CHAR, "MPI_CHAR", ierr )
+       call checkdtype( MPI_SIGNED_CHAR, "MPI_SIGNED_CHAR", ierr )
+       call checkdtype( MPI_UNSIGNED_CHAR, "MPI_UNSIGNED_CHAR", ierr )
+       call checkdtype( MPI_BYTE, "MPI_BYTE", ierr )
+       call checkdtype( MPI_WCHAR, "MPI_WCHAR", ierr )
+       call checkdtype( MPI_SHORT, "MPI_SHORT", ierr )
+       call checkdtype( MPI_UNSIGNED_SHORT, "MPI_UNSIGNED_SHORT", ierr )
+       call checkdtype( MPI_INT, "MPI_INT", ierr )
+       call checkdtype( MPI_UNSIGNED, "MPI_UNSIGNED", ierr )
+       call checkdtype( MPI_LONG, "MPI_LONG", ierr )
+       call checkdtype( MPI_UNSIGNED_LONG, "MPI_UNSIGNED_LONG", ierr )
+       call checkdtype( MPI_FLOAT, "MPI_FLOAT", ierr )
+       call checkdtype( MPI_DOUBLE, "MPI_DOUBLE", ierr )
+       if (MPI_LONG_DOUBLE .ne. MPI_DATATYPE_NULL) then
+         call checkdtype( MPI_LONG_DOUBLE, "MPI_LONG_DOUBLE", ierr )
+       endif
+       if (MPI_LONG_LONG_INT .ne. MPI_DATATYPE_NULL) then
+         call checkdtype2( MPI_LONG_LONG_INT, "MPI_LONG_LONG_INT",  &
+      &                     "MPI_LONG_LONG", ierr )
+       endif
+       if (MPI_UNSIGNED_LONG_LONG .ne. MPI_DATATYPE_NULL) then
+         call checkdtype( MPI_UNSIGNED_LONG_LONG,  &
+      &                    "MPI_UNSIGNED_LONG_LONG", ierr )
+       endif
+       if (MPI_LONG_LONG .ne. MPI_DATATYPE_NULL) then
+         call checkdtype2( MPI_LONG_LONG, "MPI_LONG_LONG",  &
+      &                     "MPI_LONG_LONG_INT", ierr )
+       endif
+       call checkdtype( MPI_PACKED, "MPI_PACKED", ierr )
+       call checkdtype( MPI_LB, "MPI_LB", ierr )
+       call checkdtype( MPI_UB, "MPI_UB", ierr )
+       call checkdtype( MPI_FLOAT_INT, "MPI_FLOAT_INT", ierr )
+       call checkdtype( MPI_DOUBLE_INT, "MPI_DOUBLE_INT", ierr )
+       call checkdtype( MPI_LONG_INT, "MPI_LONG_INT", ierr )
+       call checkdtype( MPI_SHORT_INT, "MPI_SHORT_INT", ierr )
+       call checkdtype( MPI_2INT, "MPI_2INT", ierr )
+       if (MPI_LONG_DOUBLE_INT .ne. MPI_DATATYPE_NULL) then
+         call checkdtype( MPI_LONG_DOUBLE_INT, "MPI_LONG_DOUBLE_INT", &
+      &                    ierr)
+       endif
+!
+!     Check that all Ctypes are available in Fortran (MPI 2.2)
+!     Note that because of implicit declarations in Fortran, this
+!     code should compile even with pre MPI 2.2 implementations.
+!
+       if (MPI_VERSION .gt. 2 .or. (MPI_VERSION .eq. 2 .and.  &
+      &      MPI_SUBVERSION .ge. 2)) then
+          call checkdtype( MPI_INT8_T, "MPI_INT8_T", ierr )
+          call checkdtype( MPI_INT16_T, "MPI_INT16_T", ierr )
+          call checkdtype( MPI_INT32_T, "MPI_INT32_T", ierr )
+          call checkdtype( MPI_INT64_T, "MPI_INT64_T", ierr )
+          call checkdtype( MPI_UINT8_T, "MPI_UINT8_T", ierr )
+          call checkdtype( MPI_UINT16_T, "MPI_UINT16_T", ierr )
+          call checkdtype( MPI_UINT32_T, "MPI_UINT32_T", ierr )
+          call checkdtype( MPI_UINT64_T, "MPI_UINT64_T", ierr )
+! other C99 types
+          call checkdtype( MPI_C_BOOL, "MPI_C_BOOL", ierr )
+          call checkdtype( MPI_C_FLOAT_COMPLEX, "MPI_C_FLOAT_COMPLEX", &
+      &                     ierr)
+          call checkdtype2( MPI_C_COMPLEX, "MPI_C_COMPLEX",  &
+      &                      "MPI_C_FLOAT_COMPLEX", ierr )
+          call checkdtype( MPI_C_DOUBLE_COMPLEX, "MPI_C_DOUBLE_COMPLEX",  &
+      &                     ierr )
+          if (MPI_C_LONG_DOUBLE_COMPLEX .ne. MPI_DATATYPE_NULL) then
+            call checkdtype( MPI_C_LONG_DOUBLE_COMPLEX,  &
+      &                       "MPI_C_LONG_DOUBLE_COMPLEX", ierr )
+          endif
+! address/offset types
+          call checkdtype( MPI_AINT, "MPI_AINT", ierr )
+          call checkdtype( MPI_OFFSET, "MPI_OFFSET", ierr )
+       endif
+!
+       call mtest_finalize( ierr )
+       call MPI_Finalize( ierr )
+       end
+!
+! Check name of datatype
+      subroutine CheckDtype( intype, name, ierr )
+      use mpi_f08
+      integer ierr
+      TYPE(MPI_Datatype) intype
+      character *(*) name
+      integer ir, rlen
+      character *(MPI_MAX_OBJECT_NAME) outname
+!
+      outname = ""
+      call MPI_TYPE_GET_NAME( intype, outname, rlen, ir )
+      if (ir .ne. MPI_SUCCESS) then
+         print *, " Datatype ", name, " not available in Fortran"
+         ierr = ierr + 1
+      else
+         if (outname .ne. name) then
+            print *, " For datatype ", name, " found name ", &
+      &           outname(1:rlen)
+            ierr = ierr + 1
+         endif
+      endif
+
+      return
+      end
+!
+! Check name of datatype (allows alias)
+      subroutine CheckDtype2( intype, name, name2, ierr )
+      use mpi_f08
+      integer ierr
+      TYPE(MPI_Datatype) intype
+      character *(*) name, name2
+      integer ir, rlen
+      character *(MPI_MAX_OBJECT_NAME) outname
+!
+      outname = ""
+      call MPI_TYPE_GET_NAME( intype, outname, rlen, ir )
+      if (ir .ne. MPI_SUCCESS) then
+         print *, " Datatype ", name, " not available in Fortran"
+         ierr = ierr + 1
+      else
+         if (outname .ne. name .and. outname .ne. name2) then
+            print *, " For datatype ", name, " found name ", &
+      &           outname(1:rlen)
+            ierr = ierr + 1
+         endif
+      endif
+
+      return
+      end
diff --git a/test/mpi/f08/datatype/createf08.f90 b/test/mpi/f08/datatype/createf08.f90
new file mode 100644
index 0000000..18a7240
--- /dev/null
+++ b/test/mpi/f08/datatype/createf08.f90
@@ -0,0 +1,70 @@
+!
+!  (C) 2004 by Argonne National Laboratory.
+!      See COPYRIGHT in top-level directory.
+!
+        program main
+        use mpi_f08
+        integer ierr
+        integer errs
+        integer nints, nadds, ndtypes, combiner
+        integer nparms(2)
+        TYPE(MPI_Datatype) dummy(1)
+        integer (kind=MPI_ADDRESS_KIND) adummy(1)
+        integer nsize, i
+        TYPE(MPI_Datatype) ntype1, ntype2, ntype3
+!
+!       Test the Type_create_f90_xxx routines
+!
+        errs = 0
+        call mtest_init( ierr )
+
+! integers with upto 9 are 4 bytes integers; r of 4 are 2 byte,
+! and r of 2 is 1 byte
+        call mpi_type_create_f90_integer( 9, ntype1, ierr )
+!
+!       Check with get contents and envelope...
+        call mpi_type_get_envelope( ntype1, nints, nadds, ndtypes, &
+                                    combiner, ierr )
+        if (nadds .ne. 0) then
+           errs = errs + 1
+           print *, "There should be no addresses on created type (r=9)"
+        endif
+        if (ndtypes .ne. 0) then
+           errs = errs + 1
+           print *, "There should be no datatypes on created type (r=9)"
+        endif
+        if (nints .ne. 1) then
+           errs = errs + 1
+           print *, "There should be exactly 1 integer on create type (r=9)"
+        endif
+        if (combiner .ne. MPI_COMBINER_F90_INTEGER) then
+           errs = errs + 1
+           print *, "The combiner should be INTEGER, not ", combiner
+        endif
+        if (nints .eq. 1) then
+           call mpi_type_get_contents( ntype1, 1, 0, 0, &
+                                       nparms, adummy, dummy, ierr )
+           if (nparms(1) .ne. 9) then
+              errs = errs + 1
+              print *, "parameter was ", nparms(1), " should be 9"
+           endif
+        endif
+
+        call mpi_type_create_f90_integer( 8, ntype2, ierr )
+        if (ntype1 .eq. ntype2) then
+           errs = errs + 1
+           print *, "Types with r = 8 and r = 9 are the same, ", &
+                "should be distinct"
+        endif
+
+!
+! Check that we don't create new types each time.  This test will fail only
+! if the MPI implementation checks for un-freed types or runs out of space
+        do i=1, 100000
+           call mpi_type_create_f90_integer( 8, ntype3, ierr )
+        enddo
+
+        call mtest_finalize( errs )
+        call mpi_finalize( ierr )
+
+        end
diff --git a/test/mpi/f08/datatype/createf90.f90 b/test/mpi/f08/datatype/createf90.f90
new file mode 100644
index 0000000..72c3c75
--- /dev/null
+++ b/test/mpi/f08/datatype/createf90.f90
@@ -0,0 +1,68 @@
+!
+!  (C) 2004 by Argonne National Laboratory.
+!      See COPYRIGHT in top-level directory.
+!
+        program main
+        use mpi
+        integer ierr
+        integer errs
+        integer nints, nadds, ndtypes, combiner
+        integer nparms(2), dummy(1)
+        integer (kind=MPI_ADDRESS_KIND) adummy(1)
+        integer ntype1, nsize, ntype2, ntype3, i
+!
+!       Test the Type_create_f90_xxx routines
+!
+        errs = 0
+        call mtest_init( ierr )
+
+! integers with upto 9 are 4 bytes integers; r of 4 are 2 byte,
+! and r of 2 is 1 byte
+        call mpi_type_create_f90_integer( 9, ntype1, ierr )
+!
+!       Check with get contents and envelope...
+        call mpi_type_get_envelope( ntype1, nints, nadds, ndtypes, &
+                                    combiner, ierr )
+        if (nadds .ne. 0) then
+           errs = errs + 1
+           print *, "There should be no addresses on created type (r=9)"
+        endif
+        if (ndtypes .ne. 0) then
+           errs = errs + 1
+           print *, "There should be no datatypes on created type (r=9)"
+        endif
+        if (nints .ne. 1) then
+           errs = errs + 1
+           print *, "There should be exactly 1 integer on create type (r=9)"
+        endif
+        if (combiner .ne. MPI_COMBINER_F90_INTEGER) then
+           errs = errs + 1
+           print *, "The combiner should be INTEGER, not ", combiner
+        endif
+        if (nints .eq. 1) then
+           call mpi_type_get_contents( ntype1, 1, 0, 0, &
+                                       nparms, adummy, dummy, ierr )
+           if (nparms(1) .ne. 9) then
+              errs = errs + 1
+              print *, "parameter was ", nparms(1), " should be 9"
+           endif
+        endif
+
+        call mpi_type_create_f90_integer( 8, ntype2, ierr )
+        if (ntype1 .eq. ntype2) then
+           errs = errs + 1
+           print *, "Types with r = 8 and r = 9 are the same, ", &
+                "should be distinct"
+        endif
+
+!
+! Check that we don't create new types each time.  This test will fail only
+! if the MPI implementation checks for un-freed types or runs out of space
+        do i=1, 100000
+           call mpi_type_create_f90_integer( 8, ntype3, ierr )
+        enddo
+
+        call mtest_finalize( errs )
+        call mpi_finalize( ierr )
+
+        end
diff --git a/test/mpi/f08/datatype/gaddressf08.f90 b/test/mpi/f08/datatype/gaddressf08.f90
new file mode 100644
index 0000000..8e476d8
--- /dev/null
+++ b/test/mpi/f08/datatype/gaddressf08.f90
@@ -0,0 +1,39 @@
+! This file created from test/mpi/f77/datatype/gaddressf.f with f77tof90
+! -*- Mode: Fortran; -*-
+!
+!
+!  (C) 2003 by Argonne National Laboratory.
+!      See COPYRIGHT in top-level directory.
+!
+      program main
+      use mpi_f08
+      integer max_asizev
+      parameter (max_asizev=2)
+      integer (kind=MPI_ADDRESS_KIND) aint, aintv(max_asizev)
+
+      integer iarray(200), gap, intsize
+      integer ierr, errs
+
+      errs = 0
+
+      call MPI_Init(ierr)
+
+      call MPI_Get_address( iarray(1), aintv(1), ierr )
+      call MPI_Get_address( iarray(200), aintv(2), ierr )
+      gap = aintv(2) - aintv(1)
+
+      call MPI_Type_size( MPI_INTEGER, intsize, ierr )
+
+      if (gap .ne. 199 * intsize) then
+         errs = errs + 1
+         print *, ' Using get_address, computed a gap of ', gap
+         print *, ' Expected a gap of ', 199 * intsize
+      endif
+      if (errs .gt. 0) then
+          print *, ' Found ', errs, ' errors'
+      else
+          print *, ' No Errors'
+      endif
+
+      call MPI_Finalize( ierr )
+      end
diff --git a/test/mpi/f08/datatype/get_elem_d.f90 b/test/mpi/f08/datatype/get_elem_d.f90
new file mode 100644
index 0000000..500ffb5
--- /dev/null
+++ b/test/mpi/f08/datatype/get_elem_d.f90
@@ -0,0 +1,127 @@
+! -*- Mode: Fortran; -*-
+!
+!  (C) 2013 by Argonne National Laboratory.
+!      See COPYRIGHT in top-level directory.
+!
+
+! Based on a test written by Jim Hoekstra on behalf of Cray, Inc.
+! see ticket #884 https://trac.mpich.org/projects/mpich/ticket/884
+
+program get_elem_d
+
+  use mpi_f08
+  implicit none
+
+  integer, parameter :: verbose=0
+  integer, parameter :: cmax=100,dmax=100,imax=60
+  integer, parameter :: nb=2
+  integer :: rank,size,dest,ierror,errs=0
+  TYPE(MPI_Comm) :: comm
+  TYPE(MPI_Status) :: status
+  integer :: i,ii,count,ka,j,jj,k,kj
+  integer :: blklen(nb)=(/2,2/)
+  TYPE(MPI_Datatype) :: types(nb)=(/MPI_DOUBLE_PRECISION,MPI_INTEGER/)
+  integer(kind=MPI_ADDRESS_KIND) :: disp(nb)
+  integer :: ntlen,ians(20),ians0(0:3),ians1(24),ians2(20)
+  TYPE(MPI_Datatype) :: newtype
+  double precision :: dbuff(dmax), a
+  integer :: ibuff(imax)
+  character :: cbuff(cmax)='X'
+
+  call MPI_Init(ierror)
+  comm=MPI_COMM_WORLD
+  call MPI_Comm_size(comm, size, ierror)
+  dest=size-1
+  call MPI_Comm_rank(comm, rank, ierror)
+  call MPI_Sizeof (j, kj, ierror)
+  call MPI_Sizeof (a, ka, ierror)
+  ntlen=2*ka+2*kj
+  disp=(/0,2*ka/)
+
+  !  calculate answers for expected i values for Get_elements with derived type
+  ians0(0)=ka
+  ians0(1)=2*ka
+  ians0(2)=2*ka+kj
+  ians0(3)=2*ka+2*kj
+  ii=0
+  do i=1,24 ! answers for the test sending 1~24 bytes
+     if (i .eq. ians0(ii)) ii=ii+1
+     ians1(i)=ii
+  enddo
+  if (rank == 0 .and. verbose > 0) print *, (ians1(k),k=1,24)
+  jj=0
+  do j=1,17,4 ! 4 means newtype has 4 primitives
+     ians(j)=jj+ka/kj
+     ians(j+1)=jj+2*(ka/kj)
+     ians(j+2)=jj+2*(ka/kj)+1
+     ians(j+3)=jj+2*(ka/kj)+2
+     if (rank == 0 .and. verbose > 0) print *, (ians(k),k=j,j+3)
+     jj=jj+ntlen/kj
+  enddo
+  ! To have k elements, need to receive ians(k) integers
+
+  ii=0
+  do i=1,20 ! answers for the test sending 1~20 integers
+     if (i .eq. ians(ii+1)) ii=ii+1
+     ians2(i)=ii
+  enddo
+  if (rank == 0 .and. verbose > 0) print *, (ians2(k),k=1,20)
+
+  if (verbose > 0) print *, MPI_UNDEFINED
+
+  call MPI_Type_create_struct(nb, blklen, disp, types, newtype, ierror)
+  call MPI_Type_commit(newtype, ierror)
+
+  do i=1,24 ! sending 1~24 bytes
+     if (rank == 0) then
+        call MPI_Send(cbuff, i, MPI_BYTE, dest, 100, comm, ierror)
+
+     else if (rank == dest) then
+
+        !     first receive
+        call MPI_Recv(dbuff, dmax, newtype, 0, 100, comm, status, ierror)
+        !       check on MPI_Get_elements
+        call MPI_Get_elements(status, newtype, count, ierror)
+        if (count .ne. ians1(i)) then
+           errs=errs+1
+           write (*,fmt="(i2,'  R1 Get_elements  count=',i3,&
+                &'  but should be ',i3)") i,count,ians1(i)
+        endif
+
+     else
+        !     other ranks do not participate
+     endif
+  enddo
+
+  do i=1,20 ! sending 1~20 integers
+     if (rank == 0) then
+        call MPI_Send(ibuff, i, MPI_INTEGER, dest, 100, comm, ierror)
+
+     else if (rank == dest) then
+
+        !     second receive
+        call MPI_Recv(dbuff, dmax, newtype, 0, 100, comm, status, ierror)
+        !       check on MPI_Get_elements
+        call MPI_Get_elements(status, newtype, count, ierror)
+        if (count .ne. ians2(i)) then
+           errs=errs+1
+           write (*,fmt="(i2,'  R2 Get_elements  count=',i3,&
+                &'  but should be ',i3)") i,count,ians2(i)
+        endif
+     else
+        !     other ranks do not participate
+     endif
+  enddo
+
+  if (rank .eq. dest) then
+     if (errs .eq. 0) then
+        write (*,*) " No Errors"
+     else
+        print *, 'errs=',errs
+     endif
+  endif
+
+  call MPI_Type_free(newtype, ierror)
+  call MPI_Finalize(ierror)
+
+end program get_elem_d
diff --git a/test/mpi/f08/datatype/get_elem_u.f90 b/test/mpi/f08/datatype/get_elem_u.f90
new file mode 100644
index 0000000..e972a69
--- /dev/null
+++ b/test/mpi/f08/datatype/get_elem_u.f90
@@ -0,0 +1,74 @@
+! -*- Mode: Fortran; -*-
+!
+!  (C) 2013 by Argonne National Laboratory.
+!      See COPYRIGHT in top-level directory.
+!
+
+! Based on a test written by Jim Hoekstra on behalf of Cray, Inc.
+! see ticket #884 https://trac.mpich.org/projects/mpich/ticket/884
+
+PROGRAM get_elem_u
+
+  USE mpi_f08
+  IMPLICIT NONE
+  INTEGER    RANK, SIZE, IERR, errs
+  TYPE(MPI_COMM) COMM
+  INTEGER    MAX, I, K, dest
+  TYPE(MPI_STATUS) STATUS
+
+  INTEGER, PARAMETER :: nb=2
+  INTEGER :: blklen(nb)=(/1,1/)
+  TYPE(MPI_DATATYPE) :: types(nb)=(/MPI_DOUBLE_PRECISION,MPI_CHAR/)
+  INTEGER(kind=MPI_ADDRESS_KIND) :: disp(nb)=(/0,8/)
+
+  INTEGER, PARAMETER :: amax=200
+  INTEGER :: extent
+  TYPE(MPI_DATATYPE) type1, type2
+  REAL    :: a(amax)
+
+  errs = 0
+  CALL MPI_Init( ierr )
+  COMM = MPI_COMM_WORLD
+  CALL MPI_Comm_rank(COMM,RANK,IERR)
+  CALL MPI_Comm_size(COMM,SIZE,IERR)
+  dest=size-1
+
+  CALL MPI_Type_create_struct(nb, blklen, disp, types, type1, ierr)
+  CALL MPI_Type_commit(type1, ierr)
+  CALL MPI_Type_extent(type1, extent, ierr)
+
+  CALL MPI_Type_contiguous(4, Type1, Type2, ierr)
+  CALL MPI_Type_commit(Type2, ierr)
+  CALL MPI_Type_extent(Type2, extent, ierr)
+
+  DO k=1,17
+
+     IF(rank .EQ. 0) THEN
+
+        !       send k copies of datatype Type1
+        CALL MPI_Send(a, k, Type1, dest, 0, comm, ierr)
+
+     ELSE IF (rank == dest) THEN
+
+        CALL MPI_Recv(a, 200, Type2, 0, 0, comm, status, ierr)
+        CALL MPI_Get_elements(status, Type2, i, ierr)
+        IF (i .NE. 2*k) THEN
+           errs = errs+1
+           PRINT *, "k=",k,"  MPI_Get_elements returns", i, ", but it should be", 2*k
+        END IF
+
+     ELSE
+        !       thix rank does not particupate
+     END IF
+  enddo
+
+  CALL MPI_Type_free(type1, ierr)
+  CALL MPI_Type_free(type2, ierr)
+
+  CALL MPI_Finalize( ierr )
+
+  IF(rank .EQ. 0 .AND. errs .EQ. 0) THEN
+     PRINT *, " No Errors"
+  END IF
+
+END PROGRAM get_elem_u
diff --git a/test/mpi/f08/datatype/hindex1f08.f90 b/test/mpi/f08/datatype/hindex1f08.f90
new file mode 100644
index 0000000..affa046
--- /dev/null
+++ b/test/mpi/f08/datatype/hindex1f08.f90
@@ -0,0 +1,62 @@
+! This file created from test/mpi/f77/datatype/hindex1f.f with f77tof90
+! -*- Mode: Fortran; -*-
+!
+!
+!  (C) 2011 by Argonne National Laboratory.
+!      See COPYRIGHT in top-level directory.
+!
+      program main
+      use mpi_f08
+      integer errs, ierr, intsize
+      integer i, displs(10), counts(10)
+      TYPE(MPI_Datatype) dtype
+      integer bufsize
+      parameter (bufsize=100)
+      integer inbuf(bufsize), outbuf(bufsize), packbuf(bufsize)
+      integer position, len, psize
+!
+!     Test for hindexed;
+!
+      errs = 0
+      call mtest_init( ierr )
+
+      call mpi_type_size( MPI_INTEGER, intsize, ierr )
+
+      do i=1, 10
+         displs(i) = (10-i)*intsize
+         counts(i) = 1
+      enddo
+      call mpi_type_hindexed( 10, counts, displs, MPI_INTEGER, dtype, &
+      &     ierr )
+      call mpi_type_commit( dtype, ierr )
+!
+      call mpi_pack_size( 1, dtype, MPI_COMM_WORLD, psize, ierr )
+      if (psize .gt. bufsize*intsize) then
+         errs = errs + 1
+      else
+         do i=1,10
+            inbuf(i)  = i
+            outbuf(i) = -i
+         enddo
+         position = 0
+         call mpi_pack( inbuf, 1, dtype, packbuf, psize, position, &
+      &        MPI_COMM_WORLD, ierr )
+!
+         len      = position
+         position = 0
+         call mpi_unpack( packbuf, len, position, outbuf, 10, &
+      &        MPI_INTEGER, MPI_COMM_WORLD, ierr )
+!
+         do i=1, 10
+            if (outbuf(i) .ne. 11-i) then
+               errs = errs + 1
+               print *, 'outbuf(',i,')=',outbuf(i),', expected ', 10-i
+            endif
+         enddo
+      endif
+!
+      call mpi_type_free( dtype, ierr )
+!
+      call mtest_finalize( errs )
+      call mpi_finalize( ierr )
+      end
diff --git a/test/mpi/f08/datatype/hindexed_blockf08.f90 b/test/mpi/f08/datatype/hindexed_blockf08.f90
new file mode 100644
index 0000000..7076bc3
--- /dev/null
+++ b/test/mpi/f08/datatype/hindexed_blockf08.f90
@@ -0,0 +1,181 @@
+! This file created from test/mpi/f77/datatype/hindexed_blockf.f with f77tof90
+! -*- Mode: Fortran; -*-
+!
+!  (C) 2003 by Argonne National Laboratory.
+!      See COPYRIGHT in top-level directory.
+!
+      program main
+      use mpi_f08
+      integer errs, ierr, i, intsize
+      TYPE(MPI_Datatype) type1, type2, type3, type4, type5
+      integer max_asizev
+      parameter (max_asizev = 10)
+      integer (kind=MPI_ADDRESS_KIND) aint, aintv(max_asizev)
+
+      integer blocklens(max_asizev)
+      TYPE(MPI_Datatype) dtypes(max_asizev)
+      integer displs(max_asizev)
+      integer recvbuf(6*max_asizev)
+      integer sendbuf(max_asizev)
+      TYPE(MPI_Status) status
+      integer rank, size
+
+      errs = 0
+
+      call mtest_init( ierr )
+
+      call mpi_comm_size( MPI_COMM_WORLD, size, ierr )
+      call mpi_comm_rank( MPI_COMM_WORLD, rank, ierr )
+!
+      call mpi_type_size( MPI_INTEGER, intsize, ierr )
+!
+      aintv(1) = 0
+      aintv(2) = 3 * intsize
+      call mpi_type_create_resized( MPI_INTEGER, aintv(1), aintv(2), &
+      &                              type1, ierr )
+      call mpi_type_commit( type1, ierr )
+      aintv(1) = -1
+      aintv(2) = -1
+      call mpi_type_get_extent( type1, aintv(1), aintv(2), ierr )
+      if (aintv(1) .ne. 0) then
+         errs = errs + 1
+         print *, 'Did not get expected lb'
+      endif
+      if (aintv(2) .ne. 3*intsize) then
+         errs = errs + 1
+         print *, 'Did not get expected extent'
+      endif
+      aintv(1) = -1
+      aintv(2) = -1
+      call mpi_type_get_true_extent( type1, aintv(1), aintv(2), ierr )
+      if (aintv(1) .ne. 0) then
+         errs = errs + 1
+         print *, 'Did not get expected true lb'
+      endif
+      if (aintv(2) .ne. intsize) then
+         errs = errs + 1
+         print *, 'Did not get expected true extent (', aintv(2), ') ', &
+      &     ' expected ', intsize
+      endif
+!
+      do i=1,10
+         blocklens(i) = 1
+         aintv(i)    = (i-1) * 3 * intsize
+      enddo
+      call mpi_type_create_hindexed( 10, blocklens, aintv, &
+      &                               MPI_INTEGER, type2, ierr )
+      call mpi_type_commit( type2, ierr )
+!
+      aint = 3 * intsize
+      call mpi_type_create_hvector( 10, 1, aint, MPI_INTEGER, type3, &
+      &                              ierr )
+      call mpi_type_commit( type3, ierr )
+!
+      do i=1,10
+         blocklens(i) = 1
+         dtypes(i)    = MPI_INTEGER
+         aintv(i)    = (i-1) * 3 * intsize
+      enddo
+      call mpi_type_create_struct( 10, blocklens, aintv, dtypes, &
+      &                             type4, ierr )
+      call mpi_type_commit( type4, ierr )
+
+      call mpi_type_get_extent(MPI_INTEGER, aintv(1), aint, ierr)
+      do i=1,10
+         aintv(i)    = (i-1) * 3 * aint
+      enddo
+      call mpi_type_create_hindexed_block( 10, 1, aintv, &
+      &                               MPI_INTEGER, type5, ierr )
+      call mpi_type_commit( type5, ierr )
+!
+! Using each time, send and receive using these types
+      do i=1, max_asizev*3
+         recvbuf(i) = -1
+      enddo
+      do i=1, max_asizev
+         sendbuf(i) = i
+      enddo
+      call mpi_sendrecv( sendbuf, max_asizev, MPI_INTEGER, rank, 0, &
+      &                   recvbuf, max_asizev, type1, rank, 0, &
+      &                   MPI_COMM_WORLD, status, ierr )
+      do i=1, max_asizev
+         if (recvbuf(1+(i-1)*3) .ne. i ) then
+            errs = errs + 1
+            print *, 'type1:', i, 'th element = ', recvbuf(1+(i-1)*3)
+         endif
+      enddo
+!
+      do i=1, max_asizev*3
+         recvbuf(i) = -1
+      enddo
+      do i=1, max_asizev
+         sendbuf(i) = i
+      enddo
+      call mpi_sendrecv( sendbuf, max_asizev, MPI_INTEGER, rank, 0, &
+      &                   recvbuf, 1, type2, rank, 0, &
+      &                   MPI_COMM_WORLD, status, ierr )
+      do i=1, max_asizev
+         if (recvbuf(1+(i-1)*3) .ne. i ) then
+            errs = errs + 1
+            print *, 'type2:', i, 'th element = ', recvbuf(1+(i-1)*3)
+         endif
+      enddo
+!
+      do i=1, max_asizev*3
+         recvbuf(i) = -1
+      enddo
+      do i=1, max_asizev
+         sendbuf(i) = i
+      enddo
+      call mpi_sendrecv( sendbuf, max_asizev, MPI_INTEGER, rank, 0, &
+      &                   recvbuf, 1, type3, rank, 0, &
+      &                   MPI_COMM_WORLD, status, ierr )
+      do i=1, max_asizev
+         if (recvbuf(1+(i-1)*3) .ne. i ) then
+            errs = errs + 1
+            print *, 'type3:', i, 'th element = ', recvbuf(1+(i-1)*3)
+         endif
+      enddo
+!
+      do i=1, max_asizev*3
+         recvbuf(i) = -1
+      enddo
+      do i=1, max_asizev
+         sendbuf(i) = i
+      enddo
+      call mpi_sendrecv( sendbuf, max_asizev, MPI_INTEGER, rank, 0, &
+      &                   recvbuf, 1, type4, rank, 0, &
+      &                   MPI_COMM_WORLD, status, ierr )
+      do i=1, max_asizev
+         if (recvbuf(1+(i-1)*3) .ne. i ) then
+            errs = errs + 1
+            print *, 'type4:', i, 'th element = ', recvbuf(1+(i-1)*3)
+         endif
+      enddo
+!
+      do i=1, max_asizev*3
+         recvbuf(i) = -1
+      enddo
+      do i=1, max_asizev
+         sendbuf(i) = i
+      enddo
+      call mpi_sendrecv( sendbuf, max_asizev, MPI_INTEGER, rank, 0, &
+      &                   recvbuf, 1, type5, rank, 0, &
+      &                   MPI_COMM_WORLD, status, ierr )
+      do i=1, max_asizev
+         if (recvbuf(1+(i-1)*3) .ne. i ) then
+            errs = errs + 1
+            print *, 'type5:', i, 'th element = ', recvbuf(1+(i-1)*3)
+         endif
+      enddo
+!
+      call mpi_type_free( type1, ierr )
+      call mpi_type_free( type2, ierr )
+      call mpi_type_free( type3, ierr )
+      call mpi_type_free( type4, ierr )
+      call mpi_type_free( type5, ierr )
+
+      call mtest_finalize( errs )
+      call mpi_finalize( ierr )
+
+      end
diff --git a/test/mpi/f08/datatype/indtype.f90 b/test/mpi/f08/datatype/indtype.f90
new file mode 100644
index 0000000..e08a59c
--- /dev/null
+++ b/test/mpi/f08/datatype/indtype.f90
@@ -0,0 +1,117 @@
+! -*- Mode: Fortran; -*-
+!
+!  (C) 2003 by Argonne National Laboratory.
+!      See COPYRIGHT in top-level directory.
+!
+! This test contributed by Kim McMahon, Cray
+!
+      program main
+      use mpi_f08
+      implicit none
+      integer ierr, i, j, count,errs
+      TYPE(MPI_Datatype) type
+      parameter (count = 4)
+      integer rank, size, xfersize
+      TYPE(MPI_Status) status
+      integer blocklens(count), displs(count)
+      double precision,dimension(:,:),allocatable :: sndbuf, rcvbuf
+      logical verbose
+
+      verbose = .false.
+      call mtest_init ( ierr )
+      call mpi_comm_size( MPI_COMM_WORLD, size, ierr )
+      call mpi_comm_rank( MPI_COMM_WORLD, rank, ierr )
+      if (size .lt. 2) then
+         print *, "Must have at least 2 processes"
+         call MPI_Abort( MPI_COMM_WORLD, 1, ierr )
+      endif
+
+      errs = 0
+      allocate(sndbuf(7,100))
+      allocate(rcvbuf(7,100))
+
+      do j=1,100
+        do i=1,7
+           sndbuf(i,j) = (i+j) * 1.0
+         enddo
+      enddo
+
+      do i=1,count
+         blocklens(i) = 7
+      enddo
+
+! bug occurs when first two displacements are 0
+      displs(1) = 0
+      displs(2) = 0
+      displs(3) = 10
+      displs(4) = 10
+
+      call mpi_type_indexed( count, blocklens, displs*blocklens(1),  &
+      &                         MPI_DOUBLE_PRECISION, type, ierr )
+
+      call mpi_type_commit( type, ierr )
+
+! send using this new type
+
+      if (rank .eq. 0) then
+
+          call mpi_send( sndbuf(1,1), 1, type, 1, 0, MPI_COMM_WORLD,ierr )
+
+      else if (rank .eq. 1) then
+
+          xfersize=count * blocklens(1)
+          call mpi_recv( rcvbuf(1,1), xfersize, MPI_DOUBLE_PRECISION, 0, 0, &
+           &   MPI_COMM_WORLD,status, ierr )
+
+
+! Values that should be sent
+
+        if (verbose) then
+!       displacement = 0
+            j=1
+            do i=1, 7
+               print*,'sndbuf(',i,j,') = ',sndbuf(i,j)
+            enddo
+
+!       displacement = 10
+            j=11
+            do i=1,7
+               print*,'sndbuf(',i,j,') = ',sndbuf(i,j)
+            enddo
+            print*,' '
+
+! Values received
+            do j=1,count
+                do i=1,7
+                    print*,'rcvbuf(',i,j,') = ',rcvbuf(i,j)
+                enddo
+            enddo
+        endif
+
+! Error checking
+        do j=1,2
+           do i=1,7
+             if (rcvbuf(i,j) .ne. sndbuf(i,1)) then
+                print*,'ERROR in rcvbuf(',i,j,')'
+                print*,'Received ', rcvbuf(i,j),' expected ',sndbuf(i,11)
+                errs = errs+1
+             endif
+           enddo
+        enddo
+
+        do j=3,4
+           do i=1,7
+              if (rcvbuf(i,j) .ne. sndbuf(i,11)) then
+                print*,'ERROR in rcvbuf(',i,j,')'
+                print*,'Received ', rcvbuf(i,j),' expected ',sndbuf(i,11)
+                errs = errs+1
+              endif
+           enddo
+        enddo
+      endif
+!
+      call mpi_type_free( type, ierr )
+      call mtest_finalize( errs )
+      call mpi_finalize( ierr )
+
+      end
diff --git a/test/mpi/f08/datatype/kinds.f90 b/test/mpi/f08/datatype/kinds.f90
new file mode 100644
index 0000000..a10a736
--- /dev/null
+++ b/test/mpi/f08/datatype/kinds.f90
@@ -0,0 +1,115 @@
+! -*- Mode: Fortran; -*-
+!
+!  (C) 2011 by Argonne National Laboratory.
+!      See COPYRIGHT in top-level directory.
+!
+! This program tests that all of the integer kinds defined in MPI 2.2 are
+! available.
+!
+  program main
+  use mpi_f08
+  integer (kind=MPI_ADDRESS_KIND) aint, taint
+  integer (kind=MPI_OFFSET_KIND) oint, toint
+  integer (kind=MPI_INTEGER_KIND) iint, tiint
+  TYPE(MPI_Status) s
+  integer i, wsize, wrank, ierr, errs
+!
+  errs = 0
+!
+  call MTEST_INIT(ierr)
+  call MPI_COMM_SIZE(MPI_COMM_WORLD,wsize,ierr)
+  call MPI_COMM_RANK(MPI_COMM_WORLD,wrank,ierr)
+  if (wsize .lt. 2) then
+     print *, "This test requires at least 2 processes"
+     call MPI_ABORT( MPI_COMM_WORLD, 1, ierr )
+  endif
+!
+! Some compilers (e.g., gfortran) will issue an error if, at compile time,
+! an assignment would cause overflow, even if appropriated guarded.  To
+! avoid this problem, we must compute the value in the integer (the
+! code here is simple; there are faster fixes for this but this is easy
+  if (wrank .eq. 0) then
+     if (range(aint) .ge. 10) then
+        aint = 1
+        do i=1, range(aint)-1
+           aint = aint * 10
+        enddo
+        aint = aint - 1
+     else
+        aint = 12345678
+     endif
+     if (range(oint) .ge. 10) then
+        oint = 1
+        do i=1, range(oint)-1
+           oint = oint * 10
+        enddo
+        oint = oint - 1
+     else
+        oint = 12345678
+     endif
+     if (range(iint) .ge. 10) then
+        iint = 1
+        do i=1, range(iint)-1
+           iint = iint * 10
+        enddo
+        iint = iint - 1
+     else
+        iint = 12345678
+     endif
+     call MPI_SEND( aint, 1, MPI_AINT, 1, 0, MPI_COMM_WORLD, ierr )
+     call MPI_SEND( oint, 1, MPI_OFFSET, 1, 1, MPI_COMM_WORLD, ierr )
+     call MPI_SEND( iint, 1, MPI_INTEGER, 1, 2, MPI_COMM_WORLD, ierr )
+!
+  else if (wrank .eq. 1) then
+     if (range(taint) .ge. 10) then
+        taint = 1
+        do i=1, range(taint)-1
+           taint = taint * 10
+        enddo
+        taint = taint - 1
+     else
+        taint = 12345678
+     endif
+     if (range(toint) .ge. 10) then
+        toint = 1
+        do i=1, range(toint)-1
+           toint = toint * 10
+        enddo
+        toint = toint - 1
+     else
+        toint = 12345678
+     endif
+     if (range(tiint) .ge. 10) then
+        tiint = 1
+        do i=1, range(tiint)-1
+           tiint = tiint * 10
+        enddo
+        tiint = tiint - 1
+     else
+        tiint = 12345678
+     endif
+     call MPI_RECV( aint, 1, MPI_AINT, 0, 0, MPI_COMM_WORLD, s, ierr )
+     if (taint .ne. aint) then
+        print *, "Address-sized int not correctly transfered"
+        print *, "Value should be ", taint, " but is ", aint
+        errs = errs + 1
+     endif
+     call MPI_RECV( oint, 1, MPI_OFFSET, 0, 1, MPI_COMM_WORLD, s, ierr )
+     if (toint .ne. oint) then
+        print *, "Offset-sized int not correctly transfered"
+        print *, "Value should be ", toint, " but is ", oint
+        errs = errs + 1
+     endif
+     call MPI_RECV( iint, 1, MPI_INTEGER, 0, 2, MPI_COMM_WORLD, s, ierr )
+     if (tiint .ne. iint) then
+        print *, "Integer (by kind) not correctly transfered"
+        print *, "Value should be ", tiint, " but is ", iint
+        errs = errs + 1
+     endif
+!
+  endif
+!
+  call MTEST_FINALIZE(errs)
+  call MPI_FINALIZE(ierr)
+
+  end
diff --git a/test/mpi/f08/datatype/packef08.f90 b/test/mpi/f08/datatype/packef08.f90
new file mode 100644
index 0000000..776ea2d
--- /dev/null
+++ b/test/mpi/f08/datatype/packef08.f90
@@ -0,0 +1,188 @@
+! This file created from test/mpi/f77/datatype/packef.f with f77tof90
+! -*- Mode: Fortran; -*-
+!
+!  (C) 2003 by Argonne National Laboratory.
+!      See COPYRIGHT in top-level directory.
+!
+       program main
+       use mpi_f08
+       integer ierr, errs
+       integer inbuf(10), ioutbuf(10), inbuf2(10), ioutbuf2(10)
+       integer i, insize, rsize, csize, insize2
+       character*(16) cbuf, coutbuf
+       double precision rbuf(10), routbuf(10)
+       integer packbuf(1000), pbufsize, intsize
+       integer max_asizev
+       parameter (max_asizev = 3)
+       integer (kind=MPI_ADDRESS_KIND) aint, aintv(max_asizev)
+
+
+       errs = 0
+       call mtest_init( ierr )
+
+       call mpi_type_size( MPI_INTEGER, intsize, ierr )
+       pbufsize = 1000 * intsize
+
+       call mpi_pack_external_size( 'external32', 10, MPI_INTEGER,  &
+      &                              aint, ierr )
+       if (aint .ne. 10 * 4) then
+          errs = errs + 1
+          print *, 'Expected 40 for size of 10 external32 integers', &
+      &       ', got ', aint
+       endif
+       call mpi_pack_external_size( 'external32', 10, MPI_LOGICAL,  &
+      &                              aint, ierr )
+       if (aint .ne. 10 * 4) then
+          errs = errs + 1
+          print *, 'Expected 40 for size of 10 external32 logicals', &
+      &       ', got ', aint
+       endif
+       call mpi_pack_external_size( 'external32', 10, MPI_CHARACTER,  &
+      &                              aint, ierr )
+       if (aint .ne. 10 * 1) then
+          errs = errs + 1
+          print *, 'Expected 10 for size of 10 external32 characters', &
+      &       ', got ', aint
+       endif
+
+       call mpi_pack_external_size( 'external32', 3, MPI_INTEGER2, &
+      &                              aint, ierr )
+       if (aint .ne. 3 * 2) then
+          errs = errs + 1
+          print *, 'Expected 6 for size of 3 external32 INTEGER*2', &
+      &       ', got ', aint
+       endif
+       call mpi_pack_external_size( 'external32', 3, MPI_INTEGER4, &
+      &                              aint, ierr )
+       if (aint .ne. 3 * 4) then
+          errs = errs + 1
+          print *, 'Expected 12 for size of 3 external32 INTEGER*4', &
+      &       ', got ', aint
+       endif
+       call mpi_pack_external_size( 'external32', 3, MPI_REAL4, &
+      &                              aint, ierr )
+       if (aint .ne. 3 * 4) then
+          errs = errs + 1
+          print *, 'Expected 12 for size of 3 external32 REAL*4', &
+      &       ', got ', aint
+       endif
+       call mpi_pack_external_size( 'external32', 3, MPI_REAL8, &
+      &                              aint, ierr )
+       if (aint .ne. 3 * 8) then
+          errs = errs + 1
+          print *, 'Expected 24 for size of 3 external32 REAL*8', &
+      &       ', got ', aint
+       endif
+       if (MPI_INTEGER1 .ne. MPI_DATATYPE_NULL) then
+          call mpi_pack_external_size( 'external32', 3, MPI_INTEGER1, &
+      &                              aint, ierr )
+          if (aint .ne. 3 * 1) then
+             errs = errs + 1
+             print *, 'Expected 3 for size of 3 external32 INTEGER*1', &
+      &            ', got ', aint
+          endif
+       endif
+       if (MPI_INTEGER8 .ne. MPI_DATATYPE_NULL) then
+          call mpi_pack_external_size( 'external32', 3, MPI_INTEGER8, &
+      &                              aint, ierr )
+          if (aint .ne. 3 * 8) then
+             errs = errs + 1
+             print *, 'Expected 24 for size of 3 external32 INTEGER*8', &
+      &            ', got ', aint
+          endif
+       endif
+
+!
+! Initialize values
+!
+       insize = 10
+       do i=1, insize
+          inbuf(i) = i
+       enddo
+       rsize = 3
+       do i=1, rsize
+          rbuf(i) = 1000.0 * i
+       enddo
+       cbuf  = 'This is a string'
+       csize = 16
+       insize2 = 7
+       do i=1, insize2
+          inbuf2(i) = 5000-i
+       enddo
+!
+       aintv(1) = pbufsize
+       aintv(2) = 0
+       aintv(3) = 0
+! One MPI implementation failed to increment the position; instead,
+! it set the value with the amount of data packed in this call
+! We use aintv(3) to detect and report this specific error
+       call mpi_pack_external( 'external32', inbuf, insize, MPI_INTEGER, &
+      &               packbuf, aintv(1), aintv(2), ierr )
+       if (aintv(2) .le. aintv(3)) then
+            print *, ' Position decreased after pack of integer!'
+       endif
+       aintv(3) = aintv(2)
+       call mpi_pack_external( 'external32', rbuf, rsize,  &
+      &               MPI_DOUBLE_PRECISION, packbuf, aintv(1),  &
+      &               aintv(2), ierr )
+       if (aintv(2) .le. aintv(3)) then
+            print *, ' Position decreased after pack of real!'
+       endif
+       aintv(3) = aintv(2)
+       call mpi_pack_external( 'external32', cbuf, csize,  &
+      &               MPI_CHARACTER, packbuf, aintv(1),  &
+      &               aintv(2), ierr )
+       if (aintv(2) .le. aintv(3)) then
+            print *, ' Position decreased after pack of character!'
+       endif
+       aintv(3) = aintv(2)
+       call mpi_pack_external( 'external32', inbuf2, insize2,  &
+      &               MPI_INTEGER, &
+      &               packbuf, aintv(1), aintv(2), ierr )
+       if (aintv(2) .le. aintv(3)) then
+            print *, ' Position decreased after pack of integer (2nd)!'
+       endif
+       aintv(3) = aintv(2)
+!
+! We could try sending this with MPI_BYTE...
+       aintv(2) = 0
+       call mpi_unpack_external( 'external32', packbuf, aintv(1), &
+      &  aintv(2), ioutbuf, insize, MPI_INTEGER, ierr )
+       call mpi_unpack_external( 'external32', packbuf, aintv(1), &
+      &  aintv(2), routbuf, rsize, MPI_DOUBLE_PRECISION, ierr )
+       call mpi_unpack_external( 'external32', packbuf, aintv(1), &
+      &  aintv(2), coutbuf, csize, MPI_CHARACTER, ierr )
+       call mpi_unpack_external( 'external32', packbuf, aintv(1), &
+      &  aintv(2), ioutbuf2, insize2, MPI_INTEGER, ierr )
+!
+! Now, test the values
+!
+       do i=1, insize
+          if (ioutbuf(i) .ne. i) then
+             errs = errs + 1
+             print *, 'ioutbuf(',i,') = ', ioutbuf(i), ' expected ', i
+          endif
+       enddo
+       do i=1, rsize
+          if (routbuf(i) .ne. 1000.0 * i) then
+             errs = errs + 1
+             print *, 'routbuf(',i,') = ', routbuf(i), ' expected ',       &
+      &                1000.0 * i
+          endif
+       enddo
+       if (coutbuf(1:csize) .ne. 'This is a string') then
+          errs = errs + 1
+          print *, 'coutbuf = ', coutbuf(1:csize), ' expected ',           &
+      &             'This is a string'
+       endif
+       do i=1, insize2
+          if (ioutbuf2(i) .ne. 5000-i) then
+             errs = errs + 1
+             print *, 'ioutbuf2(',i,') = ', ioutbuf2(i), ' expected ',     &
+      &              5000-i
+          endif
+       enddo
+!
+       call mtest_finalize( errs )
+       call mpi_finalize( ierr )
+       end
diff --git a/test/mpi/f08/datatype/sizeof.f90 b/test/mpi/f08/datatype/sizeof.f90
new file mode 100644
index 0000000..7c467e1
--- /dev/null
+++ b/test/mpi/f08/datatype/sizeof.f90
@@ -0,0 +1,128 @@
+! -*- Mode: Fortran; -*-
+!
+!  (C) 2007 by Argonne National Laboratory.
+!      See COPYRIGHT in top-level directory.
+!
+! This program tests that the MPI_SIZEOF routine is implemented for the
+! predefined scalar Fortran types.  It confirms that the size of these
+! types matches the size of the corresponding MPI datatypes.
+!
+      program main
+      use mpi_f08
+      integer ierr, errs
+      integer rank, size, mpisize
+      logical verbose
+      real    r1,r1v(2)
+      double precision d1,d1v(3)
+      complex c1,c1v(4)
+      integer i1,i1v(5)
+      character ch1,ch1v(6)
+      logical l1,l1v(7)
+
+      verbose = .false.
+      errs = 0
+      call mtest_init ( ierr )
+      call mpi_comm_rank( MPI_COMM_WORLD, rank, ierr )
+
+! Test of scalar types
+      call mpi_sizeof( r1, size, ierr )
+      call mpi_type_size( MPI_REAL, mpisize, ierr )
+      if (size .ne. mpisize) then
+         errs = errs + 1
+         print *, "Size of MPI_REAL = ", mpisize,                         &
+     &            " but MPI_SIZEOF gives ", size
+      endif
+
+      call mpi_sizeof( d1, size, ierr )
+      call mpi_type_size( MPI_DOUBLE_PRECISION, mpisize, ierr )
+      if (size .ne. mpisize) then
+         errs = errs + 1
+         print *, "Size of MPI_DOUBLE_PRECISION = ", mpisize, &
+              " but MPI_SIZEOF gives ", size
+      endif
+
+      call mpi_sizeof( i1, size, ierr )
+      call mpi_type_size( MPI_INTEGER, mpisize, ierr )
+      if (size .ne. mpisize) then
+         errs = errs + 1
+         print *, "Size of MPI_INTEGER = ", mpisize,                      &
+     &            " but MPI_SIZEOF gives ", size
+      endif
+
+      call mpi_sizeof( c1, size, ierr )
+      call mpi_type_size( MPI_COMPLEX, mpisize, ierr )
+      if (size .ne. mpisize) then
+         errs = errs + 1
+         print *, "Size of MPI_COMPLEX = ", mpisize,                      &
+     &            " but MPI_SIZEOF gives ", size
+      endif
+
+      call mpi_sizeof( ch1, size, ierr )
+      call mpi_type_size( MPI_CHARACTER, mpisize, ierr )
+      if (size .ne. mpisize) then
+         errs = errs + 1
+         print *, "Size of MPI_CHARACTER = ", mpisize, &
+              " but MPI_SIZEOF gives ", size
+      endif
+
+      call mpi_sizeof( l1, size, ierr )
+      call mpi_type_size( MPI_LOGICAL, mpisize, ierr )
+      if (size .ne. mpisize) then
+         errs = errs + 1
+         print *, "Size of MPI_LOGICAL = ", mpisize,                        &
+     &        " but MPI_SIZEOF gives ", size
+      endif
+!
+! Test of vector types (1-dimensional)
+      call mpi_sizeof( r1v, size, ierr )
+      call mpi_type_size( MPI_REAL, mpisize, ierr )
+      if (size .ne. mpisize) then
+         errs = errs + 1
+         print *, "Size of MPI_REAL = ", mpisize,                         &
+     &            " but MPI_SIZEOF gives ", size
+      endif
+
+      call mpi_sizeof( d1v, size, ierr )
+      call mpi_type_size( MPI_DOUBLE_PRECISION, mpisize, ierr )
+      if (size .ne. mpisize) then
+         errs = errs + 1
+         print *, "Size of MPI_DOUBLE_PRECISION = ", mpisize, &
+              " but MPI_SIZEOF gives ", size
+      endif
+
+      call mpi_sizeof( i1v, size, ierr )
+      call mpi_type_size( MPI_INTEGER, mpisize, ierr )
+      if (size .ne. mpisize) then
+         errs = errs + 1
+         print *, "Size of MPI_INTEGER = ", mpisize,                      &
+     &            " but MPI_SIZEOF gives ", size
+      endif
+
+      call mpi_sizeof( c1v, size, ierr )
+      call mpi_type_size( MPI_COMPLEX, mpisize, ierr )
+      if (size .ne. mpisize) then
+         errs = errs + 1
+         print *, "Size of MPI_COMPLEX = ", mpisize,                      &
+     &            " but MPI_SIZEOF gives ", size
+      endif
+
+      call mpi_sizeof( ch1v, size, ierr )
+      call mpi_type_size( MPI_CHARACTER, mpisize, ierr )
+      if (size .ne. mpisize) then
+         errs = errs + 1
+         print *, "Size of MPI_CHARACTER = ", mpisize, &
+              " but MPI_SIZEOF gives ", size
+      endif
+
+      call mpi_sizeof( l1v, size, ierr )
+      call mpi_type_size( MPI_LOGICAL, mpisize, ierr )
+      if (size .ne. mpisize) then
+         errs = errs + 1
+         print *, "Size of MPI_LOGICAL = ", mpisize,                        &
+     &        " but MPI_SIZEOF gives ", size
+      endif
+
+      call mtest_finalize( errs )
+      call mpi_finalize( ierr )
+
+      end
diff --git a/test/mpi/f08/datatype/structf.f90 b/test/mpi/f08/datatype/structf.f90
new file mode 100644
index 0000000..1342f66
--- /dev/null
+++ b/test/mpi/f08/datatype/structf.f90
@@ -0,0 +1,113 @@
+!
+!  (C) 2004 by Argonne National Laboratory.
+!      See COPYRIGHT in top-level directory.
+!
+! Thanks to
+! William R. Magro
+! for this test
+!
+! It has been modifiedly slightly to work with the automated MPI
+! tests.
+!  WDG.
+!
+! It was further modified to use MPI_Get_address instead of MPI_Address
+! for MPICH, and to fit in the MPICH test harness - WDG
+!
+      program bustit
+      use mpi_f08
+      implicit none
+
+      TYPE(MPI_Comm) comm
+      TYPE(MPI_Datatype) newtype
+      integer me
+      integer position
+      TYPE(MPI_Datatype) type(5)
+      integer length(5)
+      integer (kind=MPI_ADDRESS_KIND) disp(5)
+      integer bufsize
+      integer errs, toterrs
+      parameter (bufsize=100)
+      character buf(bufsize)
+      character name*(10)
+      TYPE(MPI_Status) status
+      integer i, size
+      double precision x
+      integer src, dest
+      integer ierr
+
+      errs = 0
+!     Enroll in MPI
+      call mpi_init(ierr)
+
+!     get my rank
+      call mpi_comm_rank(MPI_COMM_WORLD, me, ierr)
+      call mpi_comm_size(MPI_COMM_WORLD, size, ierr )
+      if (size .lt. 2) then
+         print *, "Must have at least 2 processes"
+         call MPI_Abort( MPI_COMM_WORLD, 1, ierr )
+      endif
+
+      comm = MPI_COMM_WORLD
+      src = 0
+      dest = 1
+
+      if(me.eq.src) then
+          i=5
+          x=5.1234d0
+          name="Hello"
+
+          type(1)=MPI_CHARACTER
+          length(1)=5
+          call mpi_get_address(name,disp(1),ierr)
+
+          type(2)=MPI_DOUBLE_PRECISION
+          length(2)=1
+          call mpi_get_address(x,disp(2),ierr)
+
+          call mpi_type_create_struct(2,length,disp,type,newtype,ierr)
+          call mpi_type_commit(newtype,ierr)
+          call mpi_barrier( MPI_COMM_WORLD, ierr )
+          call mpi_send(MPI_BOTTOM,1,newtype,dest,1,comm,ierr)
+          call mpi_type_free(newtype,ierr)
+!         write(*,*) "Sent ",name(1:5),x
+      else
+!         Everyone calls barrier incase size > 2
+          call mpi_barrier( MPI_COMM_WORLD, ierr )
+          if (me.eq.dest) then
+             position=0
+
+             name = " "
+             x    = 0.0d0
+             call mpi_recv(buf,bufsize,MPI_PACKED, src,                    &
+     &            1, comm, status, ierr)
+
+             call mpi_unpack(buf,bufsize,position,                         &
+     &            name,5,MPI_CHARACTER, comm,ierr)
+             call mpi_unpack(buf,bufsize,position,                         &
+     &            x,1,MPI_DOUBLE_PRECISION, comm,ierr)
+!            Check the return values (/= is not-equal in F90)
+             if (name /= "Hello") then
+                errs = errs + 1
+                print *, "Received ", name, " but expected Hello"
+             endif
+             if (abs(x-5.1234) .gt. 1.0e-6) then
+                errs = errs + 1
+                print *, "Received ", x, " but expected 5.1234"
+             endif
+          endif
+      endif
+!
+!     Sum up errs and report the result
+      call mpi_reduce( errs, toterrs, 1, MPI_INTEGER, MPI_SUM, 0,         &
+     &                 MPI_COMM_WORLD, ierr )
+      if (me .eq. 0) then
+         if (toterrs .eq. 0) then
+            print *, " No Errors"
+         else
+            print *, " Found ", toterrs, " errors"
+         endif
+      endif
+
+      call mpi_finalize(ierr)
+
+      end
diff --git a/test/mpi/f08/datatype/testlist b/test/mpi/f08/datatype/testlist
new file mode 100644
index 0000000..fd3bd2a
--- /dev/null
+++ b/test/mpi/f08/datatype/testlist
@@ -0,0 +1,19 @@
+typenamef08 1
+typename3f08 1 mpiversion=3.0
+typesnamef08 1
+typecntsf08 1
+typem2f08 1
+typesubf08 1
+packef08 1
+gaddressf08 1
+allctypesf08 1
+hindex1f08 1
+hindexed_blockf08 1 mpiversion=3.0
+structf 2
+indtype 2
+createf08 1
+sizeof 1
+kinds 2 mpiversion=2.2
+trf08 1
+get_elem_d 2
+get_elem_u 2
diff --git a/test/mpi/f08/datatype/trf08.f90 b/test/mpi/f08/datatype/trf08.f90
new file mode 100644
index 0000000..db98611
--- /dev/null
+++ b/test/mpi/f08/datatype/trf08.f90
@@ -0,0 +1,25 @@
+! -*- Mode: Fortran; -*-
+!
+!  (C) 2011 by Argonne National Laboratory.
+!      See COPYRIGHT in top-level directory.
+!
+! Based on a sample program that triggered a segfault in MPICH
+program testf90_mpi
+  use mpi_f08
+  implicit none
+  integer errs
+  integer :: ierr
+  TYPE(MPI_Datatype) :: ctype, rk_mpi
+
+  errs = 0
+  call mtest_init(ierr)
+
+  call MPI_Type_create_f90_real(15, MPI_UNDEFINED, rk_mpi, ierr)
+  call MPI_Type_contiguous(19, rk_mpi, ctype, ierr)
+  call MPI_Type_commit(ctype, ierr)
+  call MPI_Type_free(ctype, ierr)
+
+  call mtest_finalize(errs)
+  call MPI_Finalize(ierr)
+
+end program testf90_mpi
diff --git a/test/mpi/f08/datatype/typecntsf08.f90 b/test/mpi/f08/datatype/typecntsf08.f90
new file mode 100644
index 0000000..25d512b
--- /dev/null
+++ b/test/mpi/f08/datatype/typecntsf08.f90
@@ -0,0 +1,93 @@
+! This file created from test/mpi/f77/datatype/typecntsf.f with f77tof90
+! -*- Mode: Fortran; -*-
+!
+!  (C) 2003 by Argonne National Laboratory.
+!      See COPYRIGHT in top-level directory.
+!
+       program main
+       use mpi_f08
+       integer errs, ierr
+       TYPE(MPI_Datatype) ntype1, ntype2
+!
+! This is a very simple test that just tests that the contents/envelope
+! routines can be called.  This should be upgraded to test the new
+! MPI-2 datatype routines (which use address-sized integers)
+!
+
+       errs = 0
+       call mtest_init( ierr )
+
+       call explore( MPI_INTEGER, MPI_COMBINER_NAMED, errs )
+       call explore( MPI_BYTE, MPI_COMBINER_NAMED, errs )
+       call mpi_type_vector( 10, 1, 30, MPI_DOUBLE_PRECISION, ntype1,  &
+      &                       ierr )
+       call explore( ntype1, MPI_COMBINER_VECTOR, errs )
+       call mpi_type_dup( ntype1, ntype2, ierr )
+       call explore( ntype2, MPI_COMBINER_DUP, errs )
+       call mpi_type_free( ntype2, ierr )
+       call mpi_type_free( ntype1, ierr )
+
+!
+       call mtest_finalize( errs )
+       call mpi_finalize( ierr )
+       end
+!
+       subroutine explore( dtype, mycomb, errs )
+       use mpi_f08
+       integer mycomb, errs
+       TYPE(MPI_Datatype) dtype
+       integer ierr
+       integer nints, nadds, ntype, combiner
+       integer max_nints, max_dtypes, max_asizev
+       parameter (max_nints = 10, max_dtypes = 10, max_asizev=10)
+       integer intv(max_nints)
+       TYPE(MPI_Datatype) dtypesv(max_dtypes)
+       integer (kind=MPI_ADDRESS_KIND) aint, aintv(max_asizev)
+
+!
+       call mpi_type_get_envelope( dtype, nints, nadds, ntype, &
+      &                             combiner, ierr )
+!
+       if (combiner .ne. MPI_COMBINER_NAMED) then
+          call mpi_type_get_contents( dtype,  &
+      &         max_nints, max_asizev, max_dtypes, &
+      &         intv, aintv, dtypesv, ierr )
+!
+!              dtypesv of constructed types must be free'd now
+!
+          if (combiner .eq. MPI_COMBINER_DUP) then
+             call mpi_type_free( dtypesv(1), ierr )
+          endif
+       endif
+       if (combiner .ne. mycomb) then
+          errs = errs + 1
+          print *, ' Expected combiner ', mycomb, ' but got ', &
+      &             combiner
+       endif
+!
+! List all combiner types to check that they are defined in mpif.h
+       if (combiner .eq. MPI_COMBINER_NAMED) then
+       else if (combiner .eq. MPI_COMBINER_DUP) then
+       else if (combiner .eq. MPI_COMBINER_CONTIGUOUS) then
+       else if (combiner .eq. MPI_COMBINER_VECTOR) then
+       else if (combiner .eq. MPI_COMBINER_HVECTOR_INTEGER) then
+       else if (combiner .eq. MPI_COMBINER_HVECTOR) then
+       else if (combiner .eq. MPI_COMBINER_INDEXED) then
+       else if (combiner .eq. MPI_COMBINER_HINDEXED_INTEGER) then
+       else if (combiner .eq. MPI_COMBINER_HINDEXED) then
+       else if (combiner .eq. MPI_COMBINER_INDEXED_BLOCK) then
+       else if (combiner .eq. MPI_COMBINER_STRUCT_INTEGER) then
+       else if (combiner .eq. MPI_COMBINER_STRUCT) then
+       else if (combiner .eq. MPI_COMBINER_SUBARRAY) then
+       else if (combiner .eq. MPI_COMBINER_DARRAY) then
+       else if (combiner .eq. MPI_COMBINER_F90_REAL) then
+       else if (combiner .eq. MPI_COMBINER_F90_COMPLEX) then
+       else if (combiner .eq. MPI_COMBINER_F90_INTEGER) then
+       else if (combiner .eq. MPI_COMBINER_RESIZED) then
+       else
+          errs = errs + 1
+          print *, ' Unknown combiner ', combiner
+       endif
+
+       return
+       end
diff --git a/test/mpi/f08/datatype/typem2f08.f90 b/test/mpi/f08/datatype/typem2f08.f90
new file mode 100644
index 0000000..7852bbe
--- /dev/null
+++ b/test/mpi/f08/datatype/typem2f08.f90
@@ -0,0 +1,180 @@
+! This file created from test/mpi/f77/datatype/typem2f.f with f77tof90
+! -*- Mode: Fortran; -*-
+!
+!  (C) 2003 by Argonne National Laboratory.
+!      See COPYRIGHT in top-level directory.
+!
+      program main
+      use mpi_f08
+      integer errs, ierr, i, intsize
+      TYPE(MPI_Datatype) type1, type2, type3, type4, type5
+      integer max_asizev
+      parameter (max_asizev = 10)
+      integer (kind=MPI_ADDRESS_KIND) aint, aintv(max_asizev)
+
+      integer blocklens(max_asizev)
+      TYPE(MPI_Datatype) dtypes(max_asizev)
+      integer displs(max_asizev)
+      integer recvbuf(6*max_asizev)
+      integer sendbuf(max_asizev)
+      TYPE(MPI_Status) status
+      integer rank, size
+
+      errs = 0
+
+      call mtest_init( ierr )
+
+      call mpi_comm_size( MPI_COMM_WORLD, size, ierr )
+      call mpi_comm_rank( MPI_COMM_WORLD, rank, ierr )
+!
+      call mpi_type_size( MPI_INTEGER, intsize, ierr )
+!
+      aintv(1) = 0
+      aintv(2) = 3 * intsize
+      call mpi_type_create_resized( MPI_INTEGER, aintv(1), aintv(2),  &
+      &                              type1, ierr )
+      call mpi_type_commit( type1, ierr )
+      aintv(1) = -1
+      aintv(2) = -1
+      call mpi_type_get_extent( type1, aintv(1), aintv(2), ierr )
+      if (aintv(1) .ne. 0) then
+         errs = errs + 1
+         print *, 'Did not get expected lb'
+      endif
+      if (aintv(2) .ne. 3*intsize) then
+         errs = errs + 1
+         print *, 'Did not get expected extent'
+      endif
+      aintv(1) = -1
+      aintv(2) = -1
+      call mpi_type_get_true_extent( type1, aintv(1), aintv(2), ierr )
+      if (aintv(1) .ne. 0) then
+         errs = errs + 1
+         print *, 'Did not get expected true lb'
+      endif
+      if (aintv(2) .ne. intsize) then
+         errs = errs + 1
+         print *, 'Did not get expected true extent (', aintv(2), ') ', &
+      &     ' expected ', intsize
+      endif
+!
+      do i=1,10
+         blocklens(i) = 1
+         aintv(i)    = (i-1) * 3 * intsize
+      enddo
+      call mpi_type_create_hindexed( 10, blocklens, aintv,  &
+      &                               MPI_INTEGER, type2, ierr )
+      call mpi_type_commit( type2, ierr )
+!
+      aint = 3 * intsize
+      call mpi_type_create_hvector( 10, 1, aint, MPI_INTEGER, type3,  &
+      &                              ierr )
+      call mpi_type_commit( type3, ierr )
+!
+      do i=1,10
+         blocklens(i) = 1
+         dtypes(i)    = MPI_INTEGER
+         aintv(i)    = (i-1) * 3 * intsize
+      enddo
+      call mpi_type_create_struct( 10, blocklens, aintv, dtypes, &
+      &                             type4, ierr )
+      call mpi_type_commit( type4, ierr )
+
+      do i=1,10
+         displs(i)    = (i-1) * 3
+      enddo
+      call mpi_type_create_indexed_block( 10, 1, displs,  &
+      &                               MPI_INTEGER, type5, ierr )
+      call mpi_type_commit( type5, ierr )
+!
+! Using each time, send and receive using these types
+      do i=1, max_asizev*3
+         recvbuf(i) = -1
+      enddo
+      do i=1, max_asizev
+         sendbuf(i) = i
+      enddo
+      call mpi_sendrecv( sendbuf, max_asizev, MPI_INTEGER, rank, 0,  &
+      &                   recvbuf, max_asizev, type1, rank, 0,  &
+      &                   MPI_COMM_WORLD, status, ierr )
+      do i=1, max_asizev
+         if (recvbuf(1+(i-1)*3) .ne. i ) then
+            errs = errs + 1
+            print *, 'type1:', i, 'th element = ', recvbuf(1+(i-1)*3)
+         endif
+      enddo
+!
+      do i=1, max_asizev*3
+         recvbuf(i) = -1
+      enddo
+      do i=1, max_asizev
+         sendbuf(i) = i
+      enddo
+      call mpi_sendrecv( sendbuf, max_asizev, MPI_INTEGER, rank, 0,  &
+      &                   recvbuf, 1, type2, rank, 0,  &
+      &                   MPI_COMM_WORLD, status, ierr )
+      do i=1, max_asizev
+         if (recvbuf(1+(i-1)*3) .ne. i ) then
+            errs = errs + 1
+            print *, 'type2:', i, 'th element = ', recvbuf(1+(i-1)*3)
+         endif
+      enddo
+!
+      do i=1, max_asizev*3
+         recvbuf(i) = -1
+      enddo
+      do i=1, max_asizev
+         sendbuf(i) = i
+      enddo
+      call mpi_sendrecv( sendbuf, max_asizev, MPI_INTEGER, rank, 0,  &
+      &                   recvbuf, 1, type3, rank, 0,  &
+      &                   MPI_COMM_WORLD, status, ierr )
+      do i=1, max_asizev
+         if (recvbuf(1+(i-1)*3) .ne. i ) then
+            errs = errs + 1
+            print *, 'type3:', i, 'th element = ', recvbuf(1+(i-1)*3)
+         endif
+      enddo
+!
+      do i=1, max_asizev*3
+         recvbuf(i) = -1
+      enddo
+      do i=1, max_asizev
+         sendbuf(i) = i
+      enddo
+      call mpi_sendrecv( sendbuf, max_asizev, MPI_INTEGER, rank, 0,  &
+      &                   recvbuf, 1, type4, rank, 0,  &
+      &                   MPI_COMM_WORLD, status, ierr )
+      do i=1, max_asizev
+         if (recvbuf(1+(i-1)*3) .ne. i ) then
+            errs = errs + 1
+            print *, 'type4:', i, 'th element = ', recvbuf(1+(i-1)*3)
+         endif
+      enddo
+!
+      do i=1, max_asizev*3
+         recvbuf(i) = -1
+      enddo
+      do i=1, max_asizev
+         sendbuf(i) = i
+      enddo
+      call mpi_sendrecv( sendbuf, max_asizev, MPI_INTEGER, rank, 0,  &
+      &                   recvbuf, 1, type5, rank, 0,  &
+      &                   MPI_COMM_WORLD, status, ierr )
+      do i=1, max_asizev
+         if (recvbuf(1+(i-1)*3) .ne. i ) then
+            errs = errs + 1
+            print *, 'type5:', i, 'th element = ', recvbuf(1+(i-1)*3)
+         endif
+      enddo
+!
+      call mpi_type_free( type1, ierr )
+      call mpi_type_free( type2, ierr )
+      call mpi_type_free( type3, ierr )
+      call mpi_type_free( type4, ierr )
+      call mpi_type_free( type5, ierr )
+
+      call mtest_finalize( errs )
+      call mpi_finalize( ierr )
+
+      end
diff --git a/test/mpi/f08/datatype/typename3f08.f90 b/test/mpi/f08/datatype/typename3f08.f90
new file mode 100644
index 0000000..f884052
--- /dev/null
+++ b/test/mpi/f08/datatype/typename3f08.f90
@@ -0,0 +1,41 @@
+! This file created from test/mpi/f77/datatype/typename3f.f with f77tof90
+! -*- Mode: Fortran; -*-
+!
+!
+!  (C) 2012 by Argonne National Laboratory.
+!      See COPYRIGHT in top-level directory.
+!
+      program main
+      use mpi_f08
+      character*(MPI_MAX_OBJECT_NAME) name
+      integer namelen
+      integer ierr, errs
+
+      errs = 0
+
+      call mtest_init( ierr )
+!
+! Check each Fortran datatype, including the size-specific ones
+! See the C version (typename.c) for the relevant MPI sections
+
+      call MPI_Type_get_name( MPI_AINT, name, namelen, ierr )
+      if (name(1:namelen) .ne. "MPI_AINT") then
+           errs = errs + 1
+           print *, "Expected MPI_AINT but got "//name(1:namelen)
+      endif
+
+      call MPI_Type_get_name( MPI_OFFSET, name, namelen, ierr )
+      if (name(1:namelen) .ne. "MPI_OFFSET") then
+           errs = errs + 1
+           print *, "Expected MPI_OFFSET but got "//name(1:namelen)
+      endif
+
+      call MPI_Type_get_name( MPI_COUNT, name, namelen, ierr )
+      if (name(1:namelen) .ne. "MPI_COUNT") then
+           errs = errs + 1
+           print *, "Expected MPI_COUNT but got "//name(1:namelen)
+      endif
+
+      call mtest_finalize( errs )
+      call MPI_Finalize( ierr )
+      end
diff --git a/test/mpi/f08/datatype/typenamef08.f90 b/test/mpi/f08/datatype/typenamef08.f90
new file mode 100644
index 0000000..a2f8197
--- /dev/null
+++ b/test/mpi/f08/datatype/typenamef08.f90
@@ -0,0 +1,205 @@
+! This file created from test/mpi/f77/datatype/typenamef.f with f77tof90
+! -*- Mode: Fortran; -*-
+!
+!
+!  (C) 2003 by Argonne National Laboratory.
+!      See COPYRIGHT in top-level directory.
+!
+      program main
+      use mpi_f08
+      character*(MPI_MAX_OBJECT_NAME) name
+      integer namelen
+      integer ierr, errs
+
+      errs = 0
+
+      call mtest_init( ierr )
+!
+! Check each Fortran datatype, including the size-specific ones
+! See the C version (typename.c) for the relevant MPI sections
+
+      call MPI_Type_get_name( MPI_COMPLEX, name, namelen, ierr )
+      if (name(1:namelen) .ne. "MPI_COMPLEX") then
+           errs = errs + 1
+           print *, "Expected MPI_COMPLEX but got "//name(1:namelen)
+      endif
+
+      call MPI_Type_get_name( MPI_DOUBLE_COMPLEX, name, namelen, ierr )
+      if (name(1:namelen) .ne. "MPI_DOUBLE_COMPLEX") then
+           errs = errs + 1
+           print *, "Expected MPI_DOUBLE_COMPLEX but got "// &
+      &          name(1:namelen)
+      endif
+
+      call MPI_Type_get_name( MPI_LOGICAL, name, namelen, ierr )
+      if (name(1:namelen) .ne. "MPI_LOGICAL") then
+           errs = errs + 1
+           print *, "Expected MPI_LOGICAL but got "//name(1:namelen)
+      endif
+
+      call MPI_Type_get_name( MPI_REAL, name, namelen, ierr )
+      if (name(1:namelen) .ne. "MPI_REAL") then
+           errs = errs + 1
+           print *, "Expected MPI_REAL but got "//name(1:namelen)
+      endif
+
+      call MPI_Type_get_name( MPI_DOUBLE_PRECISION, name, namelen, ierr)
+      if (name(1:namelen) .ne. "MPI_DOUBLE_PRECISION") then
+           errs = errs + 1
+           print *, "Expected MPI_DOUBLE_PRECISION but got "// &
+      &          name(1:namelen)
+      endif
+
+      call MPI_Type_get_name( MPI_INTEGER, name, namelen, ierr )
+      if (name(1:namelen) .ne. "MPI_INTEGER") then
+           errs = errs + 1
+           print *, "Expected MPI_INTEGER but got "//name(1:namelen)
+      endif
+
+      call MPI_Type_get_name( MPI_2INTEGER, name, namelen, ierr )
+      if (name(1:namelen) .ne. "MPI_2INTEGER") then
+           errs = errs + 1
+           print *, "Expected MPI_2INTEGER but got "//name(1:namelen)
+      endif
+
+! 2COMPLEX was present only in MPI 1.0
+!      call MPI_Type_get_name( MPI_2COMPLEX, name, namelen, ierr )
+!      if (name(1:namelen) .ne. "MPI_2COMPLEX") then
+!           errs = errs + 1
+!           print *, "Expected MPI_2COMPLEX but got "//name(1:namelen)
+!      endif
+!
+      call MPI_Type_get_name(MPI_2DOUBLE_PRECISION, name, namelen, ierr)
+      if (name(1:namelen) .ne. "MPI_2DOUBLE_PRECISION") then
+           errs = errs + 1
+           print *, "Expected MPI_2DOUBLE_PRECISION but got "// &
+      &          name(1:namelen)
+      endif
+
+      call MPI_Type_get_name( MPI_2REAL, name, namelen, ierr )
+      if (name(1:namelen) .ne. "MPI_2REAL") then
+           errs = errs + 1
+           print *, "Expected MPI_2REAL but got "//name(1:namelen)
+      endif
+
+! 2DOUBLE_COMPLEX isn't in MPI 2.1
+!      call MPI_Type_get_name( MPI_2DOUBLE_COMPLEX, name, namelen, ierr )
+!      if (name(1:namelen) .ne. "MPI_2DOUBLE_COMPLEX") then
+!           errs = errs + 1
+!           print *, "Expected MPI_2DOUBLE_COMPLEX but got "//
+!     &          name(1:namelen)
+!      endif
+
+      call MPI_Type_get_name( MPI_CHARACTER, name, namelen, ierr )
+      if (name(1:namelen) .ne. "MPI_CHARACTER") then
+           errs = errs + 1
+           print *, "Expected MPI_CHARACTER but got "//name(1:namelen)
+      endif
+
+      call MPI_Type_get_name( MPI_BYTE, name, namelen, ierr )
+      if (name(1:namelen) .ne. "MPI_BYTE") then
+           errs = errs + 1
+           print *, "Expected MPI_BYTE but got "//name(1:namelen)
+      endif
+
+      if (MPI_REAL4 .ne. MPI_DATATYPE_NULL) then
+          call MPI_Type_get_name( MPI_REAL4, name, namelen, ierr )
+          if (name(1:namelen) .ne. "MPI_REAL4") then
+               errs = errs + 1
+               print *, "Expected MPI_REAL4 but got "//name(1:namelen)
+          endif
+      endif
+
+      if (MPI_REAL8 .ne. MPI_DATATYPE_NULL) then
+          call MPI_Type_get_name( MPI_REAL8, name, namelen, ierr )
+          if (name(1:namelen) .ne. "MPI_REAL8") then
+               errs = errs + 1
+               print *, "Expected MPI_REAL8 but got "//name(1:namelen)
+          endif
+      endif
+
+      if (MPI_REAL16 .ne. MPI_DATATYPE_NULL) then
+          call MPI_Type_get_name( MPI_REAL16, name, namelen, ierr )
+          if (name(1:namelen) .ne. "MPI_REAL16") then
+               errs = errs + 1
+               print *, "Expected MPI_REAL16 but got "//name(1:namelen)
+          endif
+      endif
+
+      if (MPI_COMPLEX8 .ne. MPI_DATATYPE_NULL) then
+          call MPI_Type_get_name( MPI_COMPLEX8, name, namelen, ierr )
+          if (name(1:namelen) .ne. "MPI_COMPLEX8") then
+               errs = errs + 1
+               print *, "Expected MPI_COMPLEX8 but got "// &
+      &              name(1:namelen)
+          endif
+      endif
+
+      if (MPI_COMPLEX16 .ne. MPI_DATATYPE_NULL) then
+          call MPI_Type_get_name( MPI_COMPLEX16, name, namelen, ierr )
+          if (name(1:namelen) .ne. "MPI_COMPLEX16") then
+               errs = errs + 1
+               print *, "Expected MPI_COMPLEX16 but got "// &
+      &              name(1:namelen)
+          endif
+      endif
+
+      if (MPI_COMPLEX32 .ne. MPI_DATATYPE_NULL) then
+          call MPI_Type_get_name( MPI_COMPLEX32, name, namelen, ierr )
+          if (name(1:namelen) .ne. "MPI_COMPLEX32") then
+               errs = errs + 1
+               print *, "Expected MPI_COMPLEX32 but got "// &
+      &              name(1:namelen)
+          endif
+      endif
+
+      if (MPI_INTEGER1 .ne. MPI_DATATYPE_NULL) then
+          call MPI_Type_get_name( MPI_INTEGER1, name, namelen, ierr )
+          if (name(1:namelen) .ne. "MPI_INTEGER1") then
+               errs = errs + 1
+               print *, "Expected MPI_INTEGER1 but got "// &
+      &              name(1:namelen)
+          endif
+      endif
+
+      if (MPI_INTEGER2 .ne. MPI_DATATYPE_NULL) then
+          call MPI_Type_get_name( MPI_INTEGER2, name, namelen, ierr )
+          if (name(1:namelen) .ne. "MPI_INTEGER2") then
+               errs = errs + 1
+               print *, "Expected MPI_INTEGER2 but got "// &
+      &              name(1:namelen)
+          endif
+      endif
+
+      if (MPI_INTEGER4 .ne. MPI_DATATYPE_NULL) then
+          call MPI_Type_get_name( MPI_INTEGER4, name, namelen, ierr )
+          if (name(1:namelen) .ne. "MPI_INTEGER4") then
+               errs = errs + 1
+               print *, "Expected MPI_INTEGER4 but got "// &
+      &              name(1:namelen)
+          endif
+      endif
+
+      if (MPI_INTEGER8 .ne. MPI_DATATYPE_NULL) then
+          call MPI_Type_get_name( MPI_INTEGER8, name, namelen, ierr )
+          if (name(1:namelen) .ne. "MPI_INTEGER8") then
+               errs = errs + 1
+               print *, "Expected MPI_INTEGER8 but got "// &
+      &              name(1:namelen)
+          endif
+      endif
+
+! MPI_INTEGER16 is in MPI 2.1, but it is missing from most tables
+! Some MPI implementations may not provide it
+!      if (MPI_INTEGER16 .ne. MPI_DATATYPE_NULL) then
+!          call MPI_Type_get_name( MPI_INTEGER16, name, namelen, ierr )
+!          if (name(1:namelen) .ne. "MPI_INTEGER16") then
+!               errs = errs + 1
+!               print *, "Expected MPI_INTEGER16 but got "//
+!     &              name(1:namelen)
+!          endif
+!      endif
+
+      call mtest_finalize( errs )
+      call MPI_Finalize( ierr )
+      end
diff --git a/test/mpi/f08/datatype/typesnamef08.f90 b/test/mpi/f08/datatype/typesnamef08.f90
new file mode 100644
index 0000000..ecb9213
--- /dev/null
+++ b/test/mpi/f08/datatype/typesnamef08.f90
@@ -0,0 +1,68 @@
+! This file created from test/mpi/f77/datatype/typesnamef.f with f77tof90
+! -*- Mode: Fortran; -*-
+!
+!  (C) 2003 by Argonne National Laboratory.
+!      See COPYRIGHT in top-level directory.
+!
+       program main
+       use mpi_f08
+       character*(MPI_MAX_OBJECT_NAME) cname
+       integer rlen, ln
+       integer errs, ierr
+       TYPE(MPI_Datatype) ntype1, ntype2
+
+       errs = 0
+
+       call MTest_Init( ierr )
+
+       call mpi_type_vector( 10, 1, 100, MPI_INTEGER, ntype1, ierr )
+       rlen = -1
+       cname = 'XXXXXX'
+       call mpi_type_get_name( ntype1, cname, rlen, ierr )
+       if (rlen .ne. 0) then
+          errs = errs + 1
+          print *, ' Expected length 0, got ', rlen
+       endif
+       rlen = 0
+       do ln=MPI_MAX_OBJECT_NAME,1,-1
+          if (cname(ln:ln) .ne. ' ') then
+             rlen = ln
+             goto 100
+          endif
+       enddo
+ 100   continue
+       if (rlen .ne. 0) then
+          errs = errs + 1
+          print *, 'Datatype name is not all blank'
+       endif
+!
+! now add a name, then dup
+       call mpi_type_set_name( ntype1, 'a vector type', ierr )
+       call mpi_type_dup( ntype1, ntype2, ierr )
+       rlen = -1
+       cname = 'XXXXXX'
+       call mpi_type_get_name( ntype2, cname, rlen, ierr )
+       if (rlen .ne. 0) then
+          errs = errs + 1
+          print *, ' (type2) Expected length 0, got ', rlen
+       endif
+       rlen = 0
+       do ln=MPI_MAX_OBJECT_NAME,1,-1
+          if (cname(ln:ln) .ne. ' ') then
+             rlen = ln
+             goto 110
+          endif
+       enddo
+ 110   continue
+       if (rlen .ne. 0) then
+          errs = errs + 1
+          print *, ' (type2) Datatype name is not all blank'
+       endif
+
+       call mpi_type_free( ntype1, ierr )
+       call mpi_type_free( ntype2, ierr )
+
+       call MTest_Finalize( errs )
+       call MPI_Finalize( ierr )
+
+       end
diff --git a/test/mpi/f08/datatype/typesubf08.f90 b/test/mpi/f08/datatype/typesubf08.f90
new file mode 100644
index 0000000..4f7be6b
--- /dev/null
+++ b/test/mpi/f08/datatype/typesubf08.f90
@@ -0,0 +1,74 @@
+! This file created from test/mpi/f77/datatype/typesubf.f with f77tof90
+! -*- Mode: Fortran; -*-
+!
+!  (C) 2003 by Argonne National Laboratory.
+!      See COPYRIGHT in top-level directory.
+!
+      program main
+      use mpi_f08
+      integer errs, ierr
+      integer maxn, maxm
+      parameter (maxn=10,maxm=15)
+      integer fullsizes(2), subsizes(2), starts(2)
+      integer fullarr(maxn,maxm),subarr(maxn-3,maxm-4)
+      integer i,j, ssize
+      integer size, rank, ans
+      TYPE(MPI_Datatype) newtype
+
+      errs = 0
+      call mtest_init( ierr )
+      call mpi_comm_size( MPI_COMM_WORLD, size, ierr )
+      call mpi_comm_rank( MPI_COMM_WORLD, rank, ierr )
+!
+! Create a Fortran-style subarray
+      fullsizes(1) = maxn
+      fullsizes(2) = maxm
+      subsizes(1)  = maxn - 3
+      subsizes(2)  = maxm - 4
+! starts are from zero, even in Fortran
+      starts(1)    = 1
+      starts(2)    = 2
+! In Fortran 90 notation, the original array is
+!    integer a(maxn,maxm)
+! and the subarray is
+!    a(1+1:(maxn-3) +(1+1)-1,2+1:(maxm-4)+(2+1)-1)
+! i.e., a (start:(len + start - 1),...)
+      call mpi_type_create_subarray( 2, fullsizes, subsizes, starts,  &
+      &         MPI_ORDER_FORTRAN, MPI_INTEGER, newtype, ierr )
+      call mpi_type_commit( newtype, ierr )
+!
+! Prefill the array
+      do j=1, maxm
+         do i=1, maxn
+            fullarr(i,j) = (i-1) + (j-1) * maxn
+         enddo
+      enddo
+      do j=1, subsizes(2)
+         do i=1, subsizes(1)
+            subarr(i,j) = -1
+         enddo
+      enddo
+      ssize = subsizes(1)*subsizes(2)
+      call mpi_sendrecv( fullarr, 1, newtype, rank, 0,  &
+      &                   subarr, ssize, MPI_INTEGER, rank, 0,  &
+      &                   MPI_COMM_WORLD, MPI_STATUS_IGNORE, ierr )
+!
+! Check the data
+      do j=1, subsizes(2)
+         do i=1, subsizes(1)
+            ans = (i+starts(1)-1) + (j+starts(2)-1) * maxn
+            if (subarr(i,j) .ne. ans) then
+               errs = errs + 1
+               if (errs .le. 10) then
+                  print *, rank, 'subarr(',i,',',j,') = ', subarr(i,j)
+               endif
+            endif
+         enddo
+      enddo
+
+      call mpi_type_free( newtype, ierr )
+
+      call mtest_finalize( errs )
+      call mpi_finalize( ierr )
+
+      end
diff --git a/test/mpi/f08/pt2pt/Makefile.am b/test/mpi/f08/pt2pt/Makefile.am
new file mode 100644
index 0000000..4df3e41
--- /dev/null
+++ b/test/mpi/f08/pt2pt/Makefile.am
@@ -0,0 +1,18 @@
+# -*- Mode: Makefile; -*-
+# vim: set ft=automake :
+#
+# (C) 2014 by Argonne National Laboratory.
+#     See COPYRIGHT in top-level directory.
+#
+
+include $(top_srcdir)/Makefile_f08.mtest
+
+# avoid having to write many "foo_SOURCES = foo.f90" lines
+AM_DEFAULT_SOURCE_EXT = .f90
+
+## for all programs that are just built from the single corresponding source
+## file, we don't need per-target _SOURCES rules, automake will infer them
+## correctly
+noinst_PROGRAMS = allpairf08 greqf08 statusesf08 mprobef08
+
+greqf08_SOURCES = greqf08.f90 dummyf08.f90
diff --git a/test/mpi/f08/pt2pt/allpairf08.f90 b/test/mpi/f08/pt2pt/allpairf08.f90
new file mode 100644
index 0000000..8b70858
--- /dev/null
+++ b/test/mpi/f08/pt2pt/allpairf08.f90
@@ -0,0 +1,1037 @@
+! This file created from test/mpi/f77/pt2pt/allpairf.f with f77tof90
+! -*- Mode: Fortran; -*-
+!
+!  (C) 2012 by Argonne National Laboratory.
+!      See COPYRIGHT in top-level directory.
+!
+! This program is based on the allpair.f test from the MPICH-1 test
+! (test/pt2pt/allpair.f), which in turn was inspired by a bug report from
+! fsset at corelli.lerc.nasa.gov (Scott Townsend)
+
+      program allpair
+      use mpi_f08
+      integer ierr, errs
+      TYPE(MPI_Comm) comm
+      logical mtestGetIntraComm
+      logical verbose
+      common /flags/ verbose
+
+      errs = 0
+      verbose = .false.
+!      verbose = .true.
+      call MTest_Init( ierr )
+
+      do while ( mtestGetIntraComm( comm, 2, .false. ) )
+         call test_pair_send( comm, errs )
+         call test_pair_ssend( comm, errs )
+         call test_pair_rsend( comm, errs )
+         call test_pair_isend( comm, errs )
+         call test_pair_irsend( comm, errs )
+         call test_pair_issend( comm, errs )
+         call test_pair_psend( comm, errs )
+         call test_pair_prsend( comm, errs )
+         call test_pair_pssend( comm, errs )
+         call test_pair_sendrecv( comm, errs )
+         call test_pair_sendrecvrepl( comm, errs )
+         call mtestFreeComm( comm )
+      enddo
+!
+      call MTest_Finalize( errs )
+      call MPI_Finalize(ierr)
+!
+      end
+!
+      subroutine test_pair_send( comm, errs )
+      use mpi_f08
+      integer errs
+      TYPE(MPI_Comm) comm
+      integer rank, size, ierr, next, prev, tag, count
+      integer TEST_SIZE
+      parameter (TEST_SIZE=2000)
+      TYPE(MPI_Status) status
+      real send_buf(TEST_SIZE), recv_buf(TEST_SIZE)
+      logical verbose
+      common /flags/ verbose
+!
+      if (verbose) then
+         print *, ' Send and recv'
+      endif
+!
+      call mpi_comm_rank( comm, rank, ierr )
+      call mpi_comm_size( comm, size, ierr )
+      next = rank + 1
+      if (next .ge. size) next = 0
+!
+      prev = rank - 1
+      if (prev .lt. 0) prev = size - 1
+!
+      tag = 1123
+      count = TEST_SIZE / 5
+!
+      call clear_test_data(recv_buf,TEST_SIZE)
+!
+      if (rank .eq. 0) then
+!
+         call init_test_data(send_buf,TEST_SIZE)
+!
+         call MPI_Send(send_buf, count, MPI_REAL, next, tag, &
+      &        comm, ierr)
+!
+         call MPI_Recv(recv_buf, TEST_SIZE, MPI_REAL, &
+      &                 MPI_ANY_SOURCE, MPI_ANY_TAG, comm, status, ierr)
+!
+         call msg_check( recv_buf, next, tag, count, status, TEST_SIZE, &
+      &                   'send and recv', errs )
+      else if (prev .eq. 0)  then
+         call MPI_Recv(recv_buf, TEST_SIZE, MPI_REAL, &
+      &                 MPI_ANY_SOURCE, MPI_ANY_TAG, comm, status, ierr)
+
+         call msg_check( recv_buf, prev, tag, count, status, TEST_SIZE, &
+      &                   'send and recv', errs )
+!
+         call MPI_Send(recv_buf, count, MPI_REAL, prev, tag, comm, ierr)
+      end if
+!
+      end
+!
+      subroutine test_pair_rsend( comm, errs )
+      use mpi_f08
+      integer errs
+      TYPE(MPI_Comm) comm
+      integer rank, size, ierr, next, prev, tag, count, i
+      integer TEST_SIZE
+      parameter (TEST_SIZE=2000)
+      TYPE(MPI_Status) status
+      TYPE(MPI_Request) requests(1)
+      real send_buf(TEST_SIZE), recv_buf(TEST_SIZE)
+      logical verbose
+      common /flags/ verbose
+!
+      if (verbose) then
+         print *, ' Rsend and recv'
+      endif
+!
+!
+      call mpi_comm_rank( comm, rank, ierr )
+      call mpi_comm_size( comm, size, ierr )
+      next = rank + 1
+      if (next .ge. size) next = 0
+!
+      prev = rank - 1
+      if (prev .lt. 0) prev = size - 1
+!
+      tag = 1456
+      count = TEST_SIZE / 3
+!
+      call clear_test_data(recv_buf,TEST_SIZE)
+!
+      if (rank .eq. 0) then
+!
+         call init_test_data(send_buf,TEST_SIZE)
+!
+         call MPI_Recv( MPI_BOTTOM, 0, MPI_INTEGER, next, tag,  &
+      &                  comm, status, ierr )
+!
+         call MPI_Rsend(send_buf, count, MPI_REAL, next, tag, &
+      &                  comm, ierr)
+!
+         call MPI_Probe(MPI_ANY_SOURCE, tag, comm, status, ierr)
+!
+         if (status%MPI_SOURCE .ne. next) then
+            print *, 'Rsend: Incorrect source, expected', next, &
+      &               ', got', status%MPI_SOURCE
+            errs = errs + 1
+         end if
+!
+         if (status%MPI_TAG .ne. tag) then
+            print *, 'Rsend: Incorrect tag, expected', tag, &
+      &               ', got', status%MPI_TAG
+            errs = errs + 1
+         end if
+!
+         call MPI_Get_count(status, MPI_REAL, i, ierr)
+!
+         if (i .ne. count) then
+            print *, 'Rsend: Incorrect count, expected', count, &
+      &               ', got', i
+            errs = errs + 1
+         end if
+!
+         call MPI_Recv(recv_buf, TEST_SIZE, MPI_REAL, &
+      &                 MPI_ANY_SOURCE, MPI_ANY_TAG, comm,  &
+      &                 status, ierr)
+!
+         call msg_check( recv_buf, next, tag, count, status, TEST_SIZE, &
+      &                   'rsend and recv', errs )
+!
+      else if (prev .eq. 0) then
+!
+         call MPI_Irecv(recv_buf, TEST_SIZE, MPI_REAL, &
+      &                 MPI_ANY_SOURCE, MPI_ANY_TAG, comm, &
+      &                 requests(1), ierr)
+         call MPI_Send( MPI_BOTTOM, 0, MPI_INTEGER, prev, tag,  &
+      &                  comm, ierr )
+         call MPI_Wait( requests(1), status, ierr )
+         call msg_check( recv_buf, prev, tag, count, status, TEST_SIZE, &
+      &                   'rsend and recv', errs )
+!
+         call MPI_Send(recv_buf, count, MPI_REAL, prev, tag, &
+      &                  comm, ierr)
+      end if
+!
+      end
+!
+      subroutine test_pair_ssend( comm, errs )
+      use mpi_f08
+      integer errs
+      TYPE(MPI_Comm) comm
+      integer rank, size, ierr, next, prev, tag, count, i
+      integer TEST_SIZE
+      parameter (TEST_SIZE=2000)
+      TYPE(MPI_Status) status
+      logical flag
+      real send_buf(TEST_SIZE), recv_buf(TEST_SIZE)
+      logical verbose
+      common /flags/ verbose
+!
+      if (verbose) then
+         print *, ' Ssend and recv'
+      endif
+!
+!
+      call mpi_comm_rank( comm, rank, ierr )
+      call mpi_comm_size( comm, size, ierr )
+      next = rank + 1
+      if (next .ge. size) next = 0
+!
+      prev = rank - 1
+      if (prev .lt. 0) prev = size - 1
+!
+      tag = 1789
+      count = TEST_SIZE / 3
+!
+      call clear_test_data(recv_buf,TEST_SIZE)
+!
+      if (rank .eq. 0) then
+!
+         call init_test_data(send_buf,TEST_SIZE)
+!
+         call MPI_Iprobe(MPI_ANY_SOURCE, tag, &
+      &                   comm, flag, status, ierr)
+!
+         if (flag) then
+            print *, 'Ssend: Iprobe succeeded! source',  &
+      &               status%MPI_SOURCE, &
+      &               ', tag', status%MPI_TAG
+            errs = errs + 1
+         end if
+!
+         call MPI_Ssend(send_buf, count, MPI_REAL, next, tag, &
+      &                  comm, ierr)
+!
+         do while (.not. flag)
+            call MPI_Iprobe(MPI_ANY_SOURCE, tag, &
+      &                      comm, flag, status, ierr)
+         end do
+!
+         if (status%MPI_SOURCE .ne. next) then
+            print *, 'Ssend: Incorrect source, expected', next, &
+      &               ', got', status%MPI_SOURCE
+            errs = errs + 1
+         end if
+!
+         if (status%MPI_TAG .ne. tag) then
+            print *, 'Ssend: Incorrect tag, expected', tag, &
+      &               ', got', status%MPI_TAG
+            errs = errs + 1
+         end if
+!
+         call MPI_Get_count(status, MPI_REAL, i, ierr)
+!
+         if (i .ne. count) then
+            print *, 'Ssend: Incorrect count, expected', count, &
+      &               ', got', i
+            errs = errs + 1
+         end if
+!
+         call MPI_Recv(recv_buf, TEST_SIZE, MPI_REAL, &
+      &                 MPI_ANY_SOURCE, MPI_ANY_TAG, comm, &
+      &                 status, ierr)
+!
+         call msg_check( recv_buf, next, tag, count, status, &
+      &        TEST_SIZE, 'ssend and recv', errs )
+!
+      else if (prev .eq. 0) then
+!
+         call MPI_Recv(recv_buf, TEST_SIZE, MPI_REAL, &
+      &                 MPI_ANY_SOURCE, MPI_ANY_TAG, comm, &
+      &                 status, ierr)
+!
+         call msg_check( recv_buf, prev, tag, count, status, TEST_SIZE, &
+      &                   'ssend and recv', errs )
+!
+         call MPI_Ssend(recv_buf, count, MPI_REAL, prev, tag, &
+      &                  comm, ierr)
+      end if
+!
+      end
+!
+      subroutine test_pair_isend( comm, errs )
+      use mpi_f08
+      integer errs
+      TYPE(MPI_Comm) comm
+      integer rank, size, ierr, next, prev, tag, count
+      integer TEST_SIZE
+      parameter (TEST_SIZE=2000)
+      TYPE(MPI_Status) status
+      TYPE(MPI_Request) requests(2)
+      TYPE(MPI_STATUS) statuses(2)
+      real send_buf(TEST_SIZE), recv_buf(TEST_SIZE)
+      logical verbose
+      common /flags/ verbose
+!
+      if (verbose) then
+         print *, ' isend and irecv'
+      endif
+!
+!
+      call mpi_comm_rank( comm, rank, ierr )
+      call mpi_comm_size( comm, size, ierr )
+      next = rank + 1
+      if (next .ge. size) next = 0
+!
+      prev = rank - 1
+      if (prev .lt. 0) prev = size - 1
+!
+      tag = 2123
+      count = TEST_SIZE / 5
+!
+      call clear_test_data(recv_buf,TEST_SIZE)
+!
+      if (rank .eq. 0) then
+!
+         call MPI_Irecv(recv_buf, TEST_SIZE, MPI_REAL, &
+      &                  MPI_ANY_SOURCE, MPI_ANY_TAG, comm, &
+      &                  requests(1), ierr)
+!
+         call init_test_data(send_buf,TEST_SIZE)
+!
+         call MPI_Isend(send_buf, count, MPI_REAL, next, tag, &
+      &                  comm, requests(2), ierr)
+!
+         call MPI_Waitall(2, requests, statuses, ierr)
+!
+         call rq_check( requests, 2, 'isend and irecv' )
+!
+         call msg_check( recv_buf, next, tag, count, statuses(1), &
+      &        TEST_SIZE, 'isend and irecv', errs )
+!
+      else if (prev .eq. 0) then
+!
+         call MPI_Recv(recv_buf, TEST_SIZE, MPI_REAL, &
+      &                 MPI_ANY_SOURCE, MPI_ANY_TAG, comm, &
+      &                 status, ierr)
+!
+         call msg_check( recv_buf, prev, tag, count, status, TEST_SIZE, &
+      &                   'isend and irecv', errs )
+!
+         call MPI_Isend(recv_buf, count, MPI_REAL, prev, tag, &
+      &                  comm, requests(1), ierr)
+!
+         call MPI_Wait(requests(1), status, ierr)
+!
+         call rq_check( requests, 1, 'isend and irecv' )
+!
+      end if
+!
+      end
+!
+      subroutine test_pair_irsend( comm, errs )
+      use mpi_f08
+      integer errs
+      TYPE(MPI_Comm) comm
+      integer rank, size, ierr, next, prev, tag, count, index, i
+      integer TEST_SIZE
+      TYPE(MPI_Comm) dupcom
+      parameter (TEST_SIZE=2000)
+      TYPE(MPI_Status) status
+      TYPE(MPI_Request) requests(2)
+      TYPE(MPI_Status) statuses(2)
+      logical flag
+      real send_buf(TEST_SIZE), recv_buf(TEST_SIZE)
+      logical verbose
+      common /flags/ verbose
+!
+      if (verbose) then
+         print *, ' Irsend and irecv'
+      endif
+!
+      call mpi_comm_rank( comm, rank, ierr )
+      call mpi_comm_size( comm, size, ierr )
+      next = rank + 1
+      if (next .ge. size) next = 0
+!
+      prev = rank - 1
+      if (prev .lt. 0) prev = size - 1
+!
+      call mpi_comm_dup( comm, dupcom, ierr )
+!
+      tag = 2456
+      count = TEST_SIZE / 3
+!
+      call clear_test_data(recv_buf,TEST_SIZE)
+!
+      if (rank .eq. 0) then
+!
+         call MPI_Irecv(recv_buf, TEST_SIZE, MPI_REAL, &
+      &                  MPI_ANY_SOURCE, MPI_ANY_TAG, comm, &
+      &                  requests(1), ierr)
+!
+         call init_test_data(send_buf,TEST_SIZE)
+!
+         call MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INTEGER, next, 0,  &
+      &                      MPI_BOTTOM, 0, MPI_INTEGER, next, 0,  &
+      &                      dupcom, status, ierr )
+!
+         call MPI_Irsend(send_buf, count, MPI_REAL, next, tag, &
+      &                   comm, requests(2), ierr)
+!
+         index = -1
+         do while (index .ne. 1)
+            call MPI_Waitany(2, requests, index, status, ierr)
+         end do
+!
+         call rq_check( requests, 1, 'irsend and irecv' )
+!
+         call msg_check( recv_buf, next, tag, count, status, &
+      &           TEST_SIZE, 'irsend and irecv', errs )
+!
+      else if (prev .eq. 0) then
+!
+         call MPI_Irecv(recv_buf, TEST_SIZE, MPI_REAL, &
+      &                  MPI_ANY_SOURCE, MPI_ANY_TAG, comm, &
+      &                  requests(1), ierr)
+!
+         call MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INTEGER, prev, 0,  &
+      &                      MPI_BOTTOM, 0, MPI_INTEGER, prev, 0,  &
+      &                      dupcom, status, ierr )
+!
+         flag = .FALSE.
+         do while (.not. flag)
+            call MPI_Test(requests(1), flag, status, ierr)
+         end do
+!
+         call rq_check( requests, 1, 'irsend and irecv (test)' )
+!
+         call msg_check( recv_buf, prev, tag, count, status, TEST_SIZE, &
+      &                   'irsend and irecv', errs )
+!
+         call MPI_Irsend(recv_buf, count, MPI_REAL, prev, tag, &
+      &                   comm, requests(1), ierr)
+!
+         call MPI_Waitall(1, requests, statuses, ierr)
+!
+         call rq_check( requests, 1, 'irsend and irecv' )
+!
+      end if
+!
+      call mpi_comm_free( dupcom, ierr )
+!
+      end
+!
+      subroutine test_pair_issend( comm, errs )
+      use mpi_f08
+      integer errs
+      TYPE(MPI_Comm) comm
+      integer rank, size, ierr, next, prev, tag, count, index
+      integer TEST_SIZE
+      parameter (TEST_SIZE=2000)
+      TYPE(MPI_Status) status
+      TYPE(MPI_Request) requests(2)
+      TYPE(MPI_Status) statuses(2)
+      logical flag
+      real send_buf(TEST_SIZE), recv_buf(TEST_SIZE)
+      logical verbose
+      common /flags/ verbose
+!
+      if (verbose) then
+         print *, ' issend and irecv (testall)'
+      endif
+!
+!
+      call mpi_comm_rank( comm, rank, ierr )
+      call mpi_comm_size( comm, size, ierr )
+      next = rank + 1
+      if (next .ge. size) next = 0
+!
+      prev = rank - 1
+      if (prev .lt. 0) prev = size - 1
+!
+      tag = 2789
+      count = TEST_SIZE / 3
+!
+      call clear_test_data(recv_buf,TEST_SIZE)
+!
+      if (rank .eq. 0) then
+!
+         call MPI_Irecv(recv_buf, TEST_SIZE, MPI_REAL, &
+      &                  MPI_ANY_SOURCE, MPI_ANY_TAG, comm, &
+      &                  requests(1), ierr)
+!
+         call init_test_data(send_buf,TEST_SIZE)
+!
+         call MPI_Issend(send_buf, count, MPI_REAL, next, tag, &
+      &                   comm, requests(2), ierr)
+!
+         flag = .FALSE.
+         do while (.not. flag)
+            call MPI_Testall(2, requests, flag, statuses, ierr)
+         end do
+!
+         call rq_check( requests, 2, 'issend and irecv (testall)' )
+!
+         call msg_check( recv_buf, next, tag, count, statuses(1), &
+      &           TEST_SIZE, 'issend and recv (testall)', errs )
+!
+      else if (prev .eq. 0) then
+!
+         call MPI_Recv(recv_buf, TEST_SIZE, MPI_REAL, &
+      &                 MPI_ANY_SOURCE, MPI_ANY_TAG, comm, &
+      &                 status, ierr)
+
+         call msg_check( recv_buf, prev, tag, count, status, TEST_SIZE, &
+      &                   'issend and recv', errs )
+
+         call MPI_Issend(recv_buf, count, MPI_REAL, prev, tag, &
+      &                   comm, requests(1), ierr)
+!
+         flag = .FALSE.
+         do while (.not. flag)
+            call MPI_Testany(1, requests, index, flag, &
+      &                       statuses(1), ierr)
+         end do
+!
+         call rq_check( requests, 1, 'issend and recv (testany)' )
+!
+      end if
+!
+      end
+!
+      subroutine test_pair_psend( comm, errs )
+      use mpi_f08
+      integer errs
+      TYPE(MPI_Comm) comm
+      integer rank, size, ierr, next, prev, tag, count, i
+      integer TEST_SIZE
+      parameter (TEST_SIZE=2000)
+      TYPE(MPI_Status) status
+      TYPE(MPI_Status) statuses(2)
+      TYPE(MPI_Request) requests(2)
+      real send_buf(TEST_SIZE), recv_buf(TEST_SIZE)
+      logical verbose
+      common /flags/ verbose
+!
+      if (verbose) then
+         print *, ' Persistent send and recv'
+      endif
+!
+      call mpi_comm_rank( comm, rank, ierr )
+      call mpi_comm_size( comm, size, ierr )
+      next = rank + 1
+      if (next .ge. size) next = 0
+!
+      prev = rank - 1
+      if (prev .lt. 0) prev = size - 1
+!
+      tag = 3123
+      count = TEST_SIZE / 5
+!
+      call clear_test_data(recv_buf,TEST_SIZE)
+      call MPI_Recv_init(recv_buf, TEST_SIZE, MPI_REAL, &
+      &                   MPI_ANY_SOURCE, MPI_ANY_TAG, comm, &
+      &                   requests(2), ierr)
+!
+      if (rank .eq. 0) then
+!
+         call init_test_data(send_buf,TEST_SIZE)
+!
+         call MPI_Send_init(send_buf, count, MPI_REAL, next, tag, &
+      &                      comm, requests(1), ierr)
+!
+         call MPI_Startall(2, requests, ierr)
+         call MPI_Waitall(2, requests, statuses, ierr)
+!
+         call msg_check( recv_buf, next, tag, count, statuses(2), &
+      &        TEST_SIZE, 'persistent send/recv', errs )
+!
+         call MPI_Request_free(requests(1), ierr)
+!
+      else if (prev .eq. 0) then
+!
+         call MPI_Send_init(send_buf, count, MPI_REAL, prev, tag, &
+      &                      comm, requests(1), ierr)
+         call MPI_Start(requests(2), ierr)
+         call MPI_Wait(requests(2), status, ierr)
+!
+         call msg_check( recv_buf, prev, tag, count, status, TEST_SIZE, &
+      &                   'persistent send/recv', errs )
+!
+         do i = 1,count
+            send_buf(i) = recv_buf(i)
+         end do
+!
+         call MPI_Start(requests(1), ierr)
+         call MPI_Wait(requests(1), status, ierr)
+!
+         call MPI_Request_free(requests(1), ierr)
+      end if
+!
+      call dummyRef( send_buf, count, ierr )
+      call MPI_Request_free(requests(2), ierr)
+!
+      end
+!
+      subroutine test_pair_prsend( comm, errs )
+      use mpi_f08
+      integer errs
+      TYPE(MPI_Comm) comm
+      integer rank, size, ierr, next, prev, tag, count, index, i
+      integer outcount, indices(2)
+      integer TEST_SIZE
+      parameter (TEST_SIZE=2000)
+      TYPE(MPI_Status) statuses(2)
+      TYPE(MPI_Request) requests(2)
+      TYPE(MPI_Status) status
+      logical flag
+      real send_buf(TEST_SIZE), recv_buf(TEST_SIZE)
+      logical verbose
+      common /flags/ verbose
+!
+      if (verbose) then
+         print *, ' Persistent Rsend and recv'
+      endif
+!
+      call mpi_comm_rank( comm, rank, ierr )
+      call mpi_comm_size( comm, size, ierr )
+      next = rank + 1
+      if (next .ge. size) next = 0
+!
+      prev = rank - 1
+      if (prev .lt. 0) prev = size - 1
+!
+      tag = 3456
+      count = TEST_SIZE / 3
+!
+      call clear_test_data(recv_buf,TEST_SIZE)
+!
+      call MPI_Recv_init(recv_buf, TEST_SIZE, MPI_REAL, &
+      &                   MPI_ANY_SOURCE, MPI_ANY_TAG, comm, &
+      &                   requests(2), ierr)
+!
+      if (rank .eq. 0) then
+!
+         call MPI_Rsend_init(send_buf, count, MPI_REAL, next, tag, &
+      &                       comm, requests(1), ierr)
+!
+         call init_test_data(send_buf,TEST_SIZE)
+!
+         call MPI_Recv( MPI_BOTTOM, 0, MPI_INTEGER, next, tag,  &
+      &                  comm, status, ierr )
+!
+         call MPI_Startall(2, requests, ierr)
+!
+         index = -1
+!
+         do while (index .ne. 2)
+            call MPI_Waitsome(2, requests, outcount, &
+      &                        indices, statuses, ierr)
+            do i = 1,outcount
+               if (indices(i) .eq. 2) then
+                  call msg_check( recv_buf, next, tag, count, &
+      &                 statuses(i), TEST_SIZE, 'waitsome', errs )
+                  index = 2
+               end if
+            end do
+         end do
+!
+         call MPI_Request_free(requests(1), ierr)
+      else if (prev .eq. 0) then
+!
+         call MPI_Rsend_init(send_buf, count, MPI_REAL, prev, tag, &
+      &                       comm, requests(1), ierr)
+!
+         call MPI_Start(requests(2), ierr)
+!
+         call MPI_Send( MPI_BOTTOM, 0, MPI_INTEGER, prev, tag,  &
+      &                  comm, ierr )
+!
+         flag = .FALSE.
+         do while (.not. flag)
+            call MPI_Test(requests(2), flag, status, ierr)
+         end do
+         call msg_check( recv_buf, prev, tag, count, status, TEST_SIZE, &
+      &                   'test', errs )
+!
+         do i = 1,count
+            send_buf(i) = recv_buf(i)
+         end do
+!
+         call MPI_Start(requests(1), ierr)
+         call MPI_Wait(requests(1), status, ierr)
+!
+         call MPI_Request_free(requests(1), ierr)
+      end if
+!
+      call dummyRef( send_buf, count, ierr )
+      call MPI_Request_free(requests(2), ierr)
+!
+      end
+!
+      subroutine test_pair_pssend( comm, errs )
+      use mpi_f08
+      integer errs
+      TYPE(MPI_Comm) comm
+      integer rank, size, ierr, next, prev, tag, count, index, i
+      integer outcount, indices(2)
+      integer TEST_SIZE
+      parameter (TEST_SIZE=2000)
+      TYPE(MPI_Status) statuses(2)
+      TYPE(MPI_Request) requests(2)
+      TYPE(MPI_Status) status
+      logical flag
+      real send_buf(TEST_SIZE), recv_buf(TEST_SIZE)
+      logical verbose
+      common /flags/ verbose
+!
+      if (verbose) then
+         print *, ' Persistent Ssend and recv'
+      endif
+!
+      call mpi_comm_rank( comm, rank, ierr )
+      call mpi_comm_size( comm, size, ierr )
+      next = rank + 1
+      if (next .ge. size) next = 0
+!
+      prev = rank - 1
+      if (prev .lt. 0) prev = size - 1
+!
+      tag = 3789
+      count = TEST_SIZE / 3
+!
+      call clear_test_data(recv_buf,TEST_SIZE)
+!
+      call MPI_Recv_init(recv_buf, TEST_SIZE, MPI_REAL, &
+      &                   MPI_ANY_SOURCE, MPI_ANY_TAG, comm, &
+      &                   requests(1), ierr)
+!
+      if (rank .eq. 0) then
+!
+         call MPI_Ssend_init(send_buf, count, MPI_REAL, next, tag, &
+      &                       comm, requests(2), ierr)
+!
+         call init_test_data(send_buf,TEST_SIZE)
+!
+         call MPI_Startall(2, requests, ierr)
+!
+         index = -1
+         do while (index .ne. 1)
+            call MPI_Testsome(2, requests, outcount, &
+      &                        indices, statuses, ierr)
+            do i = 1,outcount
+               if (indices(i) .eq. 1) then
+                  call msg_check( recv_buf, next, tag, count, &
+      &                 statuses(i), TEST_SIZE, 'testsome', errs )
+                  index = 1
+               end if
+            end do
+         end do
+!
+         call MPI_Request_free(requests(2), ierr)
+!
+      else if (prev .eq. 0) then
+!
+         call MPI_Ssend_init(send_buf, count, MPI_REAL, prev, tag, &
+      &                       comm, requests(2), ierr)
+!
+         call MPI_Start(requests(1), ierr)
+!
+         flag = .FALSE.
+         do while (.not. flag)
+            call MPI_Testany(1, requests, index, flag, &
+      &                       statuses(1), ierr)
+         end do
+         call msg_check( recv_buf, prev, tag, count, statuses(1), &
+      &           TEST_SIZE, 'testany', errs )
+
+         do i = 1,count
+            send_buf(i) = recv_buf(i)
+         end do
+!
+         call MPI_Start(requests(2), ierr)
+         call MPI_Wait(requests(2), status, ierr)
+!
+         call MPI_Request_free(requests(2), ierr)
+!
+      end if
+!
+      call dummyRef( send_buf, count, ierr )
+      call MPI_Request_free(requests(1), ierr)
+!
+      end
+!
+      subroutine test_pair_sendrecv( comm, errs )
+      use mpi_f08
+      integer errs
+      TYPE(MPI_Comm) comm
+      integer rank, size, ierr, next, prev, tag, count
+      integer TEST_SIZE
+      parameter (TEST_SIZE=2000)
+      TYPE(MPI_Status) status
+      real send_buf(TEST_SIZE), recv_buf(TEST_SIZE)
+      logical verbose
+      common /flags/ verbose
+!
+      if (verbose) then
+         print *, ' Sendrecv'
+      endif
+!
+!
+      call mpi_comm_rank( comm, rank, ierr )
+      call mpi_comm_size( comm, size, ierr )
+      next = rank + 1
+      if (next .ge. size) next = 0
+!
+      prev = rank - 1
+      if (prev .lt. 0) prev = size - 1
+!
+      tag = 4123
+      count = TEST_SIZE / 5
+
+      call clear_test_data(recv_buf,TEST_SIZE)
+
+      if (rank .eq. 0) then
+
+         call init_test_data(send_buf,TEST_SIZE)
+
+         call MPI_Sendrecv(send_buf, count, MPI_REAL, next, tag, &
+      &                     recv_buf, count, MPI_REAL, next, tag, &
+      &                     comm, status, ierr)
+
+         call msg_check( recv_buf, next, tag, count, status, TEST_SIZE, &
+      &                   'sendrecv', errs )
+
+      else if (prev .eq. 0) then
+
+         call MPI_Recv(recv_buf, TEST_SIZE, MPI_REAL, &
+      &                 MPI_ANY_SOURCE, MPI_ANY_TAG, comm, &
+      &                 status, ierr)
+
+         call msg_check( recv_buf, prev, tag, count, status, TEST_SIZE, &
+      &                   'recv/send', errs )
+
+         call MPI_Send(recv_buf, count, MPI_REAL, prev, tag, &
+      &                 comm, ierr)
+      end if
+!
+      end
+!
+      subroutine test_pair_sendrecvrepl( comm, errs )
+      use mpi_f08
+      integer errs
+      TYPE(MPI_Comm) comm
+      integer rank, size, ierr, next, prev, tag, count, i
+      integer TEST_SIZE
+      parameter (TEST_SIZE=2000)
+      TYPE(MPI_Status) status
+      real send_buf(TEST_SIZE), recv_buf(TEST_SIZE)
+      logical verbose
+      common /flags/ verbose
+!
+      if (verbose) then
+         print *, ' Sendrecv replace'
+      endif
+!
+      call mpi_comm_rank( comm, rank, ierr )
+      call mpi_comm_size( comm, size, ierr )
+      next = rank + 1
+      if (next .ge. size) next = 0
+!
+      prev = rank - 1
+      if (prev .lt. 0) prev = size - 1
+!
+      tag = 4456
+      count = TEST_SIZE / 3
+
+      if (rank .eq. 0) then
+!
+         call init_test_data(recv_buf, TEST_SIZE)
+!
+         do 11 i = count+1,TEST_SIZE
+            recv_buf(i) = 0.0
+ 11      continue
+!
+         call MPI_Sendrecv_replace(recv_buf, count, MPI_REAL, &
+      &                             next, tag, next, tag, &
+      &                             comm, status, ierr)
+
+         call msg_check( recv_buf, next, tag, count, status, TEST_SIZE, &
+      &                   'sendrecvreplace', errs )
+
+      else if (prev .eq. 0) then
+
+         call clear_test_data(recv_buf,TEST_SIZE)
+
+         call MPI_Recv(recv_buf, TEST_SIZE, MPI_REAL, &
+      &                 MPI_ANY_SOURCE, MPI_ANY_TAG, comm, &
+      &                 status, ierr)
+
+         call msg_check( recv_buf, prev, tag, count, status, TEST_SIZE, &
+      &                   'recv/send for replace', errs )
+
+         call MPI_Send(recv_buf, count, MPI_REAL, prev, tag, &
+      &                 comm, ierr)
+      end if
+!
+      end
+!
+!------------------------------------------------------------------------------
+!
+!  Check for correct source, tag, count, and data in test message.
+!
+!------------------------------------------------------------------------------
+      subroutine msg_check( recv_buf, source, tag, count, status, n,  &
+      &                      name, errs )
+      use mpi_f08
+      integer n, errs
+      real    recv_buf(n)
+      integer source, tag, count, rank
+      TYPE(MPI_Status) status
+      character*(*) name
+      logical foundError
+
+      integer ierr, recv_src, recv_tag, recv_count
+
+      foundError = .false.
+      recv_src = status%MPI_SOURCE
+      recv_tag = status%MPI_TAG
+      call MPI_Comm_rank( MPI_COMM_WORLD, rank, ierr )
+      call MPI_Get_count(status, MPI_REAL, recv_count, ierr)
+
+      if (recv_src .ne. source) then
+         print *, '[', rank, '] Unexpected source:', recv_src,  &
+      &            ' in ', name
+         errs       = errs + 1
+         foundError = .true.
+      end if
+
+      if (recv_tag .ne. tag) then
+         print *, '[', rank, '] Unexpected tag:', recv_tag, ' in ', name
+         errs       = errs + 1
+         foundError = .true.
+      end if
+
+      if (recv_count .ne. count) then
+         print *, '[', rank, '] Unexpected count:', recv_count, &
+      &            ' in ', name
+         errs       = errs + 1
+         foundError = .true.
+      end if
+
+      call verify_test_data(recv_buf, count, n, name, errs )
+
+      end
+!------------------------------------------------------------------------------
+!
+!  Check that requests have been set to null
+!
+!------------------------------------------------------------------------------
+      subroutine rq_check( requests, n, msg )
+      use mpi_f08
+      integer n
+      TYPE(MPI_Request) requests(n)
+      character*(*) msg
+      integer i
+!
+ !      do 10 i=1, n
+ !         if (requests(i) .ne. MPI_REQUEST_NULL) then
+ !            print *, 'Nonnull request in ', msg
+ !         endif
+ ! 10   continue
+!
+      end
+!------------------------------------------------------------------------------
+!
+!  Initialize test data buffer with integral sequence.
+!
+!------------------------------------------------------------------------------
+      subroutine init_test_data(buf,n)
+      integer n
+      real buf(n)
+      integer i
+
+      do 10 i = 1, n
+         buf(i) = REAL(i)
+ 10    continue
+      end
+
+!------------------------------------------------------------------------------
+!
+!  Clear test data buffer
+!
+!------------------------------------------------------------------------------
+      subroutine clear_test_data(buf, n)
+      integer n
+      real buf(n)
+      integer i
+
+      do 10 i = 1, n
+         buf(i) = 0.
+ 10   continue
+
+      end
+
+!------------------------------------------------------------------------------
+!
+!  Verify test data buffer
+!
+!------------------------------------------------------------------------------
+      subroutine verify_test_data( buf, count, n, name, errs )
+      use mpi_f08
+      integer n, errs
+      real buf(n)
+      character *(*) name
+      integer count, ierr, i
+!
+      do 10 i = 1, count
+         if (buf(i) .ne. REAL(i)) then
+            print 100, buf(i), i, count, name
+            errs = errs + 1
+         endif
+ 10   continue
+!
+      do 20 i = count + 1, n
+         if (buf(i) .ne. 0.) then
+            print 100, buf(i), i, n, name
+            errs = errs + 1
+         endif
+ 20   continue
+!
+100   format('Invalid data', f6.1, ' at ', i4, ' of ', i4, ' in ', a)
+!
+      end
+!
+!    This routine is used to prevent the compiler from deallocating the
+!    array "a", which may happen in some of the tests (see the text in
+!    the MPI standard about why this may be a problem in valid Fortran
+!    codes).  Without this, for example, tests fail with the Cray ftn
+!    compiler.
+!
+      subroutine dummyRef( a, n, ie )
+      integer n, ie
+      real    a(n)
+! This condition will never be true, but the compile won't know that
+      if (ie .eq. -1) then
+          print *, a(n)
+      endif
+      return
+      end
diff --git a/test/mpi/f08/pt2pt/dummyf08.f90 b/test/mpi/f08/pt2pt/dummyf08.f90
new file mode 100644
index 0000000..0495742
--- /dev/null
+++ b/test/mpi/f08/pt2pt/dummyf08.f90
@@ -0,0 +1,20 @@
+! This file created from test/mpi/f77/pt2pt/dummyf.f with f77tof90
+! -*- Mode: Fortran; -*-
+!
+!  (C) 2011 by Argonne National Laboratory.
+!      See COPYRIGHT in top-level directory.
+!
+!
+! This file is used to disable certain compiler optimizations that
+! can cause incorrect results with the test in greqf.f.  It provides a
+! point where extrastate may be modified, limiting the compilers ability
+! to move code around.
+! The include of mpif.h is not needed in the F77 case but in the
+! F90 case it is, because in that case, extrastate is defined as an
+! integer (kind=MPI_ADDRESS_KIND), and the script that creates the
+! F90 tests from the F77 tests looks for mpif.h
+      subroutine dummyupdate( extrastate )
+      use mpi_f08
+      integer (kind=MPI_ADDRESS_KIND) extrastate, valin, valout, val
+
+      end
diff --git a/test/mpi/f08/pt2pt/greqf08.f90 b/test/mpi/f08/pt2pt/greqf08.f90
new file mode 100644
index 0000000..8354b0a
--- /dev/null
+++ b/test/mpi/f08/pt2pt/greqf08.f90
@@ -0,0 +1,115 @@
+! This file created from test/mpi/f77/pt2pt/greqf.f with f77tof90
+! -*- Mode: Fortran; -*-
+!
+!  (C) 2003 by Argonne National Laboratory.
+!      See COPYRIGHT in top-level directory.
+!
+      subroutine query_fn( extrastate, status, ierr )
+      use mpi_f08
+      TYPE(MPI_Status) status
+      integer ierr
+      integer (kind=MPI_ADDRESS_KIND) extrastate, valin, valout, val
+      logical flag
+
+!
+!    set a default status
+      status%MPI_SOURCE = MPI_UNDEFINED
+      status%MPI_TAG    = MPI_UNDEFINED
+      flag = .false.
+      call mpi_status_set_cancelled( status, flag, ierr)
+      call mpi_status_set_elements( status, MPI_BYTE, 0, ierr )
+      ierr = MPI_SUCCESS
+      end
+!
+      subroutine free_fn( extrastate, ierr )
+      use mpi_f08
+      integer value, ierr
+      integer (kind=MPI_ADDRESS_KIND) extrastate, valin, valout, val
+
+      integer freefncall
+      common /fnccalls/ freefncall
+!
+!   For testing purposes, the following print can be used to check whether
+!   the free_fn is called
+!      print *, 'Free_fn called'
+!
+      extrastate = extrastate - 1
+!   The value returned by the free function is the error code
+!   returned by the wait/test function
+      ierr = MPI_SUCCESS
+      end
+!
+      subroutine cancel_fn( extrastate, complete, ierr )
+      use mpi_f08
+      integer ierr
+      logical complete
+      integer (kind=MPI_ADDRESS_KIND) extrastate, valin, valout, val
+
+
+      ierr = MPI_SUCCESS
+      end
+!
+!
+! This is a very simple test of generalized requests.  Normally, the
+! MPI_Grequest_complete function would be called from another routine,
+! often running in a separate thread.  This simple code allows us to
+! check that requests can be created, tested, and waited on in the
+! case where the request is complete before the wait is called.
+!
+! Note that MPI did *not* define a routine that can be called within
+! test or wait to advance the state of a generalized request.
+! Most uses of generalized requests will need to use a separate thread.
+!
+       program main
+       use mpi_f08
+       integer errs, ierr
+       logical flag
+       TYPE(MPI_Status) status
+       TYPE(MPI_Request) request
+       external query_fn, free_fn, cancel_fn
+       integer (kind=MPI_ADDRESS_KIND) extrastate, valin, valout, val
+
+       integer freefncall
+       common /fnccalls/ freefncall
+
+       errs = 0
+       freefncall = 0
+
+       call MTest_Init( ierr )
+
+       extrastate = 0
+       call mpi_grequest_start( query_fn, free_fn, cancel_fn,  &
+      &            extrastate, request, ierr )
+       call mpi_test( request, flag, status, ierr )
+       if (flag) then
+          errs = errs + 1
+          print *, 'Generalized request marked as complete'
+       endif
+
+       call mpi_grequest_complete( request, ierr )
+
+       call MPI_Wait( request, status, ierr )
+
+       extrastate = 1
+       call mpi_grequest_start( query_fn, free_fn, cancel_fn,  &
+      &                          extrastate, request, ierr )
+       call mpi_grequest_complete( request, ierr )
+       call mpi_wait( request, MPI_STATUS_IGNORE, ierr )
+!
+!      The following routine may prevent an optimizing compiler from
+!      just remembering that extrastate was set in grequest_start
+       call dummyupdate(extrastate)
+       if (extrastate .ne. 0) then
+          errs = errs + 1
+          if (freefncall .eq. 0) then
+              print *, 'Free routine not called'
+          else
+              print *, 'Free routine did not update extra_data'
+              print *, 'extrastate = ', extrastate
+          endif
+       endif
+!
+       call MTest_Finalize( errs )
+       call mpi_finalize( ierr )
+       end
+!
diff --git a/test/mpi/f08/pt2pt/mprobef08.f90 b/test/mpi/f08/pt2pt/mprobef08.f90
new file mode 100644
index 0000000..1a9301b
--- /dev/null
+++ b/test/mpi/f08/pt2pt/mprobef08.f90
@@ -0,0 +1,636 @@
+! This file created from test/mpi/f77/pt2pt/mprobef.f with f77tof90
+! -*- Mode: Fortran; -*-
+!
+!  (C) 2012 by Argonne National Laboratory.
+!      See COPYRIGHT in top-level directory.
+!
+      program main
+      use mpi_f08
+      integer ierr, rank, size, count
+      integer sendbuf(8), recvbuf(8)
+      TYPE(MPI_Status) s1, s2
+      integer errs
+      TYPE(MPI_Message) msg
+      TYPE(MPI_Request) rreq
+      logical found, flag
+
+      ierr = -1
+      errs = 0
+      call mpi_init( ierr )
+      if (ierr .ne. MPI_SUCCESS) then
+          errs = errs + 1
+          print *, ' Unexpected return from MPI_INIT', ierr
+      endif
+
+      call mpi_comm_rank( MPI_COMM_WORLD, rank, ierr )
+      call mpi_comm_size( MPI_COMM_WORLD, size, ierr )
+      if (size .lt. 2) then
+          errs = errs + 1
+          print *, ' This test requires at least 2 processes'
+!         Abort now - do not continue in this case.
+          call mpi_abort( MPI_COMM_WORLD, 1, ierr )
+      endif
+      if (size .gt. 2) then
+          print *, ' This test is running with ', size, ' processes,'
+          print *, ' only 2 processes are used.'
+      endif
+
+! Test 0: simple Send and Mprobe+Mrecv.
+      if (rank .eq. 0) then
+          sendbuf(1) = 1735928559
+          sendbuf(2) = 1277009102
+          call MPI_Send(sendbuf, 2, MPI_INTEGER, &
+      &                  1, 5, MPI_COMM_WORLD, ierr)
+      else
+!         the error fields are initialized for modification check.
+          s1%MPI_ERROR = MPI_ERR_DIMS
+          s2%MPI_ERROR = MPI_ERR_OTHER
+
+          msg = MPI_MESSAGE_NULL
+          call MPI_Mprobe(0, 5, MPI_COMM_WORLD, msg, s1, ierr)
+          if (s1%MPI_SOURCE .ne. 0) then
+              errs = errs + 1
+              print *, 's1%MPI_SOURCE != 0 at T0 Mprobe().'
+          endif
+          if (s1%MPI_TAG .ne. 5) then
+              errs = errs + 1
+              print *, 's1%MPI_TAG != 5 at T0 Mprobe().'
+          endif
+          if (s1%MPI_ERROR .ne. MPI_ERR_DIMS) then
+              errs = errs + 1
+              print *, 's1%MPI_ERROR != MPI_ERR_DIMS at T0 Mprobe().'
+          endif
+          if (msg .eq. MPI_MESSAGE_NULL) then
+              errs = errs + 1
+              print *, 'msg == MPI_MESSAGE_NULL at T0 Mprobe().'
+          endif
+
+          count = -1
+          call MPI_Get_count(s1, MPI_INTEGER, count, ierr)
+          if (count .ne. 2) then
+              errs = errs + 1
+              print *, 'probed buffer does not have 2 MPI_INTEGERs.'
+          endif
+
+          recvbuf(1) = 19088743
+          recvbuf(2) = 1309737967
+          call MPI_Mrecv(recvbuf, count, MPI_INTEGER, msg, s2, ierr)
+          if (recvbuf(1) .ne. 1735928559) then
+              errs = errs + 1
+              print *, 'recvbuf(1) is corrupted at T0 Mrecv().'
+          endif
+          if (recvbuf(2) .ne. 1277009102) then
+              errs = errs + 1
+              print *, 'recvbuf(2) is corrupted at T0 Mrecv().'
+          endif
+          if (s2%MPI_SOURCE .ne. 0) then
+              errs = errs + 1
+              print *, 's2%MPI_SOURCE != 0 at T0 Mrecv().'
+          endif
+          if (s2%MPI_TAG .ne. 5) then
+              errs = errs + 1
+              print *, 's2%MPI_TAG != 5 at T0 Mrecv().'
+          endif
+          if (s2%MPI_ERROR .ne. MPI_ERR_OTHER) then
+              errs = errs + 1
+              print *, 's2%MPI_ERROR != MPI_ERR_OTHER at T0 Mrecv().'
+          endif
+          if (msg .ne. MPI_MESSAGE_NULL) then
+              errs = errs + 1
+              print *, 'msg != MPI_MESSAGE_NULL at T0 Mrecv().'
+          endif
+      endif
+
+! Test 1: simple Send and Mprobe+Imrecv.
+      if (rank .eq. 0) then
+          sendbuf(1) = 1735928559
+          sendbuf(2) = 1277009102
+          call MPI_Send(sendbuf, 2, MPI_INTEGER, &
+      &                  1, 5, MPI_COMM_WORLD, ierr)
+      else
+!         the error fields are initialized for modification check.
+          s1%MPI_ERROR = MPI_ERR_DIMS
+          s2%MPI_ERROR = MPI_ERR_OTHER
+
+          msg = MPI_MESSAGE_NULL
+          call MPI_Mprobe(0, 5, MPI_COMM_WORLD, msg, s1, ierr)
+          if (s2%MPI_SOURCE .ne. 0) then
+              errs = errs + 1
+              print *, 's2%MPI_SOURCE != 0 at T1 Mprobe().'
+          endif
+          if (s1%MPI_TAG .ne. 5) then
+              errs = errs + 1
+              print *, 's1%MPI_TAG != 5 at T1 Mprobe().'
+          endif
+          if (s1%MPI_ERROR .ne. MPI_ERR_DIMS) then
+              errs = errs + 1
+              print *, 's1%MPI_ERROR != MPI_ERR_DIMS at T1 Mprobe().'
+          endif
+          if (msg .eq. MPI_MESSAGE_NULL) then
+              errs = errs + 1
+              print *, 'msg == MPI_MESSAGE_NULL at T1 Mprobe().'
+          endif
+
+          count = -1
+          call MPI_Get_count(s1, MPI_INTEGER, count, ierr)
+          if (count .ne. 2) then
+              errs = errs + 1
+              print *, 'probed buffer does not have 2 MPI_INTEGERs.'
+          endif
+
+          rreq = MPI_REQUEST_NULL
+          recvbuf(1) = 19088743
+          recvbuf(2) = 1309737967
+          call MPI_Imrecv(recvbuf, count, MPI_INTEGER, msg, rreq, ierr)
+          if (rreq .eq. MPI_REQUEST_NULL) then
+              errs = errs + 1
+              print *, 'rreq is unmodified at T1 Imrecv().'
+          endif
+          call MPI_Wait(rreq, s2, ierr)
+          if (recvbuf(1) .ne. 1735928559) then
+              errs = errs + 1
+              print *, 'recvbuf(1) is corrupted at T1 Imrecv().'
+          endif
+          if (recvbuf(2) .ne. 1277009102) then
+              errs = errs + 1
+              print *, 'recvbuf(2) is corrupted at T1 Imrecv().'
+          endif
+          if (s2%MPI_SOURCE .ne. 0) then
+              errs = errs + 1
+              print *, 's2%MPI_SOURCE != 0 at T1 Imrecv().'
+          endif
+          if (s2%MPI_TAG .ne. 5) then
+              errs = errs + 1
+              print *, 's2%MPI_TAG != 5 at T1 Imrecv().'
+          endif
+          if (s2%MPI_ERROR .ne. MPI_ERR_OTHER) then
+              errs = errs + 1
+              print *, 's2%MPI_ERROR != MPI_ERR_OTHER at T1 Imrecv().'
+          endif
+          if (msg .ne. MPI_MESSAGE_NULL) then
+              errs = errs + 1
+              print *, 'msg != MPI_MESSAGE_NULL at T1 Imrecv().'
+          endif
+      endif
+
+! Test 2: simple Send and Improbe+Mrecv.
+      if (rank .eq. 0) then
+          sendbuf(1) = 1735928559
+          sendbuf(2) = 1277009102
+          call MPI_Send(sendbuf, 2, MPI_INTEGER, &
+      &                  1, 5, MPI_COMM_WORLD, ierr)
+      else
+!         the error fields are initialized for modification check.
+          s1%MPI_ERROR = MPI_ERR_DIMS
+          s2%MPI_ERROR = MPI_ERR_OTHER
+
+          msg = MPI_MESSAGE_NULL
+          call MPI_Improbe(0, 5, MPI_COMM_WORLD, found, msg, s1, ierr)
+          do while (.not. found)
+              call MPI_Improbe(0, 5, MPI_COMM_WORLD, &
+      &                          found, msg, s1, ierr)
+          enddo
+          if (msg .eq. MPI_MESSAGE_NULL) then
+              errs = errs + 1
+              print *, 'msg == MPI_MESSAGE_NULL at T2 Improbe().'
+          endif
+          if (s2%MPI_SOURCE .ne. 0) then
+              errs = errs + 1
+              print *, 's2%MPI_SOURCE != 0 at T2 Improbe().'
+          endif
+          if (s1%MPI_TAG .ne. 5) then
+              errs = errs + 1
+              print *, 's1%MPI_TAG != 5 at T2 Improbe().'
+          endif
+          if (s1%MPI_ERROR .ne. MPI_ERR_DIMS) then
+              errs = errs + 1
+              print *, 's1%MPI_ERROR != MPI_ERR_DIMS at T2 Improbe().'
+          endif
+
+          count = -1
+          call MPI_Get_count(s1, MPI_INTEGER, count, ierr)
+          if (count .ne. 2) then
+              errs = errs + 1
+              print *, 'probed buffer does not have 2 MPI_INTEGERs.'
+          endif
+
+          recvbuf(1) = 19088743
+          recvbuf(2) = 1309737967
+          call MPI_Mrecv(recvbuf, count, MPI_INTEGER, msg, s2, ierr)
+          if (recvbuf(1) .ne. 1735928559) then
+              errs = errs + 1
+              print *, 'recvbuf(1) is corrupted at T2 Mrecv().'
+          endif
+          if (recvbuf(2) .ne. 1277009102) then
+              errs = errs + 1
+              print *, 'recvbuf(2) is corrupted at T2 Mrecv().'
+          endif
+          if (s2%MPI_SOURCE .ne. 0) then
+              errs = errs + 1
+              print *, 's2%MPI_SOURCE != 0 at T2 Mrecv().'
+          endif
+          if (s2%MPI_TAG .ne. 5) then
+              errs = errs + 1
+              print *, 's2%MPI_TAG != 5 at T2 Mrecv().'
+          endif
+          if (s2%MPI_ERROR .ne. MPI_ERR_OTHER) then
+              errs = errs + 1
+              print *, 's2%MPI_ERROR != MPI_ERR_OTHER at T2 Mrecv().'
+          endif
+          if (msg .ne. MPI_MESSAGE_NULL) then
+              errs = errs + 1
+              print *, 'msg != MPI_MESSAGE_NULL at T2 Mrecv().'
+          endif
+      endif
+
+! Test 3: simple Send and Improbe+Imrecv.
+      if (rank .eq. 0) then
+          sendbuf(1) = 1735928559
+          sendbuf(2) = 1277009102
+          call MPI_Send(sendbuf, 2, MPI_INTEGER, &
+      &                  1, 5, MPI_COMM_WORLD, ierr)
+      else
+!         the error fields are initialized for modification check.
+          s1%MPI_ERROR = MPI_ERR_DIMS
+          s2%MPI_ERROR = MPI_ERR_OTHER
+
+          msg = MPI_MESSAGE_NULL
+          call MPI_Improbe(0, 5, MPI_COMM_WORLD, found, msg, s1, ierr)
+          do while (.not. found)
+              call MPI_Improbe(0, 5, MPI_COMM_WORLD, &
+      &                          found, msg, s1, ierr)
+          enddo
+          if (msg .eq. MPI_MESSAGE_NULL) then
+              errs = errs + 1
+              print *, 'msg == MPI_MESSAGE_NULL at T3 Improbe().'
+          endif
+          if (s2%MPI_SOURCE .ne. 0) then
+              errs = errs + 1
+              print *, 's2%MPI_SOURCE != 0 at T3 Improbe().'
+          endif
+          if (s1%MPI_TAG .ne. 5) then
+              errs = errs + 1
+              print *, 's1%MPI_TAG != 5 at T3 Improbe().'
+          endif
+          if (s1%MPI_ERROR .ne. MPI_ERR_DIMS) then
+              errs = errs + 1
+              print *, 's1%MPI_ERROR != MPI_ERR_DIMS at T3 Improbe().'
+          endif
+
+          count = -1
+          call MPI_Get_count(s1, MPI_INTEGER, count, ierr)
+          if (count .ne. 2) then
+              errs = errs + 1
+              print *, 'probed buffer does not have 2 MPI_INTEGERs.'
+          endif
+
+          rreq = MPI_REQUEST_NULL
+          recvbuf(1) = 19088743
+          recvbuf(2) = 1309737967
+          call MPI_Imrecv(recvbuf, count, MPI_INTEGER, msg, rreq, ierr)
+          if (rreq .eq. MPI_REQUEST_NULL) then
+              errs = errs + 1
+              print *, 'rreq is unmodified at T3 Imrecv().'
+          endif
+          call MPI_Wait(rreq, s2, ierr)
+          if (recvbuf(1) .ne. 1735928559) then
+              errs = errs + 1
+              print *, 'recvbuf(1) is corrupted at T3 Imrecv().'
+          endif
+          if (recvbuf(2) .ne. 1277009102) then
+              errs = errs + 1
+              print *, 'recvbuf(2) is corrupted at T3 Imrecv().'
+          endif
+          if (s2%MPI_SOURCE .ne. 0) then
+              errs = errs + 1
+              print *, 's2%MPI_SOURCE != 0 at T3 Imrecv().'
+          endif
+          if (s2%MPI_TAG .ne. 5) then
+              errs = errs + 1
+              print *, 's2%MPI_TAG != 5 at T3 Imrecv().'
+          endif
+          if (s2%MPI_ERROR .ne. MPI_ERR_OTHER) then
+              errs = errs + 1
+              print *, 's2%MPI_ERROR != MPI_ERR_OTHER at T3 Imrecv().'
+          endif
+          if (msg .ne. MPI_MESSAGE_NULL) then
+              errs = errs + 1
+              print *, 'msg != MPI_MESSAGE_NULL at T3 Imrecv().'
+          endif
+      endif
+
+! Test 4: Mprobe+Mrecv with MPI_PROC_NULL
+      if (.true.) then
+!         the error fields are initialized for modification check.
+          s1%MPI_ERROR = MPI_ERR_DIMS
+          s2%MPI_ERROR = MPI_ERR_OTHER
+
+          msg = MPI_MESSAGE_NULL
+          call MPI_Mprobe(MPI_PROC_NULL, 5, MPI_COMM_WORLD, &
+      &                     msg, s1, ierr)
+          if (s1%MPI_SOURCE .ne. MPI_PROC_NULL) then
+              errs = errs + 1
+              print *, 's1%MPI_SOURCE != MPI_PROC_NULL at T4 Mprobe().'
+          endif
+          if (s1%MPI_TAG .ne. MPI_ANY_TAG) then
+              errs = errs + 1
+              print *, 's1%MPI_TAG != MPI_ANY_TAG at T4 Mprobe().'
+          endif
+          if (s1%MPI_ERROR .ne. MPI_ERR_DIMS) then
+              errs = errs + 1
+              print *, 's1%MPI_ERROR != MPI_ERR_DIMS at T4 Mprobe().'
+          endif
+          if (msg .ne. MPI_MESSAGE_NO_PROC) then
+              errs = errs + 1
+              print *, 'msg != MPI_MESSAGE_NO_PROC at T4 Mprobe().'
+          endif
+
+          count = -1
+          call MPI_Get_count(s1, MPI_INTEGER, count, ierr)
+          if (count .ne. 0) then
+              errs = errs + 1
+              print *, 'probed buffer does not have 0 MPI_INTEGER.'
+          endif
+
+          recvbuf(1) = 19088743
+          recvbuf(2) = 1309737967
+          call MPI_Mrecv(recvbuf, count, MPI_INTEGER, msg, s2, ierr)
+!         recvbuf() should remain unmodified
+          if (recvbuf(1) .ne. 19088743) then
+              errs = errs + 1
+              print *, 'recvbuf(1) is corrupted at T4 Mrecv().'
+          endif
+          if (recvbuf(2) .ne. 1309737967) then
+              errs = errs + 1
+              print *, 'recvbuf(2) is corrupted at T4 Mrecv().'
+          endif
+          if (s2%MPI_SOURCE .ne. MPI_PROC_NULL) then
+              errs = errs + 1
+              print *, 's2%MPI_SOURCE != MPI_PROC_NULL at T4 Mrecv().'
+          endif
+          if (s2%MPI_TAG .ne. MPI_ANY_TAG) then
+              errs = errs + 1
+              print *, 's2%MPI_TAG != MPI_ANY_TAG at T4 Mrecv().'
+          endif
+          if (s2%MPI_ERROR .ne. MPI_ERR_OTHER) then
+              errs = errs + 1
+              print *, 's2%MPI_ERROR != MPI_ERR_OTHER at T4 Mrecv().'
+          endif
+          if (msg .ne. MPI_MESSAGE_NULL) then
+              errs = errs + 1
+              print *, 'msg != MPI_MESSAGE_NULL at T4 Mrecv().'
+          endif
+
+          count = -1
+          call MPI_Get_count(s2, MPI_INTEGER, count, ierr)
+          if (count .ne. 0) then
+              errs = errs + 1
+              print *, 'recv buffer does not have 0 MPI_INTEGER.'
+          endif
+      endif
+
+! Test 5: Mprobe+Imrecv with MPI_PROC_NULL
+      if (.true.) then
+!         the error fields are initialized for modification check.
+          s1%MPI_ERROR = MPI_ERR_DIMS
+          s2%MPI_ERROR = MPI_ERR_OTHER
+
+          msg = MPI_MESSAGE_NULL
+          call MPI_Mprobe(MPI_PROC_NULL, 5, MPI_COMM_WORLD, &
+      &                     msg, s1, ierr)
+          if (s2%MPI_SOURCE .ne. MPI_PROC_NULL) then
+              errs = errs + 1
+              print *, 's2%MPI_SOURCE != MPI_PROC_NULL at T5 Mprobe().'
+          endif
+          if (s1%MPI_TAG .ne. MPI_ANY_TAG) then
+              errs = errs + 1
+              print *, 's1%MPI_TAG != MPI_ANY_TAG at T5 Mprobe().'
+          endif
+          if (s1%MPI_ERROR .ne. MPI_ERR_DIMS) then
+              errs = errs + 1
+              print *, 's1%MPI_ERROR != MPI_ERR_DIMS at T5 Mprobe().'
+          endif
+          if (msg .ne. MPI_MESSAGE_NO_PROC) then
+              errs = errs + 1
+              print *, 'msg != MPI_MESSAGE_NO_PROC at T5 Mprobe().'
+          endif
+
+          count = -1
+          call MPI_Get_count(s1, MPI_INTEGER, count, ierr)
+          if (count .ne. 0) then
+              errs = errs + 1
+              print *, 'probed buffer does not have 0 MPI_INTEGER.'
+          endif
+
+          rreq = MPI_REQUEST_NULL
+          recvbuf(1) = 19088743
+          recvbuf(2) = 1309737967
+          call MPI_Imrecv(recvbuf, count, MPI_INTEGER, msg, rreq, ierr)
+          if (rreq .eq. MPI_REQUEST_NULL) then
+              errs = errs + 1
+              print *, 'rreq == MPI_REQUEST_NULL at T5 Imrecv().'
+          endif
+          flag = .false.
+          call MPI_Test(rreq, flag, s2, ierr)
+          if (.not. flag) then
+              errs = errs + 1
+              print *, 'flag is false at T5 Imrecv().'
+          endif
+!         recvbuf() should remain unmodified
+          if (recvbuf(1) .ne. 19088743) then
+              errs = errs + 1
+              print *, 'recvbuf(1) is corrupted at T5 Imrecv().'
+          endif
+          if (recvbuf(2) .ne. 1309737967) then
+              errs = errs + 1
+              print *, 'recvbuf(2) is corrupted at T5 Imrecv().'
+          endif
+          if (s2%MPI_SOURCE .ne. MPI_PROC_NULL) then
+              errs = errs + 1
+              print *, 's2%MPI_SOURCE != MPI_PROC_NULL at T5 Imrecv().'
+          endif
+          if (s2%MPI_TAG .ne. MPI_ANY_TAG) then
+              errs = errs + 1
+              print *, 's2%MPI_TAG != MPI_ANY_TAG at T5 Imrecv().'
+          endif
+          if (s2%MPI_ERROR .ne. MPI_ERR_OTHER) then
+              errs = errs + 1
+              print *, 's2%MPI_ERROR != MPI_ERR_OTHER at T5 Imrecv().'
+          endif
+          if (msg .ne. MPI_MESSAGE_NULL) then
+              errs = errs + 1
+              print *, 'msg != MPI_MESSAGE_NULL at T5 Imrecv().'
+          endif
+
+          count = -1
+          call MPI_Get_count(s2, MPI_INTEGER, count, ierr)
+          if (count .ne. 0) then
+              errs = errs + 1
+              print *, 'recv buffer does not have 0 MPI_INTEGER.'
+          endif
+      endif
+
+! Test 6: Improbe+Mrecv with MPI_PROC_NULL
+      if (.true.) then
+!         the error fields are initialized for modification check.
+          s1%MPI_ERROR = MPI_ERR_DIMS
+          s2%MPI_ERROR = MPI_ERR_OTHER
+
+          found = .false.
+          msg = MPI_MESSAGE_NULL
+          call MPI_Improbe(MPI_PROC_NULL, 5, MPI_COMM_WORLD, &
+      &                      found, msg, s1, ierr)
+          if (.not. found) then
+              errs = errs + 1
+              print *, 'found is false at T6 Improbe().'
+          endif
+          if (s2%MPI_SOURCE .ne. MPI_PROC_NULL) then
+              errs = errs + 1
+              print *, 's2%MPI_SOURCE != MPI_PROC_NULL at T6 Improbe()'
+          endif
+          if (s1%MPI_TAG .ne. MPI_ANY_TAG) then
+              errs = errs + 1
+              print *, 's1%MPI_TAG != MPI_ANY_TAG at T6 Improbe().'
+          endif
+          if (s1%MPI_ERROR .ne. MPI_ERR_DIMS) then
+              errs = errs + 1
+              print *, 's1%MPI_ERROR != MPI_ERR_DIMS at T6 Improbe().'
+          endif
+          if (msg .ne. MPI_MESSAGE_NO_PROC) then
+              errs = errs + 1
+              print *, 'msg != MPI_MESSAGE_NO_PROC at T6 Improbe().'
+          endif
+
+          count = -1
+          call MPI_Get_count(s1, MPI_INTEGER, count, ierr)
+          if (count .ne. 0) then
+              errs = errs + 1
+              print *, 'probed buffer does not have 0 MPI_INTEGER.'
+          endif
+
+          recvbuf(1) = 19088743
+          recvbuf(2) = 1309737967
+          call MPI_Mrecv(recvbuf, count, MPI_INTEGER, msg, s2, ierr)
+!         recvbuf() should remain unmodified
+          if (recvbuf(1) .ne. 19088743) then
+              errs = errs + 1
+              print *, 'recvbuf(1) is corrupted at T6 Mrecv().'
+          endif
+          if (recvbuf(2) .ne. 1309737967) then
+              errs = errs + 1
+              print *, 'recvbuf(2) is corrupted at T6 Mrecv().'
+          endif
+          if (s2%MPI_SOURCE .ne. MPI_PROC_NULL) then
+              errs = errs + 1
+              print *, 's2%MPI_SOURCE != MPI_PROC_NULL at T6 Mrecv().'
+          endif
+          if (s2%MPI_TAG .ne. MPI_ANY_TAG) then
+              errs = errs + 1
+              print *, 's2%MPI_TAG != MPI_ANY_TAG at T6 Mrecv().'
+          endif
+          if (s2%MPI_ERROR .ne. MPI_ERR_OTHER) then
+              errs = errs + 1
+              print *, 's2%MPI_ERROR != MPI_ERR_OTHER at T6 Mrecv().'
+          endif
+          if (msg .ne. MPI_MESSAGE_NULL) then
+              errs = errs + 1
+              print *, 'msg != MPI_MESSAGE_NULL at T6 Mrecv().'
+          endif
+
+          count = -1
+          call MPI_Get_count(s2, MPI_INTEGER, count, ierr)
+          if (count .ne. 0) then
+              errs = errs + 1
+              print *, 'recv buffer does not have 0 MPI_INTEGER.'
+          endif
+      endif
+
+! Test 7: Improbe+Imrecv with MPI_PROC_NULL
+      if (.true.) then
+!         the error fields are initialized for modification check.
+          s1%MPI_ERROR = MPI_ERR_DIMS
+          s2%MPI_ERROR = MPI_ERR_OTHER
+
+          found = .false.
+          msg = MPI_MESSAGE_NULL
+          call MPI_Improbe(MPI_PROC_NULL, 5, MPI_COMM_WORLD, &
+      &                      found, msg, s1, ierr)
+          if (.not. found) then
+              errs = errs + 1
+              print *, 'found is false at T7 Improbe().'
+          endif
+          if (s2%MPI_SOURCE .ne. MPI_PROC_NULL) then
+              errs = errs + 1
+              print *, 's2%MPI_SOURCE != MPI_PROC_NULL at T7 Improbe()'
+          endif
+          if (s1%MPI_TAG .ne. MPI_ANY_TAG) then
+              errs = errs + 1
+              print *, 's1%MPI_TAG != MPI_ANY_TAG at T7 Improbe().'
+          endif
+          if (s1%MPI_ERROR .ne. MPI_ERR_DIMS) then
+              errs = errs + 1
+              print *, 's1%MPI_ERROR != MPI_ERR_DIMS at T7 Improbe().'
+          endif
+          if (msg .ne. MPI_MESSAGE_NO_PROC) then
+              errs = errs + 1
+              print *, 'msg != MPI_MESSAGE_NO_PROC at T7 Improbe().'
+          endif
+
+          count = -1
+          call MPI_Get_count(s1, MPI_INTEGER, count, ierr)
+          if (count .ne. 0) then
+              errs = errs + 1
+              print *, 'probed buffer does not have 0 MPI_INTEGER.'
+          endif
+
+          rreq = MPI_REQUEST_NULL
+          recvbuf(1) = 19088743
+          recvbuf(2) = 1309737967
+          call MPI_Imrecv(recvbuf, count, MPI_INTEGER, msg, rreq, ierr)
+          if (rreq .eq. MPI_REQUEST_NULL) then
+              errs = errs + 1
+              print *, 'rreq == MPI_REQUEST_NULL at T7 Imrecv().'
+          endif
+          flag = .false.
+          call MPI_Test(rreq, flag, s2, ierr)
+          if (.not. flag) then
+              errs = errs + 1
+              print *, 'flag is false at T7 Imrecv().'
+          endif
+!         recvbuf() should remain unmodified
+          if (recvbuf(1) .ne. 19088743) then
+              errs = errs + 1
+              print *, 'recvbuf(1) is corrupted at T7 Imrecv().'
+          endif
+          if (recvbuf(2) .ne. 1309737967) then
+              errs = errs + 1
+              print *, 'recvbuf(2) is corrupted at T7 Imrecv().'
+          endif
+          if (s2%MPI_SOURCE .ne. MPI_PROC_NULL) then
+              errs = errs + 1
+              print *, 's2%MPI_SOURCE != MPI_PROC_NULL at T7 Imrecv().'
+          endif
+          if (s2%MPI_TAG .ne. MPI_ANY_TAG) then
+              errs = errs + 1
+              print *, 's2%MPI_TAG != MPI_ANY_TAG at T7 Imrecv().'
+          endif
+          if (s2%MPI_ERROR .ne. MPI_ERR_OTHER) then
+              errs = errs + 1
+              print *, 's2%MPI_ERROR != MPI_ERR_OTHER at T7 Imrecv().'
+          endif
+          if (msg .ne. MPI_MESSAGE_NULL) then
+              errs = errs + 1
+              print *, 'msg != MPI_MESSAGE_NULL at T7 Imrecv().'
+          endif
+
+          count = -1
+          call MPI_Get_count(s2, MPI_INTEGER, count, ierr)
+          if (count .ne. 0) then
+              errs = errs + 1
+              print *, 'recv buffer does not have 0 MPI_INTEGER.'
+          endif
+      endif
+
+      call mtest_finalize( errs )
+      call mpi_finalize( ierr )
+      end
diff --git a/test/mpi/f08/pt2pt/statusesf08.f90 b/test/mpi/f08/pt2pt/statusesf08.f90
new file mode 100644
index 0000000..f3b8af7
--- /dev/null
+++ b/test/mpi/f08/pt2pt/statusesf08.f90
@@ -0,0 +1,56 @@
+! This file created from test/mpi/f77/pt2pt/statusesf.f with f77tof90
+! -*- Mode: Fortran; -*-
+!
+!  (C) 2003 by Argonne National Laboratory.
+!      See COPYRIGHT in top-level directory.
+!
+      program main
+!     Test support for MPI_STATUS_IGNORE and MPI_STATUSES_IGNORE
+      use mpi_f08
+      integer nreqs
+      parameter (nreqs = 100)
+      TYPE(MPI_Request) reqs(nreqs)
+      integer ierr, rank, i
+      integer errs
+
+      ierr = -1
+      errs = 0
+      call mpi_init( ierr )
+      if (ierr .ne. MPI_SUCCESS) then
+         errs = errs + 1
+         print *, 'Unexpected return from MPI_INIT', ierr
+      endif
+
+      ierr = -1
+      call mpi_comm_rank( MPI_COMM_WORLD, rank, ierr )
+      if (ierr .ne. MPI_SUCCESS) then
+         errs = errs + 1
+         print *, 'Unexpected return from MPI_COMM_WORLD', ierr
+      endif
+      do i=1, nreqs, 2
+         ierr = -1
+         call mpi_isend( MPI_BOTTOM, 0, MPI_BYTE, rank, i, &
+      &        MPI_COMM_WORLD, reqs(i), ierr )
+         if (ierr .ne. MPI_SUCCESS) then
+            errs = errs + 1
+            print *, 'Unexpected return from MPI_ISEND', ierr
+         endif
+         ierr = -1
+         call mpi_irecv( MPI_BOTTOM, 0, MPI_BYTE, rank, i, &
+      &        MPI_COMM_WORLD, reqs(i+1), ierr )
+         if (ierr .ne. MPI_SUCCESS) then
+            errs = errs + 1
+            print *, 'Unexpected return from MPI_IRECV', ierr
+         endif
+      enddo
+
+      ierr = -1
+      call mpi_waitall( nreqs, reqs, MPI_STATUSES_IGNORE, ierr )
+      if (ierr .ne. MPI_SUCCESS) then
+         errs = errs + 1
+         print *, 'Unexpected return from MPI_WAITALL', ierr
+      endif
+
+      call mtest_finalize( errs )
+      call mpi_finalize( ierr )
+      end
diff --git a/test/mpi/f08/pt2pt/testlist b/test/mpi/f08/pt2pt/testlist
new file mode 100644
index 0000000..9b2c5c0
--- /dev/null
+++ b/test/mpi/f08/pt2pt/testlist
@@ -0,0 +1,4 @@
+allpairf08 2
+greqf08 1
+statusesf08 1
+mprobef08 2
diff --git a/test/mpi/f08/rma/Makefile.am b/test/mpi/f08/rma/Makefile.am
new file mode 100644
index 0000000..4588779
--- /dev/null
+++ b/test/mpi/f08/rma/Makefile.am
@@ -0,0 +1,34 @@
+# This Makefile.am generated automatically by f77tof90
+# from test/mpi/f77/rma/Makefile.am.  DO NOT EDIT
+# -*- Mode: Makefile; -*-
+# vim: set ft=automake :
+#
+# (C) 2011 by Argonne National Laboratory.
+#     See COPYRIGHT in top-level directory.
+#
+
+include $(top_srcdir)/Makefile_f08.mtest
+
+EXTRA_DIST = testlist
+
+# avoid having to write many "foo_SOURCES = foo.f90" lines
+AM_DEFAULT_SOURCE_EXT = .f90
+
+noinst_PROGRAMS = \
+    winscale1f08    \
+    winscale2f08    \
+    winfencef08     \
+    wingetf08       \
+    winerrf08       \
+    winnamef08      \
+    wingroupf08     \
+    winaccf08       \
+    winaccf08       \
+    c2f2cwinf08     \
+    baseattrwinf08  \
+    winattrf08      \
+    winattr2f08
+## this test was commented out in the simplemake version...
+##    allocmem
+
+c2f2cwinf08_SOURCES = c2f2cwinf08.f90 c2f902cwin.c
diff --git a/test/mpi/f08/rma/baseattrwinf08.f90 b/test/mpi/f08/rma/baseattrwinf08.f90
new file mode 100644
index 0000000..a279b9b
--- /dev/null
+++ b/test/mpi/f08/rma/baseattrwinf08.f90
@@ -0,0 +1,83 @@
+! This file created from test/mpi/f77/rma/baseattrwinf.f with f77tof90
+! -*- Mode: Fortran; -*-
+!
+!  (C) 2003 by Argonne National Laboratory.
+!      See COPYRIGHT in top-level directory.
+!
+      program main
+      use mpi_f08
+      integer (kind=MPI_ADDRESS_KIND) extrastate, valin, valout, val
+
+      logical flag
+      integer ierr, errs
+      integer base(1024)
+      integer disp
+      TYPE(MPI_Win) win
+      integer commsize
+! Include addsize defines asize as an address-sized integer
+      integer (kind=MPI_ADDRESS_KIND) asize
+
+
+      errs = 0
+
+      call mtest_init( ierr )
+      call mpi_comm_size( MPI_COMM_WORLD, commsize, ierr )
+
+! Create a window; then extract the values
+      asize    = 1024
+      disp = 4
+      call MPI_Win_create( base, asize, disp, MPI_INFO_NULL,  &
+      &  MPI_COMM_WORLD, win, ierr )
+!
+! In order to check the base, we need an address-of function.
+! We use MPI_Get_address, even though that isn't strictly correct
+      call MPI_Win_get_attr( win, MPI_WIN_BASE, valout, flag, ierr )
+      if (.not. flag) then
+         errs = errs + 1
+         print *, "Could not get WIN_BASE"
+!
+! There is no easy way to get the actual value of base to compare
+! against.  MPI_Address gives a value relative to MPI_BOTTOM, which
+! is different from 0 in Fortran (unless you can define MPI_BOTTOM
+! as something like %pointer(0)).
+!      else
+!
+!C For this Fortran 77 version, we use the older MPI_Address function
+!         call MPI_Address( base, baseadd, ierr )
+!         if (valout .ne. baseadd) then
+!           errs = errs + 1
+!           print *, "Got incorrect value for WIN_BASE (", valout,
+!     &             ", should be ", baseadd, ")"
+!         endif
+      endif
+
+      call MPI_Win_get_attr( win, MPI_WIN_SIZE, valout, flag, ierr )
+      if (.not. flag) then
+         errs = errs + 1
+         print *, "Could not get WIN_SIZE"
+      else
+        if (valout .ne. asize) then
+            errs = errs + 1
+            print *, "Got incorrect value for WIN_SIZE (", valout,  &
+      &        ", should be ", asize, ")"
+         endif
+      endif
+
+      call MPI_Win_get_attr( win, MPI_WIN_DISP_UNIT, valout, flag, ierr)
+      if (.not. flag) then
+         errs = errs + 1
+         print *, "Could not get WIN_DISP_UNIT"
+      else
+         if (valout .ne. disp) then
+            errs = errs + 1
+            print *, "Got wrong value for WIN_DISP_UNIT (", valout,  &
+      &               ", should be ", disp, ")"
+         endif
+      endif
+
+      call MPI_Win_free( win, ierr )
+
+      call mtest_finalize( errs )
+      call MPI_Finalize( ierr )
+
+      end
diff --git a/test/mpi/f08/rma/c2f2cwinf08.f90 b/test/mpi/f08/rma/c2f2cwinf08.f90
new file mode 100644
index 0000000..0f0141e
--- /dev/null
+++ b/test/mpi/f08/rma/c2f2cwinf08.f90
@@ -0,0 +1,55 @@
+! This file created from test/mpi/f77/rma/c2f2cwinf.f with f77tof90
+! -*- Mode: Fortran; -*-
+!
+!  (C) 2003 by Argonne National Laboratory.
+!      See COPYRIGHT in top-level directory.
+!
+! Test just MPI-RMA
+!
+      program main
+      use mpi_f08
+      integer errs, toterrs, ierr
+      integer wrank, wsize
+      integer wgroup, info, req
+      TYPE(MPI_Win) win
+      integer result
+      integer c2fwin
+! The integer asize must be of ADDRESS_KIND size
+      integer (kind=MPI_ADDRESS_KIND) asize
+
+      errs = 0
+
+      call mpi_init( ierr )
+
+!
+! Test passing a Fortran MPI object to C
+      call mpi_comm_rank( MPI_COMM_WORLD, wrank, ierr )
+      asize = 0
+      call mpi_win_create( 0, asize, 1, MPI_INFO_NULL,  &
+      &     MPI_COMM_WORLD, win, ierr )
+      errs = errs + c2fwin( win )
+      call mpi_win_free( win, ierr )
+
+!
+! Test using a C routine to provide the Fortran handle
+      call f2cwin( win )
+!     no info, in comm world, created with no memory (base address 0,
+!     displacement unit 1
+      call mpi_win_free( win, ierr )
+
+!
+! Summarize the errors
+!
+      call mpi_allreduce( errs, toterrs, 1, MPI_INTEGER, MPI_SUM, &
+      &     MPI_COMM_WORLD, ierr )
+      if (wrank .eq. 0) then
+         if (toterrs .eq. 0) then
+            print *, ' No Errors'
+         else
+            print *, ' Found ', toterrs, ' errors'
+         endif
+      endif
+
+      call mpi_finalize( ierr )
+      end
+
diff --git a/test/mpi/f08/rma/c2f902cwin.c b/test/mpi/f08/rma/c2f902cwin.c
new file mode 100644
index 0000000..fb18e1b
--- /dev/null
+++ b/test/mpi/f08/rma/c2f902cwin.c
@@ -0,0 +1,92 @@
+/* This file created from test/mpi/f77/rma/c2f2cwin.c with f77tof90 */
+/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
+/*
+ *
+ *  (C) 2001 by Argonne National Laboratory.
+ *      See COPYRIGHT in top-level directory.
+ */
+/*
+ * This file contains the C routines used in testing the c2f and f2c
+ * handle conversion functions for MPI_Win
+ *
+ * The tests follow this pattern:
+ *
+ *  Fortran main program
+ *     calls c routine with each handle type, with a prepared
+ *     and valid handle (often requires constructing an object)
+ *
+ *     C routine uses xxx_f2c routine to get C handle, checks some
+ *     properties (i.e., size and rank of communicator, contents of datatype)
+ *
+ *     Then the Fortran main program calls a C routine that provides
+ *     a handle, and the Fortran program performs similar checks.
+ *
+ * We also assume that a C int is a Fortran integer.  If this is not the
+ * case, these tests must be modified.
+ */
+
+/* style: allow:fprintf:1 sig:0 */
+#include <stdio.h>
+#include "mpi.h"
+#include "../../include/mpitestconf.h"
+#include <string.h>
+
+/*
+   Name mapping.  All routines are created with names that are lower case
+   with a single trailing underscore.  This matches many compilers.
+   We use #define to change the name for Fortran compilers that do
+   not use the lowercase/underscore pattern
+*/
+
+#ifdef F77_NAME_UPPER
+#define c2fwin_ C2FWIN
+#define f2cwin_ F2CWIN
+
+#elif defined(F77_NAME_LOWER) || defined(F77_NAME_MIXED)
+/* Mixed is ok because we use lowercase in all uses */
+#define c2fwin_ c2fwin
+#define f2cwin_ f2cwin
+
+#elif defined(F77_NAME_LOWER_2USCORE) || defined(F77_NAME_LOWER_USCORE) || \
+      defined(F77_NAME_MIXED_USCORE)
+/* Else leave name alone (routines have no underscore, so both
+   of these map to a lowercase, single underscore) */
+#else
+#error 'Unrecognized Fortran name mapping'
+#endif
+
+/* Prototypes to keep compilers happy */
+int c2fwin_( int * );
+void f2cwin_( int * );
+
+int c2fwin_( int *win )
+{
+    MPI_Win cWin = MPI_Win_f2c( *win );
+    MPI_Group group, wgroup;
+    int result;
+
+    MPI_Win_get_group( cWin, &group );
+    MPI_Comm_group( MPI_COMM_WORLD, &wgroup );
+
+    MPI_Group_compare( group, wgroup, &result );
+    if (result != MPI_IDENT) {
+	fprintf( stderr, "Win: did not get expected group\n" );
+	return 1;
+    }
+
+    MPI_Group_free( &group );
+    MPI_Group_free( &wgroup );
+
+    return 0;
+}
+
+/*
+ * The following routines provide handles to the calling Fortran program
+ */
+void f2cwin_( int *win )
+{
+    MPI_Win cWin;
+    MPI_Win_create( 0, 0, 1, MPI_INFO_NULL, MPI_COMM_WORLD, &cWin );
+    *win = MPI_Win_c2f( cWin );
+}
+
diff --git a/test/mpi/f08/rma/testlist b/test/mpi/f08/rma/testlist
new file mode 100644
index 0000000..fee7fb4
--- /dev/null
+++ b/test/mpi/f08/rma/testlist
@@ -0,0 +1,12 @@
+winscale1f08 4
+winfencef08 4
+wingetf08 5
+winscale2f08 4
+winerrf08 1
+winnamef08 1
+wingroupf08 4
+winaccf08 4
+c2f2cwinf08 1
+baseattrwinf08 1
+winattrf08 1
+winattr2f08 1
diff --git a/test/mpi/f08/rma/winaccf08.f90 b/test/mpi/f08/rma/winaccf08.f90
new file mode 100644
index 0000000..116195d
--- /dev/null
+++ b/test/mpi/f08/rma/winaccf08.f90
@@ -0,0 +1,97 @@
+! This file created from test/mpi/f77/rma/winaccf.f with f77tof90
+! -*- Mode: Fortran; -*-
+!
+!  (C) 2003 by Argonne National Laboratory.
+!      See COPYRIGHT in top-level directory.
+!
+      program main
+      use mpi_f08
+      integer ierr, errs
+      integer intsize
+      TYPE(MPI_Win) win
+      integer left, right, rank, size
+      integer nrows, ncols
+      parameter (nrows=25,ncols=10)
+      integer buf(1:nrows,0:ncols+1)
+      integer ans
+      TYPE(MPI_Comm) comm
+      integer i, j
+      logical mtestGetIntraComm
+! Include addsize defines asize as an address-sized integer
+      integer (kind=MPI_ADDRESS_KIND) asize
+
+
+      errs = 0
+      call mtest_init( ierr )
+
+      call mpi_type_size( MPI_INTEGER, intsize, ierr )
+      do while( mtestGetIntraComm( comm, 2, .false. ) )
+         asize  = nrows * (ncols + 2) * intsize
+         call mpi_win_create( buf, asize, intsize * nrows,  &
+      &                        MPI_INFO_NULL, comm, win, ierr )
+
+         call mpi_comm_size( comm, size, ierr )
+         call mpi_comm_rank( comm, rank, ierr )
+         left = rank - 1
+         if (left .lt. 0) then
+            left = MPI_PROC_NULL
+         endif
+         right = rank + 1
+         if (right .ge. size) then
+            right = MPI_PROC_NULL
+         endif
+!
+! Initialize the buffer
+         do i=1,nrows
+            buf(i,0)       = -1
+            buf(i,ncols+1) = -1
+         enddo
+         do j=1,ncols
+            do i=1,nrows
+               buf(i,j) = rank * (ncols * nrows) + i + (j-1) * nrows
+            enddo
+         enddo
+         call mpi_win_fence( MPI_MODE_NOPRECEDE, win, ierr )
+!
+         asize = ncols + 1
+         call mpi_accumulate( buf(1,1), nrows, MPI_INTEGER,  &
+      &                 left, asize,  &
+      &                 nrows, MPI_INTEGER, MPI_SUM, win, ierr )
+         asize = 0
+         call mpi_accumulate( buf(1,ncols), nrows, MPI_INTEGER, right, &
+      &                 asize, nrows, MPI_INTEGER, MPI_SUM, win, ierr )
+!
+         call mpi_win_fence( MPI_MODE_NOSTORE + MPI_MODE_NOPUT +  &
+      &                       MPI_MODE_NOSUCCEED, win, ierr )
+!
+! Check the results
+         if (left .ne. MPI_PROC_NULL) then
+            do i=1, nrows
+               ans = rank * (ncols * nrows) - nrows + i - 1
+               if (buf(i,0) .ne. ans) then
+                  errs = errs + 1
+                  if (errs .le. 10) then
+                     print *, ' buf(',i,',0) = ', buf(i,0)
+                  endif
+               endif
+            enddo
+         endif
+         if (right .ne. MPI_PROC_NULL) then
+            do i=1, nrows
+               ans = (rank + 1) * (ncols * nrows) + i - 1
+               if (buf(i,ncols+1) .ne. ans) then
+                  errs = errs + 1
+                  if (errs .le. 10) then
+                     print *, ' buf(',i,',',ncols+1,') = ',  &
+      &                         buf(i,ncols+1)
+                  endif
+               endif
+            enddo
+         endif
+         call mpi_win_free( win, ierr )
+         call mtestFreeComm( comm )
+      enddo
+
+      call mtest_finalize( errs )
+      call mpi_finalize( ierr )
+      end
diff --git a/test/mpi/f08/rma/winattr2f08.f90 b/test/mpi/f08/rma/winattr2f08.f90
new file mode 100644
index 0000000..a6431ff
--- /dev/null
+++ b/test/mpi/f08/rma/winattr2f08.f90
@@ -0,0 +1,89 @@
+! This file created from test/mpi/f77/rma/winattr2f.f with f77tof90
+! -*- Mode: Fortran; -*-
+!
+!  (C) 2003 by Argonne National Laboratory.
+!      See COPYRIGHT in top-level directory.
+!  This is a modified version of winattrf.f that uses two of the
+!  default functions
+!
+      program main
+      use mpi_f08
+      integer errs, ierr
+      integer (kind=MPI_ADDRESS_KIND) extrastate, valin, valout, val
+
+      integer buf(10)
+      TYPE(MPI_Comm) comm
+      TYPE(MPI_Win) win
+      integer keyval
+      logical flag
+!
+! The only difference between the MPI-2 and MPI-1 attribute caching
+! routines in Fortran is that the take an address-sized integer
+! instead of a simple integer.  These still are not pointers,
+! so the values are still just integers.
+!
+      errs      = 0
+      call mtest_init( ierr )
+      call mpi_comm_dup( MPI_COMM_WORLD, comm, ierr )
+! Create a new window; use val for an address-sized int
+      val = 10
+      call mpi_win_create( buf, val, 1, &
+      &                        MPI_INFO_NULL, comm, win, ierr )
+!
+      extrastate = 1001
+      call mpi_win_create_keyval( MPI_WIN_DUP_FN,  &
+      &                            MPI_WIN_NULL_DELETE_FN, keyval,  &
+      &                             extrastate, ierr )
+      flag = .true.
+      call mpi_win_get_attr( win, keyval, valout, flag, ierr )
+      if (flag) then
+         errs = errs + 1
+         print *, ' get attr returned true when no attr set'
+      endif
+
+      valin = 2003
+      call mpi_win_set_attr( win, keyval, valin, ierr )
+      flag = .false.
+      valout = -1
+      call mpi_win_get_attr( win, keyval, valout, flag, ierr )
+      if (valout .ne. 2003) then
+         errs = errs + 1
+         print *, 'Unexpected value (should be 2003)', valout,  &
+      &            ' from attr'
+      endif
+
+      valin = 2001
+      call mpi_win_set_attr( win, keyval, valin, ierr )
+      flag = .false.
+      valout = -1
+      call mpi_win_get_attr( win, keyval, valout, flag, ierr )
+      if (valout .ne. 2001) then
+         errs = errs + 1
+         print *, 'Unexpected value (should be 2001)', valout,  &
+      &            ' from attr'
+      endif
+!
+! Test the attr delete function
+      call mpi_win_delete_attr( win, keyval, ierr )
+      flag = .true.
+      call mpi_win_get_attr( win, keyval, valout, flag, ierr )
+      if (flag) then
+         errs = errs + 1
+         print *, ' Delete_attr did not delete attribute'
+      endif
+
+! Test the delete function on window free
+      valin = 2001
+      call mpi_win_set_attr( win, keyval, valin, ierr )
+      call mpi_win_free( win, ierr )
+      call mpi_comm_free( comm, ierr )
+      ierr = -1
+      call mpi_win_free_keyval( keyval, ierr )
+      if (ierr .ne. MPI_SUCCESS) then
+         errs = errs + 1
+         call mtestprinterror( ierr )
+      endif
+
+      call mtest_finalize( errs )
+      call mpi_finalize( ierr )
+      end
diff --git a/test/mpi/f08/rma/winattrf90.f90 b/test/mpi/f08/rma/winattrf90.f90
new file mode 100644
index 0000000..af5ab04
--- /dev/null
+++ b/test/mpi/f08/rma/winattrf90.f90
@@ -0,0 +1,181 @@
+! This file created from test/mpi/f77/rma/winattrf.f with f77tof90
+! -*- Mode: Fortran; -*-
+!
+!  (C) 2003 by Argonne National Laboratory.
+!      See COPYRIGHT in top-level directory.
+!
+      program main
+      use mpi
+      integer errs, ierr
+      integer (kind=MPI_ADDRESS_KIND) extrastate, valin, valout, val
+
+      integer comm, win, buf(10)
+      integer curcount, keyval
+      logical flag
+      external mycopyfn, mydelfn
+      integer callcount, delcount
+      common /myattr/ callcount, delcount
+!
+! The only difference between the MPI-2 and MPI-1 attribute caching
+! routines in Fortran is that the take an address-sized integer
+! instead of a simple integer.  These still are not pointers,
+! so the values are still just integers.
+!
+      errs      = 0
+      callcount = 0
+      delcount  = 0
+      call mtest_init( ierr )
+      call mpi_comm_dup( MPI_COMM_WORLD, comm, ierr )
+! Create a new window; use val for an address-sized int
+      val = 10
+      call mpi_win_create( buf, val, 1, &
+      &                        MPI_INFO_NULL, comm, win, ierr )
+!
+      extrastate = 1001
+      call mpi_win_create_keyval( mycopyfn, mydelfn, keyval,  &
+      &                             extrastate, ierr )
+      flag = .true.
+      call mpi_win_get_attr( win, keyval, valout, flag, ierr )
+      if (flag) then
+         errs = errs + 1
+         print *, ' get attr returned true when no attr set'
+      endif
+
+      valin = 2003
+      call mpi_win_set_attr( win, keyval, valin, ierr )
+      flag = .false.
+      valout = -1
+      call mpi_win_get_attr( win, keyval, valout, flag, ierr )
+      if (valout .ne. 2003) then
+         errs = errs + 1
+         print *, 'Unexpected value (should be 2003)', valout,  &
+      &            ' from attr'
+      endif
+
+      valin = 2001
+      call mpi_win_set_attr( win, keyval, valin, ierr )
+      flag = .false.
+      valout = -1
+      call mpi_win_get_attr( win, keyval, valout, flag, ierr )
+      if (valout .ne. 2001) then
+         errs = errs + 1
+         print *, 'Unexpected value (should be 2001)', valout,  &
+      &            ' from attr'
+      endif
+!
+! Test the attr delete function
+      delcount   = 0
+      call mpi_win_delete_attr( win, keyval, ierr )
+      if (delcount .ne. 1) then
+         errs = errs + 1
+         print *, ' Delete_attr did not call delete function'
+      endif
+      flag = .true.
+      call mpi_win_get_attr( win, keyval, valout, flag, ierr )
+      if (flag) then
+         errs = errs + 1
+         print *, ' Delete_attr did not delete attribute'
+      endif
+
+! Test the delete function on window free
+      valin = 2001
+      call mpi_win_set_attr( win, keyval, valin, ierr )
+      curcount = delcount
+      call mpi_win_free( win, ierr )
+      if (delcount .ne. curcount + 1) then
+         errs = errs + 1
+         print *, ' did not get expected value of delcount ',  &
+      &          delcount, curcount + 1
+      endif
+
+      ierr = -1
+      call mpi_win_free_keyval( keyval, ierr )
+      if (ierr .ne. MPI_SUCCESS) then
+         errs = errs + 1
+         call mtestprinterror( ierr )
+      endif
+!
+! The MPI standard defines null copy and duplicate functions.
+! However, are only used when an object is duplicated.  Since
+! MPI_Win objects cannot be duplicated, so under normal circumstances,
+! these will not be called.  Since they are defined, they should behave
+! as defined.  To test them, we simply call them here
+      flag   = .false.
+      valin  = 7001
+      valout = -1
+      ierr   = -1
+      call MPI_WIN_DUP_FN( win, keyval, extrastate, valin, valout, &
+      &     flag, ierr )
+      if (.not. flag) then
+         errs = errs + 1
+         print *, " Flag was false after MPI_WIN_DUP_FN"
+      else if (valout .ne. 7001) then
+         errs = errs + 1
+         if (valout .eq. -1 ) then
+          print *, " output attr value was not copied in MPI_WIN_DUP_FN"
+         endif
+         print *, " value was ", valout, " but expected 7001"
+      else if (ierr .ne. MPI_SUCCESS) then
+         errs = errs + 1
+         print *, " MPI_WIN_DUP_FN did not return MPI_SUCCESS"
+      endif
+
+      flag   = .true.
+      valin  = 7001
+      valout = -1
+      ierr   = -1
+      call MPI_WIN_NULL_COPY_FN( win, keyval, extrastate, valin, valout &
+      &     ,flag, ierr )
+      if (flag) then
+         errs = errs + 1
+         print *, " Flag was true after MPI_WIN_NULL_COPY_FN"
+      else if (valout .ne. -1) then
+         errs = errs + 1
+         print *, &
+      &        " output attr value was copied in MPI_WIN_NULL_COPY_FN"
+      else if (ierr .ne. MPI_SUCCESS) then
+         errs = errs + 1
+         print *, " MPI_WIN_NULL_COPY_FN did not return MPI_SUCCESS"
+      endif
+!
+      call mpi_comm_free( comm, ierr )
+      call mtest_finalize( errs )
+      call mpi_finalize( ierr )
+      end
+!
+! Note that the copyfn is unused for MPI windows, since there is
+! (and because of alias rules, can be) no MPI_Win_dup function
+      subroutine mycopyfn( oldwin, keyval, extrastate, valin, valout, &
+      &                     flag, ierr )
+      use mpi
+      integer oldwin, keyval, ierr
+      integer (kind=MPI_ADDRESS_KIND) extrastate, valin, valout, val
+
+      logical flag
+      integer callcount, delcount
+      common /myattr/ callcount, delcount
+! increment the attribute by 2
+      valout = valin + 2
+      callcount = callcount + 1
+!
+! Since we should *never* call this, indicate an error
+      print *, ' Unexpected use of mycopyfn'
+      flag = .false.
+      ierr = MPI_ERR_OTHER
+      end
+!
+      subroutine mydelfn( win, keyval, val, extrastate, ierr )
+      use mpi
+      integer win, keyval, ierr
+      integer (kind=MPI_ADDRESS_KIND) extrastate, valin, valout, val
+
+      integer callcount, delcount
+      common /myattr/ callcount, delcount
+      delcount = delcount + 1
+      if (extrastate .eq. 1001) then
+         ierr = MPI_SUCCESS
+      else
+         print *, ' Unexpected value of extrastate = ', extrastate
+         ierr = MPI_ERR_OTHER
+      endif
+      end
diff --git a/test/mpi/f08/rma/winerrf08.f90 b/test/mpi/f08/rma/winerrf08.f90
new file mode 100644
index 0000000..98841c4
--- /dev/null
+++ b/test/mpi/f08/rma/winerrf08.f90
@@ -0,0 +1,136 @@
+! This file created from test/mpi/f77/rma/winerrf.f with f77tof90
+! -*- Mode: Fortran; -*-
+!
+!  (C) 2003 by Argonne National Laboratory.
+!      See COPYRIGHT in top-level directory.
+!
+       program main
+       use mpi_f08
+       integer errs, ierr, code(2), newerrclass, eclass
+       character*(MPI_MAX_ERROR_STRING) errstring
+       integer rlen, intsize
+       TYPE(MPI_Comm) comm
+       integer buf(10)
+       TYPE(MPI_Win) win
+       external myerrhanfunc
+       TYPE(MPI_Errhandler) myerrhan, qerr
+       integer (kind=MPI_ADDRESS_KIND) asize
+
+       integer callcount, codesSeen(3)
+       common /myerrhan/ callcount, codesSeen
+
+       errs = 0
+       callcount = 0
+       call mtest_init( ierr )
+!
+! Setup some new codes and classes
+       call mpi_add_error_class( newerrclass, ierr )
+       call mpi_add_error_code( newerrclass, code(1), ierr )
+       call mpi_add_error_code( newerrclass, code(2), ierr )
+       call mpi_add_error_string( newerrclass, "New Class", ierr )
+       call mpi_add_error_string( code(1), "First new code", ierr )
+       call mpi_add_error_string( code(2), "Second new code", ierr )
+!
+       call mpi_win_create_errhandler( myerrhanfunc, myerrhan, ierr )
+!
+! Create a new communicator so that we can leave the default errors-abort
+! on MPI_COMM_WORLD.  Use this comm for win_create, just to leave a little
+! more separation from comm_world
+!
+       call mpi_comm_dup( MPI_COMM_WORLD, comm, ierr )
+       call mpi_type_size( MPI_INTEGER, intsize, ierr )
+       asize  = 10 * intsize
+       call mpi_win_create( buf, asize, intsize, MPI_INFO_NULL, &
+      &                      comm, win, ierr )
+!
+       call mpi_win_set_errhandler( win, myerrhan, ierr )
+
+       call mpi_win_get_errhandler( win, qerr, ierr )
+       if (qerr .ne. myerrhan) then
+          errs = errs + 1
+          print *, ' Did not get expected error handler'
+       endif
+       call mpi_errhandler_free( qerr, ierr )
+! We can free our error handler now
+       call mpi_errhandler_free( myerrhan, ierr )
+
+       call mpi_win_call_errhandler( win, newerrclass, ierr )
+       call mpi_win_call_errhandler( win, code(1), ierr )
+       call mpi_win_call_errhandler( win, code(2), ierr )
+
+       if (callcount .ne. 3) then
+          errs = errs + 1
+          print *, ' Expected 3 calls to error handler, found ',  &
+      &             callcount
+       else
+          if (codesSeen(1) .ne. newerrclass) then
+             errs = errs + 1
+             print *, 'Expected class ', newerrclass, ' got ',  &
+      &                codesSeen(1)
+          endif
+          if (codesSeen(2) .ne. code(1)) then
+             errs = errs + 1
+             print *, 'Expected code ', code(1), ' got ',  &
+      &                codesSeen(2)
+          endif
+          if (codesSeen(3) .ne. code(2)) then
+             errs = errs + 1
+             print *, 'Expected code ', code(2), ' got ',  &
+      &                codesSeen(3)
+          endif
+       endif
+
+       call mpi_win_free( win, ierr )
+       call mpi_comm_free( comm, ierr )
+!
+! Check error strings while here here...
+       call mpi_error_string( newerrclass, errstring, rlen, ierr )
+       if (errstring(1:rlen) .ne. "New Class") then
+          errs = errs + 1
+          print *, ' Wrong string for error class: ', errstring(1:rlen)
+       endif
+       call mpi_error_class( code(1), eclass, ierr )
+       if (eclass .ne. newerrclass) then
+          errs = errs + 1
+          print *, ' Class for new code is not correct'
+       endif
+       call mpi_error_string( code(1), errstring, rlen, ierr )
+       if (errstring(1:rlen) .ne. "First new code") then
+          errs = errs + 1
+          print *, ' Wrong string for error code: ', errstring(1:rlen)
+       endif
+       call mpi_error_class( code(2), eclass, ierr )
+       if (eclass .ne. newerrclass) then
+          errs = errs + 1
+          print *, ' Class for new code is not correct'
+       endif
+       call mpi_error_string( code(2), errstring, rlen, ierr )
+       if (errstring(1:rlen) .ne. "Second new code") then
+          errs = errs + 1
+          print *, ' Wrong string for error code: ', errstring(1:rlen)
+       endif
+
+       call mtest_finalize( errs )
+       call mpi_finalize( ierr )
+
+       end
+!
+       subroutine myerrhanfunc( win, errcode )
+       use mpi
+       integer win, errcode
+       integer rlen, ierr
+       integer callcount, codesSeen(3)
+       character*(MPI_MAX_ERROR_STRING) errstring
+       common /myerrhan/ callcount, codesSeen
+
+       callcount = callcount + 1
+! Remember the code we've seen
+       if (callcount .le. 3) then
+          codesSeen(callcount) = errcode
+       endif
+       call mpi_error_string( errcode, errstring, rlen, ierr )
+       if (ierr .ne. MPI_SUCCESS) then
+          print *, ' Panic! could not get error string'
+          call mpi_abort( MPI_COMM_WORLD, 1, ierr )
+       endif
+       end
diff --git a/test/mpi/f08/rma/winfencef08.f90 b/test/mpi/f08/rma/winfencef08.f90
new file mode 100644
index 0000000..44263b8
--- /dev/null
+++ b/test/mpi/f08/rma/winfencef08.f90
@@ -0,0 +1,97 @@
+! This file created from test/mpi/f77/rma/winfencef.f with f77tof90
+! -*- Mode: Fortran; -*-
+!
+!  (C) 2003 by Argonne National Laboratory.
+!      See COPYRIGHT in top-level directory.
+!
+      program main
+      use mpi_f08
+      integer ierr, errs
+      integer intsize
+      TYPE(MPI_Win) win
+      integer left, right, rank, size
+      integer nrows, ncols
+      parameter (nrows=25,ncols=10)
+      integer buf(1:nrows,0:ncols+1)
+      integer ans
+      TYPE(MPI_Comm) comm
+      integer i, j
+      logical mtestGetIntraComm
+! Include addsize defines asize as an address-sized integer
+      integer (kind=MPI_ADDRESS_KIND) asize
+
+
+      errs = 0
+      call mtest_init( ierr )
+
+      call mpi_type_size( MPI_INTEGER, intsize, ierr )
+      do while( mtestGetIntraComm( comm, 2, .false. ) )
+         asize = nrows * (ncols + 2) * intsize
+         call mpi_win_create( buf, asize, intsize * nrows,  &
+      &                        MPI_INFO_NULL, comm, win, ierr )
+
+         call mpi_comm_size( comm, size, ierr )
+         call mpi_comm_rank( comm, rank, ierr )
+         left = rank - 1
+         if (left .lt. 0) then
+            left = MPI_PROC_NULL
+         endif
+         right = rank + 1
+         if (right .ge. size) then
+            right = MPI_PROC_NULL
+         endif
+!
+! Initialize the buffer
+         do i=1,nrows
+            buf(i,0)       = -1
+            buf(i,ncols+1) = -1
+         enddo
+         do j=1,ncols
+            do i=1,nrows
+               buf(i,j) = rank * (ncols * nrows) + i + (j-1) * nrows
+            enddo
+         enddo
+         call mpi_win_fence( MPI_MODE_NOPRECEDE, win, ierr )
+!
+         asize = ncols+1
+         call mpi_put( buf(1,1), nrows, MPI_INTEGER, left, asize,  &
+      &                 nrows, MPI_INTEGER, win, ierr )
+         asize = 0
+         call mpi_put( buf(1,ncols), nrows, MPI_INTEGER, right, asize,  &
+      &                 nrows, MPI_INTEGER, win, ierr )
+!
+         call mpi_win_fence( MPI_MODE_NOSTORE + MPI_MODE_NOPUT +  &
+      &                       MPI_MODE_NOSUCCEED, win, ierr )
+!
+! Check the results
+         if (left .ne. MPI_PROC_NULL) then
+            do i=1, nrows
+               ans = rank * (ncols * nrows) - nrows + i
+               if (buf(i,0) .ne. ans) then
+                  errs = errs + 1
+                  if (errs .le. 10) then
+                     print *, rank, ' buf(',i,',0) = ', buf(i,0), &
+      &                    ' expected', ans
+                  endif
+               endif
+            enddo
+         endif
+         if (right .ne. MPI_PROC_NULL) then
+            do i=1, nrows
+               ans = (rank + 1)* (ncols * nrows) + i
+               if (buf(i,ncols+1) .ne. ans) then
+                  errs = errs + 1
+                  if (errs .le. 10) then
+                     print *, rank, ' buf(',i,',',ncols+1,') = ',  &
+      &                         buf(i,ncols+1), ' expected ', ans
+                  endif
+               endif
+            enddo
+         endif
+         call mpi_win_free( win, ierr )
+         call mtestFreeComm( comm )
+      enddo
+
+      call mtest_finalize( errs )
+      call mpi_finalize( ierr )
+      end
diff --git a/test/mpi/f08/rma/wingetf08.f90 b/test/mpi/f08/rma/wingetf08.f90
new file mode 100644
index 0000000..a920e12
--- /dev/null
+++ b/test/mpi/f08/rma/wingetf08.f90
@@ -0,0 +1,97 @@
+! This file created from test/mpi/f77/rma/wingetf.f with f77tof90
+! -*- Mode: Fortran; -*-
+!
+!  (C) 2003 by Argonne National Laboratory.
+!      See COPYRIGHT in top-level directory.
+!
+      program main
+      use mpi_f08
+      integer ierr, errs
+      integer intsize
+      TYPE(MPI_Win) win
+      integer left, right, rank, size
+      integer nrows, ncols
+      parameter (nrows=25,ncols=10)
+      integer buf(1:nrows,0:ncols+1)
+      integer ans
+      TYPE(MPI_Comm) comm
+      integer i, j
+      logical mtestGetIntraComm
+! Include addsize defines asize as an address-sized integer
+      integer (kind=MPI_ADDRESS_KIND) asize
+
+
+      errs = 0
+      call mtest_init( ierr )
+
+      call mpi_type_size( MPI_INTEGER, intsize, ierr )
+      do while( mtestGetIntraComm( comm, 2, .false. ) )
+         asize = nrows * (ncols + 2) * intsize
+         call mpi_win_create( buf, asize, intsize * nrows,  &
+      &                        MPI_INFO_NULL, comm, win, ierr )
+
+         call mpi_comm_size( comm, size, ierr )
+         call mpi_comm_rank( comm, rank, ierr )
+         left = rank - 1
+         if (left .lt. 0) then
+            left = MPI_PROC_NULL
+         endif
+         right = rank + 1
+         if (right .ge. size) then
+            right = MPI_PROC_NULL
+         endif
+!
+! Initialize the buffer
+         do i=1,nrows
+            buf(i,0)       = -1
+            buf(i,ncols+1) = -1
+         enddo
+         do j=1,ncols
+            do i=1,nrows
+               buf(i,j) = rank * (ncols * nrows) + i + (j-1) * nrows
+            enddo
+         enddo
+         call mpi_win_fence( MPI_MODE_NOPRECEDE, win, ierr )
+!
+         asize = 1
+         call mpi_get( buf(1,ncols+1), nrows, MPI_INTEGER, right, &
+      &                 asize, nrows, MPI_INTEGER, win, ierr )
+         asize = ncols
+         call mpi_get( buf(1,0), nrows, MPI_INTEGER, left,  &
+      &                 asize, nrows, MPI_INTEGER, win, ierr )
+!
+         call mpi_win_fence( MPI_MODE_NOSTORE + MPI_MODE_NOPUT +  &
+      &                       MPI_MODE_NOSUCCEED, win, ierr )
+!
+! Check the results
+         if (left .ne. MPI_PROC_NULL) then
+            do i=1, nrows
+               ans = rank * (ncols * nrows) - nrows + i
+               if (buf(i,0) .ne. ans) then
+                  errs = errs + 1
+                  if (errs .le. 10) then
+                     print *, rank, ' buf(',i,',0) = ', buf(i,0), &
+      &                    ' expected', ans
+                  endif
+               endif
+            enddo
+         endif
+         if (right .ne. MPI_PROC_NULL) then
+            do i=1, nrows
+               ans = (rank + 1)* (ncols * nrows) + i
+               if (buf(i,ncols+1) .ne. ans) then
+                  errs = errs + 1
+                  if (errs .le. 10) then
+                     print *, rank, ' buf(',i,',',ncols+1,') = ',  &
+      &                         buf(i,ncols+1), ' expected ', ans
+                  endif
+               endif
+            enddo
+         endif
+         call mpi_win_free( win, ierr )
+         call mtestFreeComm( comm )
+      enddo
+
+      call mtest_finalize( errs )
+      call mpi_finalize( ierr )
+      end
diff --git a/test/mpi/f08/rma/wingroupf08.f90 b/test/mpi/f08/rma/wingroupf08.f90
new file mode 100644
index 0000000..8007cd8
--- /dev/null
+++ b/test/mpi/f08/rma/wingroupf08.f90
@@ -0,0 +1,45 @@
+! This file created from test/mpi/f77/rma/wingroupf.f with f77tof90
+! -*- Mode: Fortran; -*-
+!
+!  (C) 2003 by Argonne National Laboratory.
+!      See COPYRIGHT in top-level directory.
+!
+      program main
+      use mpi_f08
+      integer ierr, errs
+      integer buf(10)
+      integer result, intsize
+      TYPE(MPI_Win) win
+      TYPE(MPI_Group) group1, group2
+      TYPE(MPI_Comm) comm
+      logical mtestGetIntraComm
+      integer (kind=MPI_ADDRESS_KIND) asize
+
+
+      errs = 0
+      call mtest_init( ierr )
+
+      call mpi_type_size( MPI_INTEGER, intsize, ierr )
+      do while( mtestGetIntraComm( comm, 2, .false. ) )
+         asize = 10
+         call mpi_win_create( buf, asize, intsize,  &
+      &                        MPI_INFO_NULL, comm, win, ierr )
+
+         call mpi_comm_group( comm, group1, ierr )
+         call mpi_win_get_group( win, group2, ierr )
+         call mpi_group_compare( group1, group2, result, ierr )
+         if (result .ne. MPI_IDENT) then
+            errs = errs + 1
+            print *, ' Did not get the ident groups'
+         endif
+         call mpi_group_free( group1, ierr )
+         call mpi_group_free( group2, ierr )
+
+         call mpi_win_free( win, ierr )
+         call mtestFreeComm( comm )
+      enddo
+!
+      call mtest_finalize( errs )
+      call mpi_finalize( ierr )
+
+      end
diff --git a/test/mpi/f08/rma/winnamef08.f90 b/test/mpi/f08/rma/winnamef08.f90
new file mode 100644
index 0000000..92adea3
--- /dev/null
+++ b/test/mpi/f08/rma/winnamef08.f90
@@ -0,0 +1,80 @@
+! This file created from test/mpi/f77/rma/winnamef.f with f77tof90
+! -*- Mode: Fortran; -*-
+!
+!  (C) 2003 by Argonne National Laboratory.
+!      See COPYRIGHT in top-level directory.
+!
+      program main
+      use mpi_f08
+      integer errs, ierr
+      integer rlen, ln
+      TYPE(MPI_Win) win
+      character*(MPI_MAX_OBJECT_NAME) cname
+      integer buf(10)
+      integer intsize
+! Include addsize defines asize as an address-sized integer
+      integer (kind=MPI_ADDRESS_KIND) asize
+
+      logical found
+!
+      errs = 0
+      call mtest_init( ierr )
+!
+! Create a window and get, set the names on it
+!
+      call mpi_type_size( MPI_INTEGER, intsize, ierr )
+      asize = 10
+      call mpi_win_create( buf, asize, intsize,  &
+      &     MPI_INFO_NULL, MPI_COMM_WORLD, win, ierr )
+!
+!     Check that there is no name yet
+      cname = 'XXXXXX'
+      rlen  = -1
+      call mpi_win_get_name( win, cname, rlen, ierr )
+      if (rlen .ne. 0) then
+         errs = errs + 1
+         print *, ' Did not get empty name from new window'
+      else if (cname(1:6) .ne. 'XXXXXX') then
+         found = .false.
+         do ln=MPI_MAX_OBJECT_NAME,1,-1
+            if (cname(ln:ln) .ne. ' ') then
+               found = .true.
+            endif
+         enddo
+         if (found) then
+            errs = errs + 1
+            print *, ' Found a non-empty name'
+         endif
+      endif
+!
+! Now, set a name and check it
+      call mpi_win_set_name( win, 'MyName', ierr )
+      cname = 'XXXXXX'
+      rlen = -1
+      call mpi_win_get_name( win, cname, rlen, ierr )
+      if (rlen .ne. 6) then
+         errs = errs + 1
+         print *, ' Expected 6, got ', rlen, ' for rlen'
+         if (rlen .gt. 0 .and. rlen .lt. MPI_MAX_OBJECT_NAME) then
+            print *, ' Cname = ', cname(1:rlen)
+         endif
+      else if (cname(1:6) .ne. 'MyName') then
+         errs = errs + 1
+         print *, ' Expected MyName, got ', cname(1:6)
+      else
+         found = .false.
+         do ln=MPI_MAX_OBJECT_NAME,7,-1
+            if (cname(ln:ln) .ne. ' ') then
+               found = .true.
+            endif
+         enddo
+         if (found) then
+            errs = errs + 1
+            print *, ' window name is not blank padded'
+         endif
+      endif
+!
+      call mpi_win_free( win, ierr )
+      call mtest_finalize( errs )
+      call mpi_finalize( ierr )
+      end
diff --git a/test/mpi/f08/rma/winscale1f08.f90 b/test/mpi/f08/rma/winscale1f08.f90
new file mode 100644
index 0000000..32debaf
--- /dev/null
+++ b/test/mpi/f08/rma/winscale1f08.f90
@@ -0,0 +1,110 @@
+! This file created from test/mpi/f77/rma/winscale1f.f with f77tof90
+! -*- Mode: Fortran; -*-
+!
+!  (C) 2003 by Argonne National Laboratory.
+!      See COPYRIGHT in top-level directory.
+!
+      program main
+      use mpi_f08
+      integer ierr, errs
+      integer intsize
+      TYPE(MPI_Win) win
+      integer left, right, rank, size
+      integer nrows, ncols
+      parameter (nrows=25,ncols=10)
+      integer buf(1:nrows,0:ncols+1)
+      integer ans
+      TYPE(MPI_Comm) comm
+      TYPE(MPI_Group) group, group2
+      integer nneighbors, nbrs(2), i, j
+      logical mtestGetIntraComm
+! Include addsize defines asize as an address-sized integer
+      integer (kind=MPI_ADDRESS_KIND) asize
+
+
+      errs = 0
+      call mtest_init( ierr )
+
+      call mpi_type_size( MPI_INTEGER, intsize, ierr )
+      do while( mtestGetIntraComm( comm, 2, .false. ) )
+         asize = nrows * (ncols + 2) * intsize
+         call mpi_win_create( buf, asize, intsize * nrows,  &
+      &                        MPI_INFO_NULL, comm, win, ierr )
+
+! Create the group for the neighbors
+         call mpi_comm_size( comm, size, ierr )
+         call mpi_comm_rank( comm, rank, ierr )
+         nneighbors = 0
+         left = rank - 1
+         if (left .lt. 0) then
+            left = MPI_PROC_NULL
+         else
+            nneighbors = nneighbors + 1
+            nbrs(nneighbors) = left
+         endif
+         right = rank + 1
+         if (right .ge. size) then
+            right = MPI_PROC_NULL
+         else
+            nneighbors = nneighbors + 1
+            nbrs(nneighbors) = right
+         endif
+         call mpi_comm_group( comm, group, ierr )
+         call mpi_group_incl( group, nneighbors, nbrs, group2, ierr )
+         call mpi_group_free( group, ierr )
+!
+! Initialize the buffer
+         do i=1,nrows
+            buf(i,0)       = -1
+            buf(i,ncols+1) = -1
+         enddo
+         do j=1,ncols
+            do i=1,nrows
+               buf(i,j) = rank * (ncols * nrows) + i + (j-1) * nrows
+            enddo
+         enddo
+         call mpi_win_post( group2, 0, win, ierr )
+         call mpi_win_start( group2, 0, win, ierr )
+!
+         asize = ncols+1
+         call mpi_put( buf(1,1), nrows, MPI_INTEGER, left, asize,  &
+      &                 nrows, MPI_INTEGER, win, ierr )
+         asize = 0
+         call mpi_put( buf(1,ncols), nrows, MPI_INTEGER, right, asize,  &
+      &                 nrows, MPI_INTEGER, win, ierr )
+!
+         call mpi_win_complete( win, ierr )
+         call mpi_win_wait( win, ierr )
+!
+! Check the results
+         if (left .ne. MPI_PROC_NULL) then
+            do i=1, nrows
+               ans = rank *  (ncols * nrows) - nrows + i
+               if (buf(i,0) .ne. ans) then
+                  errs = errs + 1
+                  if (errs .le. 10) then
+                     print *, ' buf(',i,'0) = ', buf(i,0)
+                  endif
+               endif
+            enddo
+         endif
+         if (right .ne. MPI_PROC_NULL) then
+            do i=1, nrows
+               ans = (rank+1) * (ncols * nrows) +  i
+               if (buf(i,ncols+1) .ne. ans) then
+                  errs = errs + 1
+                  if (errs .le. 10) then
+                     print *, ' buf(',i,',',ncols+1,') = ', &
+      &                          buf(i,ncols+1)
+                  endif
+               endif
+            enddo
+         endif
+         call mpi_group_free( group2, ierr )
+         call mpi_win_free( win, ierr )
+         call mtestFreeComm( comm )
+      enddo
+
+      call mtest_finalize( errs )
+      call mpi_finalize( ierr )
+      end
diff --git a/test/mpi/f08/rma/winscale2f08.f90 b/test/mpi/f08/rma/winscale2f08.f90
new file mode 100644
index 0000000..d193dc8
--- /dev/null
+++ b/test/mpi/f08/rma/winscale2f08.f90
@@ -0,0 +1,115 @@
+! This file created from test/mpi/f77/rma/winscale2f.f with f77tof90
+! -*- Mode: Fortran; -*-
+!
+!  (C) 2003 by Argonne National Laboratory.
+!      See COPYRIGHT in top-level directory.
+!
+      program main
+      use mpi_f08
+      integer ierr, errs
+      integer intsize
+      TYPE(MPI_Win) win
+      integer left, right, rank, size
+      integer nrows, ncols
+      parameter (nrows=25,ncols=10)
+      integer buf(1:nrows,0:ncols+1)
+      integer ans
+      TYPE(MPI_Comm) comm
+      TYPE(MPI_Group) group, group2
+      integer nneighbors, nbrs(2), i, j
+      logical mtestGetIntraComm
+      logical flag
+! Include addsize defines asize as an address-sized integer
+      integer (kind=MPI_ADDRESS_KIND) asize
+
+
+      errs = 0
+      call mtest_init( ierr )
+
+      call mpi_type_size( MPI_INTEGER, intsize, ierr )
+      do while( mtestGetIntraComm( comm, 2, .false. ) )
+         asize = nrows * (ncols + 2) * intsize
+         call mpi_win_create( buf, asize, intsize * nrows,  &
+      &                        MPI_INFO_NULL, comm, win, ierr )
+
+! Create the group for the neighbors
+         call mpi_comm_size( comm, size, ierr )
+         call mpi_comm_rank( comm, rank, ierr )
+         nneighbors = 0
+         left = rank - 1
+         if (left .lt. 0) then
+            left = MPI_PROC_NULL
+         else
+            nneighbors = nneighbors + 1
+            nbrs(nneighbors) = left
+         endif
+         right = rank + 1
+         if (right .ge. size) then
+            right = MPI_PROC_NULL
+         else
+            nneighbors = nneighbors + 1
+            nbrs(nneighbors) = right
+         endif
+         call mpi_comm_group( comm, group, ierr )
+         call mpi_group_incl( group, nneighbors, nbrs, group2, ierr )
+         call mpi_group_free( group, ierr )
+!
+! Initialize the buffer
+         do i=1,nrows
+            buf(i,0)       = -1
+            buf(i,ncols+1) = -1
+         enddo
+         do j=1,ncols
+            do i=1,nrows
+               buf(i,j) = rank * (ncols * nrows) + i + (j-1) * nrows
+            enddo
+         enddo
+         call mpi_win_post( group2, 0, win, ierr )
+         call mpi_win_start( group2, 0, win, ierr )
+!
+         asize = ncols+1
+         call mpi_put( buf(1,1), nrows, MPI_INTEGER, left, asize, &
+      &                 nrows, MPI_INTEGER, win, ierr )
+         asize = 0
+         call mpi_put( buf(1,ncols), nrows, MPI_INTEGER, right, asize,  &
+      &                 nrows, MPI_INTEGER, win, ierr )
+!
+         call mpi_win_complete( win, ierr )
+         flag = .false.
+         do while (.not. flag)
+            call mpi_win_test( win, flag, ierr )
+         enddo
+!
+! Check the results
+         if (left .ne. MPI_PROC_NULL) then
+            do i=1, nrows
+               ans = rank * (ncols * nrows) - nrows + i
+               if (buf(i,0) .ne. ans) then
+                  errs = errs + 1
+                  if (errs .le. 10) then
+                     print *, ' buf(',i,',0) = ', buf(i,0),  &
+      &    'expected ', ans
+                  endif
+               endif
+            enddo
+         endif
+         if (right .ne. MPI_PROC_NULL) then
+            do i=1, nrows
+               ans = (rank+1) * (ncols * nrows) + i
+               if (buf(i,ncols+1) .ne. ans) then
+                  errs = errs + 1
+                  if (errs .le. 10) then
+                     print *, ' buf(',i,',',ncols+1,') = ',  &
+      &                          buf(i,ncols+1), ' expected ', ans
+                  endif
+               endif
+            enddo
+         endif
+         call mpi_group_free( group2, ierr )
+         call mpi_win_free( win, ierr )
+         call mtestFreeComm( comm )
+      enddo
+
+      call mtest_finalize( errs )
+      call mpi_finalize( ierr )
+      end
diff --git a/test/mpi/f08/testlist b/test/mpi/f08/testlist
index 48f969f..fc86c1a 100644
--- a/test/mpi/f08/testlist
+++ b/test/mpi/f08/testlist
@@ -1,2 +1,8 @@
 hello_usempif08 1
 ring_usempif08 4
+attr
+pt2pt
+coll
+datatype
+comm
+rma
diff --git a/test/mpi/f08/util/mtestf08.f90 b/test/mpi/f08/util/mtestf08.f90
index 4158a43..9026e1a 100644
--- a/test/mpi/f08/util/mtestf08.f90
+++ b/test/mpi/f08/util/mtestf08.f90
@@ -39,3 +39,68 @@
            endif
         endif
         end
+!
+! A simple get intracomm for now
+        logical function MTestGetIntracomm( comm, min_size, qsmaller )
+        use mpi_f08
+        integer ierr
+        integer min_size, size, rank
+        TYPE(MPI_Comm) comm
+        logical qsmaller
+        integer myindex
+        save myindex
+        data myindex /0/
+
+        comm = MPI_COMM_NULL
+        if (myindex .eq. 0) then
+           comm = MPI_COMM_WORLD
+        else if (myindex .eq. 1) then
+           call mpi_comm_dup( MPI_COMM_WORLD, comm, ierr )
+        else if (myindex .eq. 2) then
+           call mpi_comm_size( MPI_COMM_WORLD, size, ierr )
+           call mpi_comm_rank( MPI_COMM_WORLD, rank, ierr )
+           call mpi_comm_split( MPI_COMM_WORLD, 0, size - rank, comm,  &
+      &                                 ierr )
+        else
+           if (min_size .eq. 1 .and. myindex .eq. 3) then
+              comm = MPI_COMM_SELF
+           endif
+        endif
+        myindex = mod( myindex, 4 ) + 1
+        MTestGetIntracomm = comm /= MPI_COMM_NULL
+        end
+!
+        subroutine MTestFreeComm( comm )
+        use mpi_f08
+        integer ierr
+        TYPE(MPI_Comm) comm
+        if (comm .ne. MPI_COMM_WORLD .and. &
+      &      comm .ne. MPI_COMM_SELF  .and. &
+      &      comm .ne. MPI_COMM_NULL) then
+           call mpi_comm_free( comm, ierr )
+        endif
+        end
+!
+        subroutine MTestPrintError( errcode )
+        use mpi_f08
+        integer errcode
+        integer errclass, slen, ierr
+        character*(MPI_MAX_ERROR_STRING) string
+
+        call MPI_Error_class( errcode, errclass, ierr )
+        call MPI_Error_string( errcode, string, slen, ierr )
+        print *, "Error class ", errclass, "(", string(1:slen), ")"
+        end
+!
+        subroutine MTestPrintErrorMsg( msg, errcode )
+        use mpi_f08
+        character*(*) msg
+        integer errcode
+        integer errclass, slen, ierr
+        character*(MPI_MAX_ERROR_STRING) string
+
+        call MPI_Error_class( errcode, errclass, ierr )
+        call MPI_Error_string( errcode, string, slen, ierr )
+        print *, msg, ": Error class ", errclass, " &
+      &       (", string(1:slen), ")"
+        end

http://git.mpich.org/mpich.git/commitdiff/8ceb188237d7f0c4a64aba28000b29f092271881

commit 8ceb188237d7f0c4a64aba28000b29f092271881
Author: Ken Raffenetti <raffenet at mcs.anl.gov>
Date:   Mon Apr 7 10:37:19 2014 -0500

    setup framework for Fortran 2008 tests
    
    Adds configure logic and a stub Makefile for Fortran 2008 tests.
    
    No review since F08 binding is experimental now.

diff --git a/test/mpi/Makefile.am b/test/mpi/Makefile.am
index d7ddbb6..d73bdcf 100644
--- a/test/mpi/Makefile.am
+++ b/test/mpi/Makefile.am
@@ -12,7 +12,7 @@ ACLOCAL_AMFLAGS = -I confdb
 
 static_subdirs = util attr basic datatype coll comm errhan group info init \
                  pt2pt rma topo errors manual perf mpi_t impls ckpoint ft
-all_lang_subdirs = f77 cxx f90
+all_lang_subdirs = f77 cxx f90 f08
 
 # DIST_SUBDIRS must be a superset of SUBDIRS, and automake must be able to
 # *statically* compute its contents.  The good news is that we can mostly avoid
diff --git a/test/mpi/Makefile_f08.mtest b/test/mpi/Makefile_f08.mtest
new file mode 100644
index 0000000..1539c61
--- /dev/null
+++ b/test/mpi/Makefile_f08.mtest
@@ -0,0 +1,26 @@
+# -*- Mode: Makefile; -*-
+# vim: set ft=automake :
+#
+# (C) 2014 by Argonne National Laboratory.
+#     See COPYRIGHT in top-level directory.
+#
+
+# these CPPFLAGS are only used when building C/C++ source files, not for actual
+# F08 code itself
+AM_CPPFLAGS = -I$(top_builddir)/include -I$(top_srcdir)/include
+
+LDADD = $(top_builddir)/f08/util/mtestf08.o
+
+# This is right for many platforms, but not all.  The right fix involves a
+# configure test, but this version is no worse than the simplemake version was.
+AM_FFLAGS = -I.
+
+$(top_builddir)/f08/util/mtestf08.o: $(top_srcdir)/f08/util/mtestf08.f90
+	(cd $(top_builddir)/f08/util && $(MAKE) mtestf08.o)
+
+
+testing:
+	$(top_builddir)/runtests -srcdir=$(srcdir) -tests=testlist \
+		-mpiexec=${MPIEXEC} -xmlfile=summary.xml
+
+CLEANFILES = summary.xml summary.tap
diff --git a/test/mpi/configure.ac b/test/mpi/configure.ac
index 6384c32..3f18211 100644
--- a/test/mpi/configure.ac
+++ b/test/mpi/configure.ac
@@ -92,16 +92,18 @@ AC_ARG_ENABLE(echo,
 
 AC_ARG_ENABLE(fortran,
 [  --enable-fortran=option - Control the level of Fortran support in the MPICH implementation.
-        yes|all   - Enable all available Fortran implementations (F77, F90)
+        yes|all   - Enable all available Fortran implementations (F77, F90, F08)
         f77       - Enable Fortran 77 support
         f90       - Enable Fortran 90 support
+        f08       - Enable Fortran 2008 support
         no|none   - No Fortran support
-],,enable_fortran=all)
+],,[enable_fortran=f77,f90])
 
 save_IFS="$IFS"
 IFS=","
 enable_f77=no
 enable_fc=no
+enable_f08=no
 for option in $enable_fortran ; do
     case "$option" in
         yes|all)
@@ -118,6 +120,9 @@ for option in $enable_fortran ; do
         f90)
                 enable_fc=yes
                 ;;
+        f08)
+                enable_f08=yes
+                ;;
         *)
                 IFS="$save_IFS"
                 AC_MSG_WARN([Unknown value $option for --enable-fortran])
@@ -1174,6 +1179,20 @@ elif test "$enable_fc" = yes ; then
 fi
 AM_CONDITIONAL([BUILD_F90_TESTS],[test "X$f90dir" = "f90"])
 
+f08dir="#"
+AC_SUBST(f08dir)
+# Determine if tests for Fortran 2008 should be run.
+if test "$enable_f08" = "yes" ; then
+    otherlangs="$otherlangs f08"
+    f08dir=f08
+elif test "$enable_f08" = "auto" ; then
+    # FIXME add a test to compile a Fortran 2008 MPI program
+    PAC_FC_2008_SUPPORT([
+        otherlangs="$otherlangs f08"
+        f08dir=f08
+    ],[no])
+fi
+
 # Running C++ compiler tests
 PAC_PROG_CXX
 if test "$enable_cxx" = yes ; then
@@ -1534,6 +1553,8 @@ AC_OUTPUT(maint/testmerge \
           f90/io/Makefile \
           f90/misc/Makefile \
 	  f90/profile/Makefile \
+	  f08/Makefile \
+	  f08/util/Makefile \
           cxx/Makefile \
           cxx/util/Makefile \
           cxx/attr/Makefile \
diff --git a/test/mpi/f08/Makefile.am b/test/mpi/f08/Makefile.am
new file mode 100644
index 0000000..1f76bf8
--- /dev/null
+++ b/test/mpi/f08/Makefile.am
@@ -0,0 +1,17 @@
+# -*- Mode: Makefile; -*-
+# vim: set ft=automake :
+#
+# (C) 2014 by Argonne National Laboratory.
+#     See COPYRIGHT in top-level directory.
+#
+
+include $(top_srcdir)/Makefile_f08.mtest
+
+# avoid having to write many "foo_SOURCES = foo.f90" lines
+AM_DEFAULT_SOURCE_EXT = .f90
+
+## for all programs that are just built from the single corresponding source
+## file, we don't need per-target _SOURCES rules, automake will infer them
+## correctly
+noinst_PROGRAMS = hello_usempif08 \
+                  ring_usempif08
diff --git a/test/mpi/f08/hello_usempif08.f90 b/test/mpi/f08/hello_usempif08.f90
new file mode 100644
index 0000000..34103c1
--- /dev/null
+++ b/test/mpi/f08/hello_usempif08.f90
@@ -0,0 +1,29 @@
+! -*- f90 -*-
+!
+! Copyright (c) 2004-2006 The Trustees of Indiana University and Indiana
+!                         University Research and Technology
+!                         Corporation.  All rights reserved.
+! Copyright (c) 2004-2005 The Regents of the University of California.
+!                         All rights reserved.
+! Copyright (c) 2006-2012 Cisco Systems, Inc.  All rights reserved.
+! Copyright (c) 2009-2012 Los Alamos National Security, LLC.
+!                         All rights reserved.
+! $COPYRIGHT$
+!
+! Sample MPI "hello world" application using the MPI-3 mpi_f08 module.
+!
+program main
+    use mpi_f08
+    implicit none
+    integer :: rank, size, len
+    character(len=MPI_MAX_LIBRARY_VERSION_STRING) :: version
+
+    call MPI_INIT()
+    call MPI_COMM_RANK(MPI_COMM_WORLD, rank)
+    call MPI_COMM_SIZE(MPI_COMM_WORLD, size)
+    call MPI_GET_LIBRARY_VERSION(version, len)
+
+    print *, ' No Errors'
+
+    call MPI_FINALIZE()
+end
diff --git a/test/mpi/f08/ring_usempif08.f90 b/test/mpi/f08/ring_usempif08.f90
new file mode 100644
index 0000000..186050d
--- /dev/null
+++ b/test/mpi/f08/ring_usempif08.f90
@@ -0,0 +1,76 @@
+! -*- f90 -*-
+!
+! Copyright (c) 2004-2006 The Trustees of Indiana University and Indiana
+!                         University Research and Technology
+!                         Corporation.  All rights reserved.
+! Copyright (c) 2006-2012 Cisco Systems, Inc.  All rights reserved.
+! Copyright (c) 2009-2012 Los Alamos National Security, LLC.
+!                         All rights reserved.
+! $COPYRIGHT$
+!
+! Simple ring test program using the MPI-3 mpi_f08 module.
+!
+program ring
+  use mpi_f08
+  implicit none
+  integer :: rank, size, tag, next, from, i, message
+
+
+! Start up MPI
+
+  call MPI_INIT()
+  call MPI_COMM_RANK(MPI_COMM_WORLD, rank)
+  call MPI_COMM_SIZE(MPI_COMM_WORLD, size)
+
+! Calculate the rank of the next process in the ring.  Use the modulus
+! operator so that the last process "wraps around" to rank zero.
+
+  tag = 201
+  next = mod((rank + 1), size)
+  from = mod((rank + size - 1), size)
+
+! If we are the "master" process (i.e., MPI_COMM_WORLD rank 0), put
+! the number of times to go around the ring in the message.
+
+  if (rank .eq. 0) then
+     message = 10
+
+     call MPI_SEND(message, 1, MPI_INTEGER, next, tag, MPI_COMM_WORLD)
+  endif
+
+! Pass the message around the ring.  The exit mechanism works as
+! follows: the message (a positive integer) is passed around the ring.
+! Each time it passes rank 0, it is decremented.  When each processes
+! receives a message containing a 0 value, it passes the message on to
+! the next process and then quits.  By passing the 0 message first,
+! every process gets the 0 message and can quit normally.
+
+   i = 1
+10 call MPI_Recv(message, i, MPI_INTEGER, from, tag, MPI_COMM_WORLD, &
+                 MPI_STATUS_IGNORE)
+
+  if (rank .eq. 0) then
+     message = message - 1
+  endif
+
+  call MPI_SEND(message, 1, MPI_INTEGER, next, tag, MPI_COMM_WORLD)
+
+  if (message .eq. 0) then
+     goto 20
+  endif
+  goto 10
+
+! The last process does one extra send to process 0, which needs to be
+! received before the program can exit
+
+ 20 if (rank .eq. 0) then
+     call MPI_RECV(message, 1, MPI_INTEGER, from, tag, MPI_COMM_WORLD, &
+                   MPI_STATUS_IGNORE)
+
+     print *, ' No Errors'
+  endif
+
+! All done
+
+  call MPI_FINALIZE()
+end program
diff --git a/test/mpi/f08/testlist b/test/mpi/f08/testlist
new file mode 100644
index 0000000..48f969f
--- /dev/null
+++ b/test/mpi/f08/testlist
@@ -0,0 +1,2 @@
+hello_usempif08 1
+ring_usempif08 4
diff --git a/test/mpi/f08/util/Makefile.am b/test/mpi/f08/util/Makefile.am
new file mode 100644
index 0000000..bd9b71c
--- /dev/null
+++ b/test/mpi/f08/util/Makefile.am
@@ -0,0 +1,13 @@
+## -*- Mode: Makefile; -*-
+## vim: set ft=automake :
+##
+## (C) 2014 by Argonne National Laboratory.
+##     See COPYRIGHT in top-level directory.
+##
+
+## list a dummy library that we don't actually build in order to cause automake
+## to emit a rule for building mtestf08.o from mtestf08.f90
+EXTRA_LIBRARIES = libmtest_dummy.a
+libmtest_dummy_a_SOURCES = mtestf08.f90
+
+all-local: mtestf08.$(OBJEXT)
diff --git a/test/mpi/f08/util/mtestf08.f90 b/test/mpi/f08/util/mtestf08.f90
new file mode 100644
index 0000000..4158a43
--- /dev/null
+++ b/test/mpi/f08/util/mtestf08.f90
@@ -0,0 +1,41 @@
+! -*- Mode: Fortran; -*-
+!
+!  (C) 2014 by Argonne National Laboratory.
+!      See COPYRIGHT in top-level directory.
+!
+        subroutine MTest_Init( ierr )
+
+        use mpi_f08
+        integer ierr
+        logical flag
+        logical dbgflag
+        integer wrank
+        common /mtest/ dbgflag, wrank
+
+        call MPI_Initialized( flag, ierr )
+        if (.not. flag) then
+           call MPI_Init( ierr )
+        endif
+
+        dbgflag = .false.
+        call MPI_Comm_rank( MPI_COMM_WORLD, wrank, ierr )
+        end
+!
+        subroutine MTest_Finalize( errs )
+        use mpi
+        integer errs
+        integer rank, toterrs, ierr
+
+        call MPI_Comm_rank( MPI_COMM_WORLD, rank, ierr )
+
+        call MPI_Allreduce( errs, toterrs, 1, MPI_INTEGER, MPI_SUM,  &
+      &        MPI_COMM_WORLD, ierr )
+
+        if (rank .eq. 0) then
+           if (toterrs .gt. 0) then
+                print *, " Found ", toterrs, " errors"
+           else
+                print *, " No Errors"
+           endif
+        endif
+        end
diff --git a/test/mpi/testlist.in b/test/mpi/testlist.in
index f84f2ba..c63bb2f 100644
--- a/test/mpi/testlist.in
+++ b/test/mpi/testlist.in
@@ -19,6 +19,7 @@ topo
 @f77dir@
 @cxxdir@
 @f90dir@
+ at f08dir@
 @errordir@
 @threadsdir@
 @ckpointdir@

http://git.mpich.org/mpich.git/commitdiff/eb69afdce56750bf79eeaef3dfcce0eabd42a9a2

commit eb69afdce56750bf79eeaef3dfcce0eabd42a9a2
Author: Junchao Zhang <jczhang at mcs.anl.gov>
Date:   Mon Apr 14 21:34:14 2014 -0500

    Update .gitignore to skip autogenerated files
    
    No review since F08 binding is experimental now.

diff --git a/.gitignore b/.gitignore
index 18697d1..9712189 100644
--- a/.gitignore
+++ b/.gitignore
@@ -214,6 +214,7 @@ Makefile.am-stamp
 /maint/Version
 /src/binding/fortran/mpif_h/Makefile.mk
 /src/binding/fortran/use_mpi/Makefile.mk
+/src/binding/fortran/use_mpi_f08/Makefile.mk
 
 # MPICH2 parameter handling
 /src/include/mpich_cvars.h
@@ -428,6 +429,16 @@ Makefile.am-stamp
 /src/binding/fortran/use_mpi/typef90cmplxf.c
 /src/binding/fortran/use_mpi/mpifnoext.h
 
+# /src/binding/fortran/use_mpi_f08
+/src/binding/fortran/use_mpi_f08/pmpi_f08.F90
+
+/src/binding/fortran/use_mpi_f08/wrappers_f/profiling/*.F90
+
+/src/binding/fortran/use_mpi_f08/wrappers_c/cdesc.c
+/src/binding/fortran/use_mpi_f08/wrappers_c/cdesc.h
+/src/binding/fortran/use_mpi_f08/wrappers_c/Makefile.mk
+/src/binding/fortran/use_mpi_f08/wrappers_c/*_cdesc.c
+
 # /src/env/
 /src/env/mpicc
 /src/env/mpicc.sh

http://git.mpich.org/mpich.git/commitdiff/b7cd3b72bb2e888775ac71d8fd5e3e830c216c45

commit b7cd3b72bb2e888775ac71d8fd5e3e830c216c45
Author: Junchao Zhang <jczhang at mcs.anl.gov>
Date:   Fri Apr 18 15:21:12 2014 -0500

    Update the build system to include F08 binding
    
    This includes a configure test to check if the compiler supports F08.
    
    No review since F08 binding is experimental now.

diff --git a/Makefile.am b/Makefile.am
index 4d206a6..4f0e7af 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -134,6 +134,7 @@ endif BUILD_F77_BINDING
 mpi_sources =
 mpi_f77_sources =
 mpi_fc_sources =
+mpi_f08_sources =
 mpi_cxx_sources =
 mpi_core_sources =
 
@@ -179,6 +180,9 @@ lib_lib at MPIFCLIBNAME@_la_SOURCES = $(mpi_f77_sources)
 if BUILD_FC_BINDING
 lib_lib at MPIFCLIBNAME@_la_SOURCES += $(mpi_fc_sources)
 endif BUILD_FC_BINDING
+if BUILD_F08_BINDING
+lib_lib at MPIFCLIBNAME@_la_SOURCES += $(mpi_f08_sources)
+endif BUILD_F08_BINDING
 lib_lib at MPIFCLIBNAME@_la_LDFLAGS = $(ABIVERSIONFLAGS)
 lib_lib at MPIFCLIBNAME@_la_LIBADD = lib/lib at MPILIBNAME@.la
 endif BUILD_F77_BINDING
diff --git a/autogen.sh b/autogen.sh
index e66a7ea..e61ee97 100755
--- a/autogen.sh
+++ b/autogen.sh
@@ -685,7 +685,11 @@ if [ $do_bindings = "yes" ] ; then
         elif find src/binding/fortran/use_mpi -name 'buildiface' -newer 'src/binding/fortran/use_mpi/mpi_base.f90' >/dev/null 2>&1 ; then
 	    build_f90=yes
         fi
- 
+        if [ ! -s src/binding/fortran/use_mpi_f08/wrappers_c/cdesc.c ] ; then
+	    build_f08=yes
+        elif find src/binding/fortran/use_mpi_f08 -name 'buildiface' -newer 'src/binding/fortran/use_mpi_f08/wrappers_c/cdesc.c' >/dev/null 2>&1 ; then
+	    build_f08=yes
+        fi
     fi
 
     if [ $build_f77 = "yes" ] ; then
@@ -702,6 +706,18 @@ if [ $do_bindings = "yes" ] ; then
 	( cd src/binding/fortran/use_mpi && ../mpif_h/buildiface -infile=cf90t.h -deffile=cf90tdefs)
 	echo "done"
     fi
+    if [ $build_f08 = "yes" ] ; then
+	echo_n "Building Fortran 08 interface... "
+	# Top-level files
+	( cd src/binding/fortran/use_mpi_f08 && chmod a+x ./buildiface && ./buildiface )
+        # Delete the old Makefile.mk
+        ( rm -f src/binding/fortran/use_mpi_f08/wrappers_c/Makefile.mk )
+        # Execute once for mpi.h.in ...
+	( cd src/binding/fortran/use_mpi_f08/wrappers_c && chmod a+x ./buildiface && ./buildiface ../../../../include/mpi.h.in )
+        # ... and once for mpio.h.in
+	( cd src/binding/fortran/use_mpi_f08/wrappers_c && chmod a+x ./buildiface && ./buildiface ../../../../mpi/romio/include/mpio.h.in )
+	echo "done"
+    fi
 
     if [ ! -s src/binding/cxx/mpicxx.h ] ; then 
 	build_cxx=yes
diff --git a/confdb/aclocal_fc.m4 b/confdb/aclocal_fc.m4
index e4e522a..1adcf2b 100644
--- a/confdb/aclocal_fc.m4
+++ b/confdb/aclocal_fc.m4
@@ -1117,3 +1117,100 @@ if test "$pac_ccompile_ok" = "yes" ; then
     rm -f pac_conftest.$OBJEXT
 fi
 ])
+
+
+AC_DEFUN([PAC_FC_2008_SUPPORT],[
+AC_MSG_CHECKING([for Fortran 2008 support])
+
+AC_LANG_PUSH([C])
+f08_works=yes
+AC_COMPILE_IFELSE([
+	AC_LANG_SOURCE(
+[[
+#include <ISO_Fortran_binding.h>
+]],
+[[
+int foo_c(CFI_cdesc_t * a_desc, CFI_cdesc_t * b_desc)
+{
+	char * a_row = (char*) a_desc->base_addr;
+	if (a_desc->type != CFI_type_int) { return 1; }
+	if (a_desc->rank != 2) { return 2; }
+	if (a_desc->dim[1].extent != b_desc->dim[0].extent) { return 3; }
+	return 0;
+}
+]])],[mv conftest.$OBJEXT conftest1.$OBJEXT],[f08_works=no])
+AC_LANG_POP([C])
+
+AC_LANG_PUSH([Fortran])
+PAC_PUSH_FLAG([LIBS])
+LIBS="conftest1.$OBJEXT $LIBS"
+AC_LINK_IFELSE([
+    AC_LANG_SOURCE([
+MODULE F08TS_MODULE
+IMPLICIT NONE
+
+! Test public, private, protected
+REAL, PUBLIC       :: x
+REAL, PRIVATE      :: y
+LOGICAL, PROTECTED :: z
+
+! Test abstract
+ABSTRACT INTERFACE
+    SUBROUTINE user_func(x, y)
+        INTEGER  :: x(*)
+        REAL     :: y
+    END SUBROUTINE
+END INTERFACE
+
+! Test TS 29113 assumed type , assumed rank and bind(C)
+INTERFACE
+    FUNCTION FOO(A, B, C) &
+        BIND(C,name="foo_c") RESULT(err)
+        USE, intrinsic :: iso_c_binding, ONLY : c_int
+        TYPE(*), DIMENSION(..) :: A, B, C
+        INTEGER(c_int) :: err
+    END FUNCTION FOO
+END INTERFACE
+
+CONTAINS
+
+! Test TS 29113 asychronous attribute and optional
+SUBROUTINE test1(buf, count, ierr)
+    INTEGER, ASYNCHRONOUS :: buf(*)
+    INTEGER               :: count
+    INTEGER, OPTIONAL     :: ierr
+END SUBROUTINE
+
+! Test procedure
+SUBROUTINE test2(func)
+    PROCEDURE(user_func)  :: func
+END SUBROUTINE
+
+END MODULE
+
+!==============================================
+PROGRAM MAIN
+USE :: F08TS_MODULE, ONLY : FOO
+IMPLICIT NONE
+
+INTEGER, DIMENSION(4,4) :: A, B
+INTEGER, DIMENSION(2,2) :: C
+INTEGER                 :: ERRCODE
+
+! Test contiguous and non-contiguous array section passing
+! and linkage with C code
+ERRCODE = FOO(A(1:4:2, :), B(:, 2:4:2), C)
+
+END PROGRAM
+    ])],[],[f08_works=no])
+PAC_POP_FLAG([LIBS])
+AC_LANG_POP([Fortran])
+
+if test "$f08_works" = "yes" ; then
+   $1
+else
+   $2
+fi
+rm -f conftest1.$OBJEXT
+AC_MSG_RESULT([$f08_works])
+])
diff --git a/configure.ac b/configure.ac
index daa7abf..6991fe6 100644
--- a/configure.ac
+++ b/configure.ac
@@ -413,11 +413,12 @@ dnl We enable f77 and fc if we can find compilers for them.
 dnl In addition, we check whether f77 and fc can work together.
 AC_ARG_ENABLE(fortran,
 [  --enable-fortran=option - Control the level of Fortran support in the MPICH implementation.
-	yes|all   - Enable all available Fortran implementations (F77, F90)
+	yes|all   - Enable all available Fortran implementations (F77, F90, F08)
 	f77       - Enable Fortran 77 support
 	f90       - Enable Fortran 90 support
+	f08       - Enable Fortran 2008 support
 	no|none   - No Fortran support
-],,enable_fortran=all)
+],,[enable_fortran=f77,f90])
 
 AC_ARG_ENABLE(f77,
 	AC_HELP_STRING([--enable-f77],
@@ -674,6 +675,7 @@ save_IFS="$IFS"
 IFS=","
 enable_f77=no
 enable_fc=no
+enable_f08=no
 for option in $enable_fortran ; do
     case "$option" in
         yes|all)
@@ -690,6 +692,9 @@ for option in $enable_fortran ; do
         f90)
 		enable_fc=yes
 		;;
+        f08)
+		enable_f08=yes
+		;;
         *)
 		IFS="$save_IFS"
 		AC_MSG_WARN([Unknown value $option for --enable-fortran])
@@ -2167,6 +2172,7 @@ includebuild_dir=$includebuild_dir
 libbuild_dir=$libbuild_dir
 bashWorks=$bashWorks)
 
+f08_works=no
 if test "$enable_fc" = "yes" ; then
     if test "$enable_f77" != "yes" ; then
         AC_MSG_WARN([Fortran 90 requires Fortran 77])
@@ -2174,8 +2180,15 @@ if test "$enable_fc" = "yes" ; then
     else 
         bindingsubsystems="$bindingsubsystems src/binding/fortran/use_mpi"
         bindings="$bindings f90"
+
+	if test "$enable_f08" = "yes" ; then
+	   f08_works=yes
+	elif test "$enable_f08" = "auto" ; then
+	   PAC_FC_2008_SUPPORT([f08_works=yes],[f08_works=no])
+	fi
     fi
 fi
+AM_CONDITIONAL([BUILD_F08_BINDING], [test "$f08_works" = "yes"])
 
 if test -n "$f08_works" ; then
     status_f08_works=1
diff --git a/src/binding/fortran/use_mpi_f08/buildiface b/src/binding/fortran/use_mpi_f08/buildiface
index bc2fee2..4e8c16f 100755
--- a/src/binding/fortran/use_mpi_f08/buildiface
+++ b/src/binding/fortran/use_mpi_f08/buildiface
@@ -89,24 +89,15 @@ print $makefile_fh  <<EOT;
 #  This file is created by script $cur_dir/buildiface
 
 # ensure that the buildiface script ends up in the release tarball
-
-MOD = \@FCMODEXT\@
-
 EXTRA_DIST += $cur_dir/buildiface
 
-mpi_f08_module_sources =
-mpi_c_interface_sources =
-mpi_f08_wrappers_f_sources =
-pmpi_f08_wrappers_f_sources =
-mpi_f08_modules =
-
 if BUILD_F08_BINDING
 
 EOT
 
 print $makefile_fh "AM_FCFLAGS += \@FCINCFLAG\@$cur_dir\n\n";
 
-print $makefile_fh "mpi_f08_module_sources += \\\n";
+print $makefile_fh "mpi_f08_sources += \\\n";
 @files = glob("*mpi_f08*.F90");
 for (my $i=0; $i<=$#files; $i++) {
     print $makefile_fh "\t$cur_dir/$files[$i]";
@@ -117,7 +108,7 @@ for (my $i=0; $i<=$#files; $i++) {
     }
 }
 
-print $makefile_fh "mpi_f08_modules += \\\n";
+print $makefile_fh "mpi_f08_sources += \\\n";
 @files = glob("*mpi_f08*.F90");
 for (my $i=0; $i<=$#files; $i++) {
     my $file = $files[$i];
@@ -129,33 +120,27 @@ for (my $i=0; $i<=$#files; $i++) {
 
 print $makefile_fh "modinc_HEADERS = \$(mpi_f08_modules)\n\n";
 
-print $makefile_fh "mpi_c_interface_sources += \\\n";
+print $makefile_fh "mpi_f08_sources += \\\n";
 @files = glob("mpi_c_interface_*.F90");
 for (my $i=0; $i<=$#files; $i++) {
     print $makefile_fh "\t$cur_dir/$files[$i]";
     if ($i != $#files) { print $makefile_fh " \\\n"; } else { print $makefile_fh "\n\n"; }
 }
 
-print $makefile_fh "mpi_f08_wrappers_f_sources += \\\n";
+print $makefile_fh "mpi_f08_sources += \\\n";
 @files = glob("$wrappers_f_dir/*.F90");
 for (my $i=0; $i<=$#files; $i++) {
     print $makefile_fh "\t$cur_dir/$files[$i]";
     if ($i != $#files) { print $makefile_fh " \\\n"; } else { print $makefile_fh "\n\n"; }
 }
 
-print $makefile_fh "pmpi_f08_wrappers_f_sources += \\\n";
+print $makefile_fh "mpi_core_sources += \\\n";
 @files = glob("$pmpi_dir/*.F90");
 for (my $i=0; $i<=$#files; $i++) {
     print $makefile_fh "\t$cur_dir/$files[$i]";
     if ($i != $#files) { print $makefile_fh " \\\n"; } else { print $makefile_fh "\n\n"; }
 }
 
-print $makefile_fh "lib_lib\@MPILIBNAME\@_la_SOURCES += \\
-    \$(mpi_f08_module_sources) \\
-    \$(mpi_c_interface_sources) \\
-    \$(mpi_f08_wrappers_f_sources) \\
-    \$(pmpi_f08_wrappers_f_sources)\n\n";
-
 print $makefile_fh "include \$(top_srcdir)/src/binding/fortran/use_mpi_f08/wrappers_c/Makefile.mk\n\n";
 
 print $makefile_fh "endif BUILD_F08_BINDING\n";
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_c/buildiface b/src/binding/fortran/use_mpi_f08/wrappers_c/buildiface
index b29e5d3..f3b3f1a 100755
--- a/src/binding/fortran/use_mpi_f08/wrappers_c/buildiface
+++ b/src/binding/fortran/use_mpi_f08/wrappers_c/buildiface
@@ -42,6 +42,7 @@ my @argbits;
 my $num_dtypes;
 my @dtype_bind;
 my $io_header;
+my $make_exists = 0;
 
 my %inplace = ('MPI_Allgather' => 0,
 	       'MPI_Allgatherv' => 0,
@@ -162,8 +163,9 @@ int cdesc_create_dtype(CFI_cdesc_t *cdesc, MPI_Datatype oldtype, MPI_Datatype *n
 EOT
 close OUTFD;
 
-open(MAKEFD, ">Makefile.mk") || die "Could not open Makefile.mk\n";
-print MAKEFD <<EOT;
+unless (-e "Makefile.mk") {
+    open(MAKEFD, ">Makefile.mk") || die "Could not open Makefile.mk\n";
+    print MAKEFD <<EOT;
 ## DO NOT EDIT
 ## This file created by buildiface
 ##
@@ -172,10 +174,13 @@ print MAKEFD <<EOT;
 # ensure that the buildiface script ends up in the release tarball
 EXTRA_DIST += src/binding/fortran/use_mpi_f08/wrappers_c/buildiface
 
-mpi_f08_sources =
 if BUILD_F08_BINDING
 mpi_f08_sources += \\
 EOT
+} else {
+    open(MAKEFD, ">>Makefile.mk") || die "Could not open Makefile.mk\n";
+    $make_exists = 1;
+}
 
 # if the Nth datatype does not correspond to the Nth void* buffer, set
 # the correct binding here.  A value of "2:4" means that the first

http://git.mpich.org/mpich.git/commitdiff/5633c4a247d4ea95bc9bb22fff741adb2774d768

commit 5633c4a247d4ea95bc9bb22fff741adb2774d768
Author: Junchao Zhang <jczhang at mcs.anl.gov>
Date:   Sat Apr 19 15:14:21 2014 -0500

    Add a script use_mpi_f08/wrappers_c/buildiface
    
    This script is used to generate C wrapper files
    
    No review since F08 binding is experimental now.

diff --git a/src/binding/fortran/use_mpi_f08/wrappers_c/buildiface b/src/binding/fortran/use_mpi_f08/wrappers_c/buildiface
new file mode 100755
index 0000000..b29e5d3
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_c/buildiface
@@ -0,0 +1,522 @@
+#! /usr/bin/env perl
+#
+# (C) 2014 by Argonne National Laboratory.
+#     See COPYRIGHT in top-level directory.
+#
+
+use warnings;
+use strict;
+
+# Change this to be an argument that passed in on the command line
+# For all of the MPIO functions, we should surround the functions with
+# #ifdef MPI_MODE_RDONLY
+#    ...
+# #else
+#    ierr = MPI_ERR_INTER`
+# #endif
+
+# Check to make sure the file was passed in as a parameter
+if ($#ARGV != 0) {
+    print "Usage: buildiface <filename>\n";
+    exit 1;
+}
+
+open(FD, $ARGV[0]) || die "Could not open file " . $ARGV[0];
+
+while (<FD>) {
+    if (/\/\*\s*Begin Prototypes/) { last; }
+}
+
+my $eol = 1;
+my $fullline = "";
+my $tab = "    ";
+my $retarg;
+my $routine;
+my $args;
+my @arglist;
+my $fname;
+my $cdesc_routine;
+my $x;
+my $y;
+my @argbits;
+my $num_dtypes;
+my @dtype_bind;
+my $io_header;
+
+my %inplace = ('MPI_Allgather' => 0,
+	       'MPI_Allgatherv' => 0,
+	       'MPI_Allreduce' => 0,
+	       'MPI_Alltoall' => 0,
+	       'MPI_Alltoallv' => 0,
+	       'MPI_Alltoallw' => 0,
+	       'MPI_Exscan' => 0,
+	       'MPI_Gather' => 0,
+	       'MPI_Gatherv' => 0,
+	       'MPI_Iallgather' => 0,
+	       'MPI_Iallgatherv' => 0,
+	       'MPI_Iallreduce' => 0,
+	       'MPI_Ialltoall' => 0,
+	       'MPI_Ialltoallv' => 0,
+	       'MPI_Ialltoallw' => 0,
+	       'MPI_Igather' => 0,
+	       'MPI_Igatherv' => 0,
+	       'MPI_Ireduce_scatter_block' => 0,
+	       'MPI_Ireduce_scatter' => 0,
+	       'MPI_Ireduce' => 0,
+	       'MPI_Iscan' => 0,
+	       'MPI_Iscatter' => 3,
+	       'MPI_Iscatterv' => 4,
+	       'MPI_Reduce_scatter' => 0,
+	       'MPI_Reduce_scatter_block' => 0,
+	       'MPI_Reduce' => 0,
+	       'MPI_Scan' => 0,
+	       'MPI_Scatter' => 3,
+	       'MPI_Scatterv' => 4);
+
+# Check to see if this is mpio.h.in. If so, we have some more to do later
+if ($ARGV[0] =~ /mpio\.h\.in/) {
+    $io_header = 1;
+} else {
+    $io_header = 0;
+}
+
+if (-e "cdesc.h") {
+    open(CDESCH, ">>cdesc.h") || die "Could not open file cdesc.h";
+} else {
+    open(CDESCH, ">cdesc.h") || die "Could not open file cdesc.h";
+    print CDESCH <<EOT;
+/* -*- Mode: C; c-basic-offset:4 ; -*- */
+/*
+ *  (C) 2014 by Argonne National Laboratory.
+ *      See COPYRIGHT in top-level directory.
+ *
+ * This file is automatically generated by buildiface
+ * DO NOT EDIT
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <ISO_Fortran_binding.h>
+#include <mpi.h>
+
+extern int cdesc_create_dtype(CFI_cdesc_t *cdesc, MPI_Datatype oldtype, MPI_Datatype *newtype);
+extern int MPIR_Fortran_array_of_string_f2c(const char* strs_f, char*** strs_c, int str_len, int know_size, int size);
+extern int MPIR_Comm_spawn_c(const char *command, char *argv_f, int maxprocs, MPI_Info info, int root,
+        MPI_Comm comm, MPI_Comm *intercomm, int* array_of_errcodes, int argv_elem_len);
+extern int MPIR_Comm_spawn_multiple_c(int count, char *array_of_commands_f,
+        char **array_of_argv_f, const int* array_of_maxprocs,
+        const MPI_Info *array_of_info, int root, MPI_Comm comm,
+        MPI_Comm *intercomm, int* array_of_errcodes,
+        int commands_elem_len, int argv_elem_len);
+extern int MPIR_F_sync_reg_cdesc(CFI_cdesc_t* buf);
+
+EOT
+}
+
+open(OUTFD, ">cdesc.c") || die "Could not open file cdesc.c";
+print OUTFD <<EOT;
+/* -*- Mode: C; c-basic-offset:4 ; -*- */
+/*
+ *  (C) 2014 by Argonne National Laboratory.
+ *      See COPYRIGHT in top-level directory.
+ *
+ * This file is automatically generated by buildiface
+ * DO NOT EDIT
+ */
+
+#include "cdesc.h"
+
+int cdesc_create_dtype(CFI_cdesc_t *cdesc, MPI_Datatype oldtype, MPI_Datatype *newtype)
+{
+    MPI_Datatype *types;
+    int i, err = MPI_SUCCESS;
+
+    types = malloc(cdesc->rank * sizeof(MPI_Datatype));
+    for (i = 0; i < cdesc->rank; i++) {
+        if (cdesc->dim[i].sm == cdesc->elem_len) {
+            err = MPI_Type_contiguous(cdesc->dim[i].extent, i == 0 ? oldtype : types[i-1], &types[i]);
+            if (err)
+                return err;
+        }
+        else {
+            err = MPI_Type_create_hvector(cdesc->dim[i].extent, 1, cdesc->dim[i].sm, i == 0 ? oldtype : types[i-1],
+                                          &types[i]);
+            if (err)
+                return err;
+        }
+        err = MPI_Type_commit(&types[i]);
+        if (err)
+            return err;
+    }
+
+    err = MPI_Type_dup(types[cdesc->rank-1], newtype);
+    if (err)
+        return err;
+
+    for (i = 0; i < cdesc->rank; i++)
+        MPI_Type_free(&types[i]);
+    free(types);
+
+    return err;
+}
+EOT
+close OUTFD;
+
+open(MAKEFD, ">Makefile.mk") || die "Could not open Makefile.mk\n";
+print MAKEFD <<EOT;
+## DO NOT EDIT
+## This file created by buildiface
+##
+## vim: set ft=automake :
+
+# ensure that the buildiface script ends up in the release tarball
+EXTRA_DIST += src/binding/fortran/use_mpi_f08/wrappers_c/buildiface
+
+mpi_f08_sources =
+if BUILD_F08_BINDING
+mpi_f08_sources += \\
+EOT
+
+# if the Nth datatype does not correspond to the Nth void* buffer, set
+# the correct binding here.  A value of "2:4" means that the first
+# datatype corresponds to the 2nd void* buffer and the second datatype
+# corresponds to the 4th void* buffer.  There must not exist a third
+# datatype.
+my %dtype_bindings = (
+    'MPI_Unpack' => '2',
+    'MPI_Unpack_external' => '2',
+    );
+
+while (<FD>) {
+    if (/\/\*\s*End Prototypes/) { last; }
+
+    if (/\/\*\s*Begin Skip Prototypes/) {
+        while (<FD>) {
+            if (/\/\*\s*End Skip Prototypes/) { last; }
+        }
+    }
+
+    # If we found a semi-colon at the end, that's the end of the line.
+    # This is not perfect (e.g., does not work when a single line has
+    # multiple semi-colon separated statements), but should be good
+    # enough for the MPICH mpi.h file
+    if (/.*;$/) { $eol = 1; }
+    else { $eol = 0; }
+
+    chomp($_);
+    $fullline .= "$_";
+    if ($eol == 0) { next; }
+
+    # We got the entire prototype in a single line
+
+    # parse out comments
+    $fullline =~ s+/\*.*\*/++g;
+
+    # parse out attributes
+    $fullline =~ s/MPICH_ATTR_WEAK_ALIAS\(.*\)//g;
+    $fullline =~ s/MPICH_ATTR_POINTER_WITH_TYPE_TAG\(.*\)//g;
+
+    # parse out unnecessary spaces
+    $fullline =~ s/^ *//g;
+    $fullline =~ s/ *$//g;
+
+    # split the line into the return type, routine name, and arguments
+    $fullline =~ m/([^ ]*) ([^(]*)\((.*)\)/;
+    $retarg = $1;
+    $routine = $2;
+    $args = $3;
+
+    # cleanup args
+    $args =~ s/\s\s*/ /g;
+    $args =~ s/^\s*//g;
+    $args =~ s/\s*$//g;
+
+    # the following routines are ignored:
+
+    # Having void * arguments but they are not choice buffer
+    if (($routine eq "MPI_Grequest_start")
+        || ($routine eq "MPI_Comm_create_keyval")
+        || ($routine eq "MPI_Comm_set_attr")
+        || ($routine eq "MPI_Comm_get_attr")
+        || ($routine eq "MPI_Type_create_keyval")
+        || ($routine eq "MPI_Type_set_attr")
+        || ($routine eq "MPI_Type_get_attr")
+        || ($routine eq "MPI_Win_create_keyval")
+        || ($routine eq "MPI_Win_set_attr")
+        || ($routine eq "MPI_Win_get_attr")
+        ) {
+        $fullline = "";
+        next;
+    }
+
+    #
+    # FIXME: Alltoallw takes an array of datatypes; we need better
+    # logic to create such an array for derived datatypes
+
+    # Temporarily enabled since no non-contig subarray is supported
+    #if (($routine eq "MPI_Alltoallw")
+    #    || ($routine eq "MPI_Ialltoallw")
+    #    || ($routine eq "MPI_Neighbor_alltoallw")
+    #    || ($routine eq "MPI_Ineighbor_alltoallw")
+    #    ) {
+    #    $fullline = "";
+    #    next;
+    #}
+
+    @arglist = split(/,/, $args);
+
+    # If the function arguments have a void*, it is of interest to us.
+    # Dump the function definition into the file and the function name
+    # into the Makefile.
+
+    # Here's the strategy we use:
+    #
+    # If the number of void* and datatype arguments are the same
+    # (e.g., MPI_SEND), we map them one to one.  This might not be
+    # generally true, but is true as of MPI-3.  It needs to be checked
+    # whenever we add new functions.
+    #
+    # Some functions have different datatype and void* counts.  If the
+    # number of datatypes is larger than the number of void* buffers
+    # (e.g., MPI_PUT), we map the datatype to the first void* buffer
+    # and ignore the remaining datatypes.  We also create more
+    # datatypes than what we use.  This is inefficient, but not
+    # incorrect (needs to be fixed).
+    #
+    # If the number of datatypes is smaller than the number of void*
+    # buffers (e.g., MPI_PACK), we assign datatypes for the first few
+    # void* buffers and ignore the rest.  This rule also holds true
+    # for functions that have multiple void* buffers all of which
+    # correspond to the same datatype (e.g., MPI_REDUCE), where we
+    # assume that the a uniform subarray format is used by all void*
+    # buffers.  Again, this is not generally correct, but is
+    # sufficient for MPI-3.
+    #
+    # Some functions do not have the void* and datatype correspondence
+    # in order.  For example, in MPI_UNPACK, the first (and only)
+    # datatype corresponds to the second void* buffer.  We handle
+    # these functions as a special case as described in the
+    # %dtype_bindings array.
+
+    if (grep/void\s*\*/, @arglist) {
+        $fname = "$routine";
+        $fname =~ s/MPI_//g;
+        $fname =~ tr/A-Z/a-z/;
+        $fname .= "_cdesc.c";
+
+        print MAKEFD "\tsrc/binding/fortran/use_mpi_f08/wrappers_c/$fname \\\n";
+        open(CFILE, ">$fname") || die "Could not open $fname\n";
+
+        # replace MPI_Foo with MPIR_Foo_cdesc
+        $cdesc_routine = $routine;
+        $cdesc_routine =~ s/MPI_/MPIR_/g;
+        $cdesc_routine .= "_cdesc";
+
+        print CFILE <<EOT;
+/* -*- Mode: C; c-basic-offset:4 ; -*- */
+/*
+ *  (C) 2014 by Argonne National Laboratory.
+ *      See COPYRIGHT in top-level directory.
+ *
+ * This file is automatically generated by buildiface
+ * DO NOT EDIT
+ */
+
+#include "cdesc.h"
+EOT
+
+        print CFILE "\n$retarg $cdesc_routine(";
+        print CDESCH "extern $retarg $cdesc_routine(";
+        for ($x = 0; $x <= $#arglist; $x++) {
+            $arglist[$x] =~ s/^\s*//g;
+            $arglist[$x] =~ s/\s*$//g;
+        }
+
+        for ($x = 0; $x <= $#arglist; $x++) {
+            # remove variable names in arguments
+            @argbits = split(/ /, $arglist[$x]);
+            $arglist[$x] = "";
+            for ($y = 0; $y <= $#argbits; $y++) {
+                $argbits[$y] =~ s/\*.*/*/g;
+                $argbits[$y] =~ s/[^ ]*\[\]/[]/g;
+                if ($y < $#argbits) {
+                    $arglist[$x] .= "$argbits[$y] ";
+                }
+                else {
+                    if ($argbits[$y] =~ /\[\]/ || $argbits[$y] =~ /\*/) {
+                        $arglist[$x] .= "$argbits[$y] ";
+                    }
+                    else {
+                        # reduce the array size by one to drop the last bit
+                        $#argbits--;
+                    }
+                }
+            }
+
+            # replace void * with CFI_cdesc_t*
+            if ($arglist[$x] =~ /.*void\s*\*/) {
+                $arglist[$x] = "CFI_cdesc_t*";
+            }
+            @argbits = split(/ /, $arglist[$x]);
+
+            if ($x) {
+                print CFILE ", ";
+                print CDESCH ", ";
+            }
+
+            # print out all but the last bit of the argument
+            for ($y = 0; $y < $#argbits; $y++) {
+                print CFILE "$argbits[$y] ";
+                print CDESCH "$argbits[$y] ";
+            }
+
+            # deal with [] structures for the last bit
+            if ($argbits[$#argbits] =~ /\[\]/) {
+                print CFILE "x$x\[\]";
+                print CDESCH "x$x\[\]";
+            }
+            else {
+                print CFILE "$argbits[$#argbits] x$x";
+                print CDESCH "$argbits[$#argbits] x$x";
+            }
+        }
+        print CFILE ")\n{\n";
+        print CDESCH ");\n";
+
+        if ($io_header) {
+            print CFILE "#ifdef MPI_MODE_RDONLY\n"
+        }
+
+        print CFILE "${tab}int err = MPI_SUCCESS;\n";
+        print CFILE "${tab}int is_contig = 1;\n\n";
+
+        for ($x = 0; $x <= $#arglist; $x++) {
+            if ($arglist[$x] =~ /CFI_cdesc_t\*/) {
+                print CFILE "    /* When MPI_BOTTOM is passed in, base_addr is NULL and it is illegal to call CFI_is_contiguous. */\n";
+                print CFILE "${tab}if (x$x->base_addr != NULL) {\n";
+                print CFILE "${tab}${tab}if (!CFI_is_contiguous(x$x)) { is_contig = 0; }\n";
+                print CFILE "${tab}}\n"
+            }
+        }
+        print CFILE "\n";
+
+        print CFILE "${tab}if (is_contig) {\n";
+        if (defined($inplace{$routine})) {
+            print CFILE "${tab}${tab}void *addr =  x$inplace{$routine}->base_addr;\n";
+            print CFILE "${tab}${tab}if (addr == MPIR_F08_MPI_IN_PLACE)\n";
+            print CFILE "${tab}${tab}${tab}addr = MPI_IN_PLACE;\n\n";
+        }
+        print CFILE "${tab}${tab}err = $routine(";
+        for ($x = 0; $x <= $#arglist; $x++) {
+            if ($x) {
+                print CFILE ", ";
+            }
+            if (defined($inplace{$routine}) && $x eq $inplace{$routine}) {
+                print CFILE "addr";
+            }
+            else {
+                print CFILE "x$x";
+                if ($arglist[$x] =~ /CFI_cdesc_t\*/) {
+                    print CFILE "->base_addr";
+                }
+            }
+        }
+        print CFILE ");\n";
+        print CFILE "${tab}}\n";
+        print CFILE "${tab}else {\n";
+        print CFILE "#if 0\n";
+
+        for ($x = 0, $y = 0; $x <= $#arglist; $x++) {
+            if ($arglist[$x] =~ /CFI_cdesc_t\*/) {
+                print CFILE "${tab}${tab}MPI_Datatype dtype$y = MPI_DATATYPE_NULL;\n";
+                $y++;
+            }
+        }
+
+        for ($x = 0, $y = 0; $x <= $#arglist; $x++) {
+            if ($arglist[$x] =~ /CFI_cdesc_t\*/) {
+                print CFILE "${tab}${tab}cdesc_create_dtype(x$x, MPI_INT, &dtype$y);\n";
+                $y++;
+            }
+        }
+	$num_dtypes = $y;
+
+        print CFILE "\n${tab}${tab}err = $routine(";
+	if (defined($dtype_bindings{$routine})) {
+	    @dtype_bind = split(/:/, $dtype_bindings{$routine});
+	}
+        for ($x = 0, $y = 0; $x <= $#arglist; $x++) {
+            if ($x) {
+                print CFILE ", ";
+            }
+            if ($arglist[$x] =~ /CFI_cdesc_t\*/) {
+                print CFILE "x$x->base_addr";
+            }
+            elsif ($arglist[$x] =~ /MPI_Datatype/) {
+		if ($y >= $num_dtypes) {
+		    # if we already saw the expected number of
+		    # datatypes, ignore the rest
+		    print CFILE "x$x";
+		}
+		elsif ($dtype_bind[$y]) {
+		    $dtype_bind[$y]--;
+		    print CFILE "dtype$dtype_bind[$y]";
+		}
+		else {
+		    print CFILE "dtype$y";
+		}
+                $y++;
+            }
+            else {
+                print CFILE "x$x";
+            }
+        }
+        print CFILE ");\n\n";
+
+        for ($x = 0, $y = 0; $x <= $#arglist; $x++) {
+            if ($arglist[$x] =~ /CFI_cdesc_t\*/) {
+                print CFILE "${tab}${tab}MPI_Type_free(&dtype$y);\n";
+                $y++;
+            }
+        }
+
+        print CFILE "\n${tab}${tab}return err;\n";
+        print CFILE "#else\n";
+        print CFILE "${tab}${tab}fprintf(stderr, \"MPI_SUBARRAYS_SUPPORTED is false; subarrays are not supported\\n\");\n";
+        print CFILE "${tab}${tab}return MPI_ERR_ARG;\n";
+        print CFILE "#endif\n";
+        print CFILE "${tab}}\n";
+
+        if ($io_header) {
+                print CFILE "#else\n";
+                print CFILE "${tab}*ierr = MPI_ERR_INTERN;\n";
+                print CFILE "#endif\n";
+        }
+
+        print CFILE "${tab}return err;\n";
+
+        print CFILE "}\n";
+
+        close CFILE;
+    }
+
+    $fullline = "";
+}
+
+if ($make_exists) {
+    print MAKEFD "\tsrc/binding/fortran/use_mpi_f08/wrappers_c/cdesc.c \\\n";
+    print MAKEFD "\tsrc/binding/fortran/use_mpi_f08/wrappers_c/comm_spawn_c.c \\\n";
+    print MAKEFD "\tsrc/binding/fortran/use_mpi_f08/wrappers_c/comm_spawn_multiple_c.c \\\n";
+    print MAKEFD "\tsrc/binding/fortran/use_mpi_f08/wrappers_c/f_sync_reg_c.c \\\n";
+    print MAKEFD "\tsrc/binding/fortran/use_mpi_f08/wrappers_c/utils.c\n\n";
+    print MAKEFD <<EOT;
+AM_CPPFLAGS += -I\${master_top_srcdir}/src/binding/fortran/use_mpi_f08/wrappers_c
+
+noinst_HEADERS += src/binding/fortran/use_mpi_f08/wrappers_c/cdesc.h
+
+endif BUILD_F08_BINDING
+EOT
+}
+
+close MAKEFD;
+close CDESCH;

http://git.mpich.org/mpich.git/commitdiff/19cca6bcacac84c163ed8065f8448a37ddd82828

commit 19cca6bcacac84c163ed8065f8448a37ddd82828
Author: Junchao Zhang <jczhang at mcs.anl.gov>
Date:   Fri Mar 28 14:26:10 2014 -0500

    Add a script use_mpi_f08/buildiface
    
    The script will
    1) generate PMPI files. For PMPI specific procedure names, we use PMPIR_* instead
       of PMPI_*, since the later is reserved by MPI.
    2) generate use_mpi_f08/Makefile.mk
    
    No review since F08 binding is experimental now.

diff --git a/src/binding/fortran/use_mpi_f08/buildiface b/src/binding/fortran/use_mpi_f08/buildiface
new file mode 100755
index 0000000..bc2fee2
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/buildiface
@@ -0,0 +1,166 @@
+#! /usr/bin/env perl
+#
+# (C) 2014 by Argonne National Laboratory.
+#     See COPYRIGHT in top-level directory.
+#
+
+use warnings;
+use strict;
+use File::Basename;
+
+my $cur_dir = "src/binding/fortran/use_mpi_f08";
+my $wrappers_f_dir = "wrappers_f";
+my $pmpi_dir = "wrappers_f/profiling";
+
+# Stage 1: Translate mpi_f08.F90 into pmpi_f08.F90
+# =====================================================================
+my $mpi_f08_file = "mpi_f08.F90";
+my $pmpi_f08_file = "pmpi_f08.F90";
+my $mpi_f08_fh;
+my $pmpi_f08_fh;
+
+open($mpi_f08_fh,  "<", $mpi_f08_file)  || die "Error: Could not open $mpi_f08_file, $!";
+open($pmpi_f08_fh, ">", $pmpi_f08_file) || die "Error: Could not open $pmpi_f08_file, $!";
+
+while (<$mpi_f08_fh>) {
+    if (/pmpi_f08/) {
+        next; # Skip the "use :: pmpi_f08" line
+    } elsif (/module\s+mpi_f08/) {
+        $_ =~ s/module\s+mpi_f08/module pmpi_f08/;
+    } elsif (/interface\s+MPI_/) {
+        $_ =~ s/interface\s+MPI_/interface PMPI_/;
+    } elsif (/subroutine\s+MPI_/) {
+        $_ =~ s/subroutine\s+MPI_/subroutine PMPIR_/;
+    } elsif (/function\s+MPI_/) {
+        $_ =~ s/function\s+MPI_/function PMPIR_/;
+    } elsif (/MPI_Wtick_f08/) { # Replace return value
+        $_ =~ s/MPI_Wtick_f08/PMPIR_Wtick_f08/;
+    } elsif (/MPI_Wtime_f08/) { # Replace return value
+        $_ =~ s/MPI_Wtime_f08/PMPIR_Wtime_f08/;
+    }
+    print $pmpi_f08_fh $_;
+}
+
+close($mpi_f08_fh);
+close($pmpi_f08_fh);
+
+# Stage 2: Translate Fortran MPI wrapper files into PMPI wrapper files
+# =====================================================================
+
+mkdir $pmpi_dir unless -d $pmpi_dir;
+foreach my $mpi_file (glob("$wrappers_f_dir/*.F90")) {
+    my $basename = basename($mpi_file);
+    my $pmpi_file = "$pmpi_dir/p$basename";
+    my $mpi_fh;
+    my $pmpi_fh;
+
+    open($mpi_fh,  "<", $mpi_file)  or die "Error: Could not open $mpi_file, $!";
+    open($pmpi_fh, ">", $pmpi_file) or die "Error: Could not open $pmpi_file, $!";
+
+    while (<$mpi_fh>) {
+        if (/subroutine\s+MPI_/) {
+            $_ =~ s/subroutine\s+MPI_/subroutine PMPIR_/
+        } elsif (/function\s+MPI_/) {
+            $_ =~ s/function\s+MPI_/function PMPIR_/
+        }
+        print $pmpi_fh $_;
+    }
+
+    close($mpi_fh);
+    close($pmpi_fh);
+}
+
+# Stage 3: Generate Makefile.mk under use_mpi_f08
+# =====================================================================
+my $makefile = "Makefile.mk";
+my $makefile_fh;
+my @files;
+
+open($makefile_fh, ">", $makefile) || die "Error: Could not open $makefile, $!";
+
+print $makefile_fh  <<EOT;
+# -*- Mode: Makefile; -*-
+#
+# (C) 2014 by Argonne National Laboratory.
+#     See COPYRIGHT in top-level directory.
+#
+#  AUTOGENERATED! DO NOT EDIT!
+#
+#  This file is created by script $cur_dir/buildiface
+
+# ensure that the buildiface script ends up in the release tarball
+
+MOD = \@FCMODEXT\@
+
+EXTRA_DIST += $cur_dir/buildiface
+
+mpi_f08_module_sources =
+mpi_c_interface_sources =
+mpi_f08_wrappers_f_sources =
+pmpi_f08_wrappers_f_sources =
+mpi_f08_modules =
+
+if BUILD_F08_BINDING
+
+EOT
+
+print $makefile_fh "AM_FCFLAGS += \@FCINCFLAG\@$cur_dir\n\n";
+
+print $makefile_fh "mpi_f08_module_sources += \\\n";
+ at files = glob("*mpi_f08*.F90");
+for (my $i=0; $i<=$#files; $i++) {
+    print $makefile_fh "\t$cur_dir/$files[$i]";
+    if ($i != $#files) {
+        print $makefile_fh " \\\n";
+    } else {
+        print $makefile_fh "\n\n";
+    }
+}
+
+print $makefile_fh "mpi_f08_modules += \\\n";
+ at files = glob("*mpi_f08*.F90");
+for (my $i=0; $i<=$#files; $i++) {
+    my $file = $files[$i];
+    $file =~ s{.*/}{};      # removes path
+    $file =~ s{\.[^.]+$}{}; # removes extension
+    print $makefile_fh "\t$cur_dir/$file.\$(MOD)";
+    if ($i != $#files) { print $makefile_fh " \\\n"; } else { print $makefile_fh "\n\n"; }
+}
+
+print $makefile_fh "modinc_HEADERS = \$(mpi_f08_modules)\n\n";
+
+print $makefile_fh "mpi_c_interface_sources += \\\n";
+ at files = glob("mpi_c_interface_*.F90");
+for (my $i=0; $i<=$#files; $i++) {
+    print $makefile_fh "\t$cur_dir/$files[$i]";
+    if ($i != $#files) { print $makefile_fh " \\\n"; } else { print $makefile_fh "\n\n"; }
+}
+
+print $makefile_fh "mpi_f08_wrappers_f_sources += \\\n";
+ at files = glob("$wrappers_f_dir/*.F90");
+for (my $i=0; $i<=$#files; $i++) {
+    print $makefile_fh "\t$cur_dir/$files[$i]";
+    if ($i != $#files) { print $makefile_fh " \\\n"; } else { print $makefile_fh "\n\n"; }
+}
+
+print $makefile_fh "pmpi_f08_wrappers_f_sources += \\\n";
+ at files = glob("$pmpi_dir/*.F90");
+for (my $i=0; $i<=$#files; $i++) {
+    print $makefile_fh "\t$cur_dir/$files[$i]";
+    if ($i != $#files) { print $makefile_fh " \\\n"; } else { print $makefile_fh "\n\n"; }
+}
+
+print $makefile_fh "lib_lib\@MPILIBNAME\@_la_SOURCES += \\
+    \$(mpi_f08_module_sources) \\
+    \$(mpi_c_interface_sources) \\
+    \$(mpi_f08_wrappers_f_sources) \\
+    \$(pmpi_f08_wrappers_f_sources)\n\n";
+
+print $makefile_fh "include \$(top_srcdir)/src/binding/fortran/use_mpi_f08/wrappers_c/Makefile.mk\n\n";
+
+print $makefile_fh "endif BUILD_F08_BINDING\n";
+close($makefile_fh);
+
+# Stage 4: Call script in ./wrappers_c to generate C wrappers for subarrays
+# =====================================================================
+

http://git.mpich.org/mpich.git/commitdiff/4b0e47445df08261e8ca77c35b45ac6ba6aa41dd

commit 4b0e47445df08261e8ca77c35b45ac6ba6aa41dd
Author: Junchao Zhang <jczhang at mcs.anl.gov>
Date:   Fri Apr 18 15:38:43 2014 -0500

    Add an almost complete F08 binding with dir re-arranged
    
    Redesigned the binding infrastructer and gave an almost complete F08 binding.
    Remaining tasks include :
    
    1) supporting non-contiguous subarray on the C wrapper side.
    2) Use a script to autoset the now hard-coded compile time constants.
    
    The directory structure is as following:
    
    use_mpi_f08/                      --- To put F08 binding header files
    use_mpi_f08/wrappers_f/           --- To put Fortran wrapper files
    use_mpi_f08/wrappers_f/profiling/ --- To put PMPI Fortran wrapper files
    use_mpi_f08/wrappers_c/           --- To put C wrapper files (auto-gen'ed or not)
    
    Note we use *.F90 suffix instead of *.f90, since .F90 supports macro preprocess.
    This leaves room for future revision. Additionally, the tests directory is removed
    since it should not be there.
    
    No review since F08 binding is experimental now.

diff --git a/configure.ac b/configure.ac
index 77b9b58..daa7abf 100644
--- a/configure.ac
+++ b/configure.ac
@@ -2177,6 +2177,13 @@ if test "$enable_fc" = "yes" ; then
     fi
 fi
 
+if test -n "$f08_works" ; then
+    status_f08_works=1
+else
+    status_f08_works=0
+fi
+AC_DEFINE_UNQUOTED(HAVE_F08_BINDING, $status_f08_works, [Define to 1 to enable Fortran 2008 binding])
+
 # Set defaults for these values so that the Makefile in src/bindings/f90
 # is valid even if fc is not enabled (this is necessary for the 
 # distclean target)
diff --git a/src/binding/Makefile.mk b/src/binding/Makefile.mk
index c102f9f..b678cae 100644
--- a/src/binding/Makefile.mk
+++ b/src/binding/Makefile.mk
@@ -8,4 +8,4 @@
 include $(top_srcdir)/src/binding/cxx/Makefile.mk
 include $(top_srcdir)/src/binding/fortran/mpif_h/Makefile.mk
 include $(top_srcdir)/src/binding/fortran/use_mpi/Makefile.mk
-
+include $(top_srcdir)/src/binding/fortran/use_mpi_f08/Makefile.mk
diff --git a/src/binding/fortran/use_mpi_f08/Makefile b/src/binding/fortran/use_mpi_f08/Makefile
deleted file mode 100644
index b96ef02..0000000
--- a/src/binding/fortran/use_mpi_f08/Makefile
+++ /dev/null
@@ -1,42 +0,0 @@
-
-FC = gfortran
-COBJ = mpi_c_interface.o mpi_c_interface_types.o mpi_c_interface_nobuf.o mpi_c_interface_cdesc.o
-FOBJ = mpi_f08.o mpi_f08_types.o mpi_f08_constants.o mpi_f08_callbacks.o
-
-FFLAGS = -c
-
-all:	libmpichf08.a
-
-libmpichf08.a:	 $(FOBJ) $(COBJ)
-	ar -r $@  $^
-
-mpi_c_interface.o:	mpi_c_interface.f90 mpi_c_interface_types.o mpi_c_interface_nobuf.o mpi_c_interface_cdesc.o
-	$(FC)  $(FFLAGS) $<
-
-mpi_c_interface_types.o:	mpi_c_interface_types.f90
-	$(FC)  $(FFLAGS) $<
-
-mpi_c_interface_nobuf.o: mpi_c_interface_nobuf.f90  mpi_c_interface_types.o
-	$(FC)  $(FFLAGS) $<
-
-mpi_c_interface_cdesc.o: mpi_c_interface_cdesc.f90  mpi_c_interface_types.o
-	$(FC)  $(FFLAGS) $<
-
-
-mpi_f08_types.o: mpi_f08_types.f90  mpi_c_interface_types.o
-	$(FC) $(FFLAGS) $<
-
-mpi_f08_constants.o: mpi_f08_constants.f90 mpi_f08_types.o mpi_c_interface_types.o
-	$(FC) $(FFLAGS) $<
-
-mpi_f08_callbacks.o: mpi_f08_callbacks.f90 mpi_f08_types.o mpi_f08_constants.o
-	$(FC) $(FFLAGS) $<
-
-mpi_f08.o: mpi_f08.f90  mpi_f08_callbacks.o mpi_f08_types.o mpi_f08_constants.o mpi_c_interface.o
-	$(FC) -em $(FFLAGS) $<
-
-clean:
-	rm -f *.o *.mod *.a
-
-clobber:	clean
-	rm -f libmpi_f08.a
diff --git a/src/binding/fortran/use_mpi_f08/f08ts/Makefile b/src/binding/fortran/use_mpi_f08/f08ts/Makefile
deleted file mode 100644
index aa70f59..0000000
--- a/src/binding/fortran/use_mpi_f08/f08ts/Makefile
+++ /dev/null
@@ -1,47 +0,0 @@
-FC=gfortran
-
-FSRCS = \
-	abort_f08ts.f90  \
-	barrier_f08ts.f90  \
-	bsend_f08ts.f90  \
-	bsend_init_f08ts.f90  \
-	buffer_attach_f08ts.f90  \
-	buffer_detach_f08ts.f90  \
-	cancel_f08ts.f90  \
-	comm_rank_f08ts.f90  \
-	comm_size_f08ts.f90  \
-	error_string_f08ts.f90  \
-	finalize_f08ts.f90  \
-	init_f08ts.f90  \
-	irecv_f08ts.f90  \
-	isend_f08ts.f90  \
-	recv_f08ts.f90  \
-	send_f08ts.f90  \
-	test_f08ts.f90  \
-	type_create_f90_complex_f08ts.f90  \
-	type_create_f90_integer_f08ts.f90  \
-	type_create_f90_real_f08ts.f90  \
-	type_match_size_f08ts.f90  \
-	wait_f08ts.f90  \
-	wtick_f08ts.f90  \
-	wtime_f08ts.f90
-
-FOBJS=$(FSRCS:.f90=.o)
-
-FFLAGS =
-
-%.o : %.f90
-	$(FC) -c -o $@ $(FFLAGS) $< -I ../
-
-LIBFCALLC=libf08ts.a
-
-all : $(LIBFCALLC)
-
-$(LIBFCALLC) : $(FOBJS)
-	ar -cr $@ $^
-
-clean:
-	rm -f *.o *.a
-
-clobber : clean
-	rm -f $(LIBFCALLC)
diff --git a/src/binding/fortran/use_mpi_f08/f08ts/abort_f08ts.f90 b/src/binding/fortran/use_mpi_f08/f08ts/abort_f08ts.f90
deleted file mode 100644
index 4283dfa..0000000
--- a/src/binding/fortran/use_mpi_f08/f08ts/abort_f08ts.f90
+++ /dev/null
@@ -1,18 +0,0 @@
-
-subroutine MPI_Abort_f08(comm, errorcode, ierror)
-     use,intrinsic :: iso_c_binding, only: c_int
-     use :: mpi_f08,          only: MPI_Comm
-     use :: mpi_c_interface      ,  only: c_Comm, MPIR_Abort_c
-     type(MPI_Comm),      intent(in)  :: comm
-     integer,             intent(in)  :: errorcode
-     integer, optional,   intent(out) :: ierror
-     integer(c_Comm) :: comm_c
-     integer(c_int)  :: errorcode_c
-     integer(c_int)  :: res
-
-     comm_c = comm%MPI_VAL
-     errorcode_c = errorcode
-     res = MPIR_Abort_c (comm_c, errorcode_c)
-     if (present(ierror)) ierror = res
-
-end subroutine MPI_Abort_f08
diff --git a/src/binding/fortran/use_mpi_f08/f08ts/barrier_f08ts.f90 b/src/binding/fortran/use_mpi_f08/f08ts/barrier_f08ts.f90
deleted file mode 100644
index 408d654..0000000
--- a/src/binding/fortran/use_mpi_f08/f08ts/barrier_f08ts.f90
+++ /dev/null
@@ -1,17 +0,0 @@
-
-subroutine MPI_Barrier_f08(comm, ierror)
-    use,intrinsic :: iso_c_binding, only: c_int
-    use :: mpi_f08, only : MPI_Comm
-    use :: mpi_c_interface, only: c_Comm, MPIR_Barrier_c
-
-    type(MPI_Comm),      intent(in)  :: comm
-    integer, optional,   intent(out) :: ierror
-
-    integer(c_Comm) :: comm_c
-    integer(c_int)  :: res
-
-    comm_c = comm%MPI_VAL
-    res = MPIR_Barrier_C (comm_c)
-    if (present(ierror)) ierror = res
-
-end subroutine MPI_Barrier_f08
diff --git a/src/binding/fortran/use_mpi_f08/f08ts/bsend_f08ts.f90 b/src/binding/fortran/use_mpi_f08/f08ts/bsend_f08ts.f90
deleted file mode 100644
index 760fe07..0000000
--- a/src/binding/fortran/use_mpi_f08/f08ts/bsend_f08ts.f90
+++ /dev/null
@@ -1,27 +0,0 @@
-
-subroutine MPI_Bsend_f08ts(buf, count, datatype, dest, tag, comm, ierror)
-     use,intrinsic :: iso_c_binding, only: c_int
-     use :: mpi_f08,           only: MPI_Datatype, MPI_Comm
-     use :: mpi_c_interface,        only: c_Datatype, c_Comm, MPIR_Bsend_cdesc
-     type(*), DIMENSION(..), intent(in) :: buf
-     integer, intent(in) :: count, dest, tag
-     type(MPI_Datatype), intent(in) :: datatype
-     type(MPI_Comm), intent(in) :: comm
-     integer, optional, intent(out) :: ierror
-
-     integer(c_int)          :: count_c
-     integer(c_Datatype)     :: datatype_c
-     integer(c_int)          :: dest_c
-     integer(c_int)          :: tag_c
-     integer(c_Comm)         :: comm_c
-     integer(c_int)          :: res
-
-     count_c = count
-     datatype_c = datatype%MPI_VAL
-     dest_c = dest
-     tag_c = tag
-     comm_c = comm%MPI_VAL
-     res = MPIR_Bsend_cdesc (buf, count_c, datatype_c, dest_c, tag_c, comm_c)
-     if (present(ierror)) ierror = res
-
-end subroutine MPI_Bsend_f08ts
\ No newline at end of file
diff --git a/src/binding/fortran/use_mpi_f08/f08ts/bsend_init_f08ts.f90 b/src/binding/fortran/use_mpi_f08/f08ts/bsend_init_f08ts.f90
deleted file mode 100644
index 2ff3302..0000000
--- a/src/binding/fortran/use_mpi_f08/f08ts/bsend_init_f08ts.f90
+++ /dev/null
@@ -1,30 +0,0 @@
-
-subroutine MPI_Bsend_init_f08ts(buf, count, datatype, dest, tag, comm, ierror, request)
-     use,intrinsic :: iso_c_binding, only: c_int
-     use :: mpi_f08,           only: MPI_Datatype, MPI_Comm, MPI_Request
-     use :: mpi_c_interface,        only: c_Datatype, c_Comm, c_Request, MPIR_Bsend_init_cdesc
-     type(*), DIMENSION(..), intent(in) :: buf
-     integer, intent(in) :: count, dest, tag
-     type(MPI_Datatype), intent(in) :: datatype
-     type(MPI_Comm), intent(in) :: comm
-     type(MPI_Request), intent(out) :: request
-     integer, optional, intent(out) :: ierror
-     integer(c_int)          :: count_c
-     integer(c_Datatype)     :: datatype_c
-     integer(c_int)          :: dest_c
-     integer(c_int)          :: tag_c
-     integer(c_comm)         :: comm_c
-     integer(c_Request)      :: request_c
-     integer(c_int)          :: res
-
-     count_c = count
-     datatype_c = datatype%MPI_VAL
-     dest_c = dest
-     tag_c = tag
-     comm_c = comm%MPI_VAL
-     res = MPIR_Bsend_init_cdesc (buf, count_c, datatype_c, dest_c, tag_c, comm_c, request_c)
-     request%MPI_VAL = request_c
-     if (present(ierror)) ierror = res
-
-end subroutine MPI_Bsend_init_f08ts
-
diff --git a/src/binding/fortran/use_mpi_f08/f08ts/buffer_attach_f08ts.f90 b/src/binding/fortran/use_mpi_f08/f08ts/buffer_attach_f08ts.f90
deleted file mode 100644
index 0f6e3a1..0000000
--- a/src/binding/fortran/use_mpi_f08/f08ts/buffer_attach_f08ts.f90
+++ /dev/null
@@ -1,15 +0,0 @@
-subroutine MPI_Buffer_attach_f08ts(buffer, size, ierror)
-     use,intrinsic :: iso_c_binding, only: C_int
-     use :: mpi_c_interface,        only: MPIR_Buffer_attach_cdesc
-     type(*), DIMENSION(..), ASYNCHRONOUS :: buffer  !!! CORRECT
-     integer, intent(in) :: size
-     integer, optional, intent(out) :: ierror
-     integer(C_int)  :: size_c
-     integer(C_int)  :: res
-
-     size_c = size
-     res = MPIR_Buffer_attach_cdesc (buffer, size_c)
-     if (present(ierror)) ierror = res
-
-end subroutine MPI_Buffer_attach_f08ts
-
diff --git a/src/binding/fortran/use_mpi_f08/f08ts/buffer_detach_f08ts.f90 b/src/binding/fortran/use_mpi_f08/f08ts/buffer_detach_f08ts.f90
deleted file mode 100644
index a49cf8a..0000000
--- a/src/binding/fortran/use_mpi_f08/f08ts/buffer_detach_f08ts.f90
+++ /dev/null
@@ -1,14 +0,0 @@
-subroutine MPI_Buffer_detach_f08 (buffer_addr, size, ierror)
-     use,intrinsic :: iso_c_binding, only: c_int, c_ptr
-     use :: mpi_c_interface,        only: MPIR_Buffer_detach_c
-     type(c_ptr) :: buffer_addr
-     integer,intent(out) :: size
-     integer,intent(out),optional :: ierror
-     integer(c_int) :: size_c
-     integer(c_int) :: res
-
-     res = MPIR_Buffer_detach_c (buffer_addr, size_c)
-     size = size_c
-     if (present(ierror)) ierror = res
-
-end subroutine MPI_Buffer_detach_f08
diff --git a/src/binding/fortran/use_mpi_f08/f08ts/cancel_f08ts.f90 b/src/binding/fortran/use_mpi_f08/f08ts/cancel_f08ts.f90
deleted file mode 100644
index 189e5d8..0000000
--- a/src/binding/fortran/use_mpi_f08/f08ts/cancel_f08ts.f90
+++ /dev/null
@@ -1,14 +0,0 @@
-subroutine MPI_Cancel_f08 (request, ierror)
-     use,intrinsic :: iso_c_binding, only: c_int
-     use :: mpi_f08,           only: MPI_Request
-     use :: mpi_c_interface,        only: C_Request, MPIR_Cancel_c
-     type(MPI_Request),intent(in) :: request
-     integer,intent(out),optional :: ierror
-     integer(C_Request) :: request_c
-     integer(c_int)     :: res
-
-     request_c = request%MPI_VAL
-     res = MPIR_Cancel_c (request_c)
-     if (present(ierror)) ierror = res
-
-end subroutine MPI_Cancel_f08
\ No newline at end of file
diff --git a/src/binding/fortran/use_mpi_f08/f08ts/comm_rank_f08ts.f90 b/src/binding/fortran/use_mpi_f08/f08ts/comm_rank_f08ts.f90
deleted file mode 100644
index 47421de..0000000
--- a/src/binding/fortran/use_mpi_f08/f08ts/comm_rank_f08ts.f90
+++ /dev/null
@@ -1,20 +0,0 @@
-
-subroutine MPI_Comm_rank_f08(comm, rank, ierror)
-    use,intrinsic :: iso_c_binding, only: c_int
-    use :: mpi_f08, only : MPI_Comm
-    use :: mpi_c_interface, only : c_Comm, MPIR_Comm_rank_c
-
-    type(MPI_Comm), intent(in)     :: comm
-    integer, intent(out)           :: rank
-    integer, optional, intent(out) :: ierror
-
-    integer(c_Comm) :: comm_c
-    integer(c_int)  :: rank_c
-    integer(c_int)  :: res
-
-    comm_c = comm%MPI_VAL
-    res = MPIR_Comm_rank_c(comm_c, rank_c)
-    rank = rank_c
-    if (present(ierror)) ierror = res
-
-end subroutine MPI_Comm_rank_f08
diff --git a/src/binding/fortran/use_mpi_f08/f08ts/comm_size_f08ts.f90 b/src/binding/fortran/use_mpi_f08/f08ts/comm_size_f08ts.f90
deleted file mode 100644
index 9c4dce8..0000000
--- a/src/binding/fortran/use_mpi_f08/f08ts/comm_size_f08ts.f90
+++ /dev/null
@@ -1,20 +0,0 @@
-
-subroutine MPI_Comm_size_f08(comm, size, ierror)
-    use,intrinsic :: iso_c_binding, only: c_int
-    use :: mpi_f08, only : MPI_Comm
-    use :: mpi_c_interface, only: c_Comm, MPIR_Comm_size_c
-
-    type(MPI_Comm), intent(in)     :: comm
-    integer, intent(out)           :: size
-    integer, optional, intent(out) :: ierror
-
-    integer(c_Comm) :: comm_c
-    integer(c_int)  :: size_c
-    integer(c_int)  :: res
-
-    comm_c = comm%MPI_VAL
-    res = MPIR_Comm_size_c (comm_c, size_c)
-    size = size_c
-    if (present(ierror)) ierror = res
-
-end subroutine MPI_Comm_size_f08
diff --git a/src/binding/fortran/use_mpi_f08/f08ts/error_string_f08ts.f90 b/src/binding/fortran/use_mpi_f08/f08ts/error_string_f08ts.f90
deleted file mode 100644
index 5940872..0000000
--- a/src/binding/fortran/use_mpi_f08/f08ts/error_string_f08ts.f90
+++ /dev/null
@@ -1,21 +0,0 @@
-!--> MPIR_Error_string
-
-subroutine MPIR_Error_string_f08 (errorcode, string, resultlen, ierror)
-    use, intrinsic :: iso_c_binding, only: c_int
-    use :: mpi_f08, only : MPI_MAX_ERROR_STRING
-    use :: mpi_c_interface, only: c_char, MPIR_Error_string_c
-
-    integer,                              intent(in) :: errorcode
-    CHARACTER(LEN=MPI_MAX_ERROR_STRING), intent(out) :: string
-    integer,                             intent(out) :: resultlen
-    integer, optional,                   intent(out) :: ierror
-    integer(c_int) :: errorcode_c
-    integer(c_int) :: resultlen_c
-    integer(c_int) :: res
-
-    errorcode_c = errorcode
-    res = MPIR_Error_string_C (errorcode_c, string, resultlen_c)
-    resultlen = resultlen_c
-    if (present(ierror)) ierror = res
-
-end subroutine MPIR_Error_string_f08
diff --git a/src/binding/fortran/use_mpi_f08/f08ts/finalize_f08ts.f90 b/src/binding/fortran/use_mpi_f08/f08ts/finalize_f08ts.f90
deleted file mode 100644
index d50a065..0000000
--- a/src/binding/fortran/use_mpi_f08/f08ts/finalize_f08ts.f90
+++ /dev/null
@@ -1,11 +0,0 @@
-
-subroutine MPI_Finalize_f08(ierror )
-     use,intrinsic :: iso_c_binding, only: c_int
-     use mpi_c_interface, only: MPIR_Finalize_c
-     integer, optional,   intent(out) :: ierror
-     integer(c_int) :: res
-
-     res = MPIR_Finalize_c()
-     if (present(ierror)) ierror = res
-
-end subroutine MPI_Finalize_f08
diff --git a/src/binding/fortran/use_mpi_f08/f08ts/init_f08ts.f90 b/src/binding/fortran/use_mpi_f08/f08ts/init_f08ts.f90
deleted file mode 100644
index 3ba69a4..0000000
--- a/src/binding/fortran/use_mpi_f08/f08ts/init_f08ts.f90
+++ /dev/null
@@ -1,11 +0,0 @@
-
-subroutine MPI_Init_f08(ierror)
-     use,intrinsic :: iso_c_binding, only: c_int
-     use mpi_c_interface, only: C_NULL_PTR, MPIR_Init_c
-     integer, optional,   intent(out) :: ierror
-     integer(c_int) :: res
-
-     res = MPIR_Init_c(C_NULL_PTR, C_NULL_PTR)
-     if (present(ierror)) ierror = res
-
-end subroutine MPI_Init_f08
diff --git a/src/binding/fortran/use_mpi_f08/f08ts/irecv_f08ts.f90 b/src/binding/fortran/use_mpi_f08/f08ts/irecv_f08ts.f90
deleted file mode 100644
index f1451af..0000000
--- a/src/binding/fortran/use_mpi_f08/f08ts/irecv_f08ts.f90
+++ /dev/null
@@ -1,31 +0,0 @@
-
-subroutine MPI_Irecv_f08ts(buf, count, datatype, source, tag, comm, request, ierror)
-    use,intrinsic :: iso_c_binding, only: c_int
-    use :: mpi_f08, only : MPI_Datatype, MPI_Request, MPI_Comm
-    use :: mpi_c_interface, only: c_Datatype, c_Comm, C_Request, MPIR_Irecv_cdesc
-
-    type(*), DIMENSION(..), ASYNCHRONOUS :: buf
-    integer,            intent(in)       :: count, source, tag
-    type(MPI_Datatype), intent(in)       :: datatype
-    type(MPI_Comm),     intent(in)       :: comm
-    type(MPI_Request), intent(out)       :: request
-    integer, optional, intent(out)       :: ierror
-    integer(c_int)      :: count_c
-    integer(c_Datatype) :: datatype_c
-    integer(c_int)      :: source_c
-    integer(c_int)      :: tag_c
-    integer(c_Comm)     :: comm_c
-    integer(C_Request)  :: request_c
-    integer(c_int)      :: res
-
-    count_c    = count
-    datatype_c = datatype%MPI_VAL
-    source_c   = source
-    tag_c      = tag
-    comm_c     = comm%MPI_VAL
-
-    res = MPIR_Irecv_cdesc (buf,count_c,datatype_c,source_c,tag_c,comm_c, request_c)
-    request%MPI_VAL = request_c
-    if (present(ierror)) ierror = res
-
-end subroutine MPI_Irecv_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/f08ts/isend_f08ts.f90 b/src/binding/fortran/use_mpi_f08/f08ts/isend_f08ts.f90
deleted file mode 100644
index 41da9bb..0000000
--- a/src/binding/fortran/use_mpi_f08/f08ts/isend_f08ts.f90
+++ /dev/null
@@ -1,31 +0,0 @@
-
-subroutine MPI_Isend_f08ts(buf, count, datatype, dest, tag, comm, request, ierror)
-     use,intrinsic :: iso_c_binding, only: c_int
-     use :: mpi_f08, only : MPI_Datatype, MPI_Request, MPI_Comm
-     use :: mpi_c_interface, only:  c_Datatype, c_Comm, c_Request, MPIR_Isend_cdesc
-
-     type(*), DIMENSION(..), ASYNCHRONOUS :: buf
-     integer,            intent(in)       :: count, dest, tag
-     type(MPI_Datatype), intent(in)       :: datatype
-     type(MPI_Comm),     intent(in)       :: comm
-     type(MPI_Request), intent(out)       :: request
-     integer, optional, intent(out)       :: ierror
-     integer(c_int)      :: count_c
-     integer(c_Datatype) :: datatype_c
-     integer(c_int)      :: dest_c
-     integer(c_int)      :: tag_c
-     integer(c_Comm)     :: comm_c
-     integer(C_Request)  :: request_c
-     integer(c_int)      :: res
-
-     count_c    = count
-     datatype_c = datatype%MPI_VAL
-     dest_c   = dest
-     tag_c      = tag
-     comm_c     = comm%MPI_VAL
-
-     res = MPIR_Isend_cdesc (buf,count_c,datatype_c,dest_c,tag_c,comm_c, request_c)
-     request%MPI_VAL = request_c
-     if (present(ierror)) ierror = res
-
-end subroutine MPI_Isend_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/f08ts/recv_f08ts.f90 b/src/binding/fortran/use_mpi_f08/f08ts/recv_f08ts.f90
deleted file mode 100644
index a5f004a..0000000
--- a/src/binding/fortran/use_mpi_f08/f08ts/recv_f08ts.f90
+++ /dev/null
@@ -1,32 +0,0 @@
-
-subroutine MPI_Recv_f08ts(buf, count, datatype, source, tag, comm, status, ierror)
-    use,intrinsic :: iso_c_binding, only: c_int
-    use :: mpi_f08, only : MPI_Datatype, MPI_Status, MPI_Comm, assignment(=)
-    use :: mpi_c_interface, only: c_Datatype, c_Comm, MPIR_Recv_cdesc, c_Status
-
-    type(*), DIMENSION(..)        :: buf
-    integer,           intent(in) :: count, source, tag
-    type(MPI_Datatype),intent(in) :: datatype
-    type(MPI_Comm),    intent(in) :: comm
-    type(MPI_Status), intent(out) :: status
-    integer, optional,intent(out) :: ierror
-
-    integer(c_int)      :: count_c
-    integer(c_Datatype) :: datatype_c
-    integer(c_int)      :: source_c
-    integer(c_int)      :: tag_c
-    integer(c_Comm)     :: comm_c
-    type(c_Status)  :: status_c
-    integer(c_int)      :: res
-
-    count_c    = count
-    datatype_c = datatype%MPI_VAL
-    source_c   = source
-    tag_c      = tag
-    comm_c     = comm%MPI_VAL
-
-    res = MPIR_Recv_cdesc (buf,count_c,datatype_c,source_c,tag_c,comm_c, status_c)
-    status = status_c
-    if (present(ierror)) ierror = res
-
-end subroutine MPI_Recv_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/f08ts/send_f08ts.f90 b/src/binding/fortran/use_mpi_f08/f08ts/send_f08ts.f90
deleted file mode 100644
index e693651..0000000
--- a/src/binding/fortran/use_mpi_f08/f08ts/send_f08ts.f90
+++ /dev/null
@@ -1,29 +0,0 @@
-
-subroutine MPI_Send_f08ts(buf,count,datatype,dest,tag,comm,ierror)
-    use :: mpi_f08, only : MPI_Datatype, MPI_Comm
-    use,intrinsic :: iso_c_binding, only: c_int
-    use :: mpi_c_interface, only: c_Datatype, c_Comm, MPIR_Send_cdesc
-
-    type(*),DIMENSION(..),intent(in) :: buf
-    integer,              intent(in) :: count, dest, tag
-    type(MPI_Datatype),   intent(in) :: datatype
-    type(MPI_Comm),       intent(in) :: comm
-    integer, optional,   intent(out) :: ierror
-
-    integer(c_int)      :: count_c
-    integer(c_Datatype) :: datatype_c
-    integer(c_int)      :: dest_c
-    integer(c_int)      :: tag_c
-    integer(c_Comm)     :: comm_c
-    integer(c_int)      :: res
-
-    count_c    = count
-    datatype_c = datatype%MPI_VAL
-    dest_c     = dest
-    tag_c      = tag
-    comm_c     = comm%MPI_VAL
-
-    res = MPIR_Send_cdesc (buf, count_c, datatype_c, dest_c, tag_c, comm_c)
-    if (present(ierror)) ierror = res
-
-end subroutine MPI_Send_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/f08ts/test_f08ts.f90 b/src/binding/fortran/use_mpi_f08/f08ts/test_f08ts.f90
deleted file mode 100644
index 94689cc..0000000
--- a/src/binding/fortran/use_mpi_f08/f08ts/test_f08ts.f90
+++ /dev/null
@@ -1,24 +0,0 @@
-
-subroutine MPI_Test_f08 (request, flag, status, ierror)
-    use,intrinsic :: iso_c_binding, only: c_int
-    use :: mpi_f08, only : MPI_Request, MPI_Status, assignment(=)
-    use :: mpi_c_interface, only: C_Request, c_int, c_Status, MPIR_Test_c
-
-    type(MPI_Request), intent(inout) :: request
-    LOGICAL,           intent(out)   :: flag
-    type(MPI_Status)                 :: status
-    integer,optional,  intent(out)   :: ierror
-    integer(C_Request) :: request_c
-    integer(c_int)     :: flag_c
-    type(c_Status) :: status_c
-    integer(c_int)     :: res
-
-    request_c = request%MPI_VAL
-    status_c = status
-    res = MPIR_Test_C (request_c, flag_c, status_c)
-    request%MPI_VAL = request_c
-    status = status_c
-    flag = (flag_c /= 0)
-    if (present(ierror)) ierror = res
-
-end subroutine MPI_Test_f08
diff --git a/src/binding/fortran/use_mpi_f08/f08ts/type_create_f90_complex_f08ts.f90 b/src/binding/fortran/use_mpi_f08/f08ts/type_create_f90_complex_f08ts.f90
deleted file mode 100644
index b49b03f..0000000
--- a/src/binding/fortran/use_mpi_f08/f08ts/type_create_f90_complex_f08ts.f90
+++ /dev/null
@@ -1,22 +0,0 @@
-
-subroutine MPI_Type_create_f90_complex_f08 (p, r, newtype, ierror)
-    use, intrinsic :: iso_c_binding, only: c_int
-    use :: mpi_f08, only : MPI_Datatype
-    use :: mpi_c_interface, only: c_Datatype, MPIR_Type_create_f90_complex_c
-    integer,intent(in) :: p
-    integer,intent(in) :: r
-    type(MPI_Datatype),intent(out) :: newtype
-    integer,optional, intent(out) :: ierror
-
-    integer(c_int) :: p_c
-    integer(c_int) :: r_c
-    integer(c_Datatype) :: newtype_c
-    integer(c_int) :: res
-
-    p_c = p
-    r_c = r
-    res = MPIR_Type_create_f90_complex_c (p_c, r_c, newtype_c)
-    newtype%MPI_VAL = newtype_c
-    if (present(ierror)) ierror = res
-
-end subroutine MPI_Type_create_f90_complex_f08
diff --git a/src/binding/fortran/use_mpi_f08/f08ts/type_create_f90_integer_f08ts.f90 b/src/binding/fortran/use_mpi_f08/f08ts/type_create_f90_integer_f08ts.f90
deleted file mode 100644
index e1f2885..0000000
--- a/src/binding/fortran/use_mpi_f08/f08ts/type_create_f90_integer_f08ts.f90
+++ /dev/null
@@ -1,18 +0,0 @@
-
-subroutine MPI_Type_create_f90_integer_f08 (r, newtype, ierror)
-    use,intrinsic :: iso_c_binding, only: c_int
-    use :: mpi_f08, only : MPI_Datatype
-    use :: mpi_c_interface, only: c_Datatype, MPIR_Type_create_f90_integer_c
-    integer,intent(in) :: r
-    type(MPI_Datatype),intent(out) :: newtype
-    integer,optional, intent(out) :: ierror
-    integer(c_int) :: r_c
-    integer(c_Datatype) :: newtype_c
-    integer(c_int) :: res
-
-    r_c = r
-    res = MPIR_Type_create_f90_integer_c (r_c, newtype_c)
-    newtype%MPI_VAL = newtype_c
-    if (present(ierror)) ierror = res
-
-end subroutine MPI_Type_create_f90_integer_f08
diff --git a/src/binding/fortran/use_mpi_f08/f08ts/type_create_f90_real_f08ts.f90 b/src/binding/fortran/use_mpi_f08/f08ts/type_create_f90_real_f08ts.f90
deleted file mode 100644
index 34e0022..0000000
--- a/src/binding/fortran/use_mpi_f08/f08ts/type_create_f90_real_f08ts.f90
+++ /dev/null
@@ -1,25 +0,0 @@
-
-subroutine MPI_Type_create_f90_real_f08 (p, r, newtype, ierror)
-    use,intrinsic :: iso_c_binding, only: c_int
-    use :: mpi_f08, only : MPI_Datatype
-    use :: mpi_c_interface, only: c_Datatype, MPIR_Type_create_f90_real_c
-
-    integer,intent(in) :: p
-    integer,intent(in) :: r
-    type(MPI_Datatype),intent(out) :: newtype
-    integer,optional, intent(out) :: ierror
-
-    integer(c_int) :: p_c
-    integer(c_int) :: r_c
-    integer(c_Datatype) :: newtype_c
-    integer(c_int) :: res
-
-    p_c = p
-    r_c = r
-    res = MPIR_Type_create_f90_real_c (p_c, r_c, newtype_c)
-    newtype%MPI_VAL = newtype_c
-    if (present(ierror)) ierror = res
-
-end subroutine MPI_Type_create_f90_real_f08
-
-
diff --git a/src/binding/fortran/use_mpi_f08/f08ts/type_match_size_f08ts.f90 b/src/binding/fortran/use_mpi_f08/f08ts/type_match_size_f08ts.f90
deleted file mode 100644
index 9a0a215..0000000
--- a/src/binding/fortran/use_mpi_f08/f08ts/type_match_size_f08ts.f90
+++ /dev/null
@@ -1,25 +0,0 @@
-
-subroutine MPI_Type_match_size_f08 (typeclass, size, datatype, ierror)
-    use,intrinsic :: iso_c_binding, only: c_int
-    use :: mpi_f08, only : MPI_Datatype
-    use :: mpi_c_interface, only: c_Datatype, MPIR_Type_match_size_c
-
-    integer,intent(in) :: typeclass
-    integer,intent(in) :: size
-    type(MPI_Datatype),intent(out) :: datatype
-    integer,optional,intent(out) :: ierror
-
-    integer(c_int) :: typeclass_c
-    integer(c_int) :: size_c
-    integer(c_Datatype) :: datatype_c
-    integer(c_int) :: res
-
-    typeclass_c = typeclass
-    size_c = size
-    res = MPIR_Type_match_size_c (typeclass_c, size_c, datatype_c)
-    datatype%MPI_VAL = datatype_c
-    if (present(ierror)) ierror = res
-
-end subroutine MPI_Type_match_size_f08
-
-
diff --git a/src/binding/fortran/use_mpi_f08/f08ts/wait_f08ts.f90 b/src/binding/fortran/use_mpi_f08/f08ts/wait_f08ts.f90
deleted file mode 100644
index 7ec12ef..0000000
--- a/src/binding/fortran/use_mpi_f08/f08ts/wait_f08ts.f90
+++ /dev/null
@@ -1,22 +0,0 @@
-
-subroutine MPI_Wait_f08(request, status, ierror)
-    use,intrinsic :: iso_c_binding, only: c_int
-    use :: mpi_f08, only : MPI_Request, MPI_Status, assignment(=)
-    use :: mpi_c_interface, only: c_Request, MPIR_Wait_c, c_Status
-
-    type(MPI_Request), intent(inout) :: request
-    type(MPI_Status)                 :: status
-    integer, optional, intent(out)   :: ierror
-
-    integer(C_Request) :: request_c
-    integer(c_int)     :: res
-    type(c_Status) :: status_c
-
-    request_c = request%MPI_VAL
-    res = MPIR_Wait_c (request_c, status_c)
-    request%MPI_VAL = request_c
-    status = status_c
-    if (present(ierror)) ierror = res
-
-end subroutine MPI_Wait_f08
-
diff --git a/src/binding/fortran/use_mpi_f08/f08ts/wtick_f08ts.f90 b/src/binding/fortran/use_mpi_f08/f08ts/wtick_f08ts.f90
deleted file mode 100644
index 78b8500..0000000
--- a/src/binding/fortran/use_mpi_f08/f08ts/wtick_f08ts.f90
+++ /dev/null
@@ -1,11 +0,0 @@
-!--> MPIR_Wtick
-
-function MPI_Wtick_f08( ) Result(tick)
-     use,intrinsic :: iso_c_binding, only: c_double
-      use :: mpi_c_interface_nobuf, only: MPIR_Wtick_c
-      DOUBLE PRECISION :: tick
-      real(c_double)   :: tick_c
-
-      tick_c = MPIR_Wtick_c()
-      tick = tick_c
-end function MPI_Wtick_f08
\ No newline at end of file
diff --git a/src/binding/fortran/use_mpi_f08/f08ts/wtime_f08ts.f90 b/src/binding/fortran/use_mpi_f08/f08ts/wtime_f08ts.f90
deleted file mode 100644
index 683c8c5..0000000
--- a/src/binding/fortran/use_mpi_f08/f08ts/wtime_f08ts.f90
+++ /dev/null
@@ -1,9 +0,0 @@
-function MPI_Wtime_f08( ) Result(time)
-     use,intrinsic :: iso_c_binding, only: c_double
-      use :: mpi_c_interface_nobuf, only: MPIR_Wtime_c
-      DOUBLE PRECISION :: time
-      real(c_double)   :: time_c
-
-      time_c = MPIR_Wtime_c()
-      time = time_c
-end function MPI_Wtime_f08
\ No newline at end of file
diff --git a/src/binding/fortran/use_mpi_f08/mpi_c_interface.F90 b/src/binding/fortran/use_mpi_f08/mpi_c_interface.F90
new file mode 100644
index 0000000..bc75f7c
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/mpi_c_interface.F90
@@ -0,0 +1,11 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+module mpi_c_interface
+    use mpi_c_interface_types
+    use mpi_c_interface_nobuf
+    use mpi_c_interface_cdesc
+    use mpi_c_interface_glue
+end module mpi_c_interface
diff --git a/src/binding/fortran/use_mpi_f08/mpi_c_interface.f90 b/src/binding/fortran/use_mpi_f08/mpi_c_interface.f90
deleted file mode 100644
index c6361c0..0000000
--- a/src/binding/fortran/use_mpi_f08/mpi_c_interface.f90
+++ /dev/null
@@ -1,5 +0,0 @@
-module mpi_c_interface
-    use mpi_c_interface_types
-    use mpi_c_interface_nobuf
-    use mpi_c_interface_cdesc
-end module mpi_c_interface
diff --git a/src/binding/fortran/use_mpi_f08/mpi_c_interface_cdesc.F90 b/src/binding/fortran/use_mpi_f08/mpi_c_interface_cdesc.F90
new file mode 100644
index 0000000..b84aca1
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/mpi_c_interface_cdesc.F90
@@ -0,0 +1,1440 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+module mpi_c_interface_cdesc
+
+implicit none
+
+interface
+
+function MPIR_Bsend_cdesc(buf, count, datatype, dest, tag, comm) &
+    bind(C, name="MPIR_Bsend_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Datatype, c_Comm
+    implicit none
+    type(*), dimension(..), intent(in) :: buf
+    integer(c_int), value, intent(in) :: count, dest, tag
+    integer(c_Datatype), value, intent(in) :: datatype
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_int) :: ierror
+end function MPIR_Bsend_cdesc
+
+function MPIR_Bsend_init_cdesc(buf, count, datatype, dest, tag, comm, request) &
+    bind(C, name="MPIR_Bsend_init_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Datatype, c_Comm, c_Request
+    implicit none
+    type(*), dimension(..) :: buf
+    integer(c_int), value, intent(in) :: count, dest, tag
+    integer(c_Datatype), value, intent(in) :: datatype
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_Request), intent(out) :: request
+    integer(c_int) :: ierror
+end function MPIR_Bsend_init_cdesc
+
+function MPIR_Buffer_attach_cdesc(buffer, size) &
+    bind(C, name="MPIR_Buffer_attach_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    implicit none
+    type(*), dimension(..) :: buffer
+    integer(c_int), value, intent(in) :: size
+    integer(c_int) :: ierror
+end function MPIR_Buffer_attach_cdesc
+
+function MPIR_Ibsend_cdesc(buf, count, datatype, dest, tag, comm, request) &
+    bind(C, name="MPIR_Ibsend_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Datatype, c_Comm, c_Request
+    implicit none
+    type(*), dimension(..), intent(in) :: buf
+    integer(c_int), value, intent(in) :: count, dest, tag
+    integer(c_Datatype), value, intent(in) :: datatype
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_Request), intent(out) :: request
+    integer(c_int) :: ierror
+end function MPIR_Ibsend_cdesc
+
+function MPIR_Irecv_cdesc(buf, count, datatype, source, tag, comm, request) &
+    bind(C, name="MPIR_Irecv_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Datatype, c_Comm, c_Request
+    implicit none
+    type(*), dimension(..) :: buf
+    integer(c_int), value, intent(in) :: count, source, tag
+    integer(c_Datatype), value, intent(in) :: datatype
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_Request), intent(out) :: request
+    integer(c_int) :: ierror
+end function MPIR_Irecv_cdesc
+
+function MPIR_Irsend_cdesc(buf, count, datatype, dest, tag, comm, request) &
+    bind(C, name="MPIR_Irsend_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Datatype, c_Comm, c_Request
+    implicit none
+    type(*), dimension(..), intent(in) :: buf
+    integer(c_int), value, intent(in) :: count, dest, tag
+    integer(c_Datatype), value, intent(in) :: datatype
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_Request), intent(out) :: request
+    integer(c_int) :: ierror
+end function MPIR_Irsend_cdesc
+
+function MPIR_Isend_cdesc(buf, count, datatype, dest, tag, comm, request) &
+    bind(C, name="MPIR_Isend_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Datatype, c_Comm, c_Request
+    implicit none
+    type(*), dimension(..), intent(in) :: buf
+    integer(c_int), value, intent(in) :: count, dest, tag
+    integer(c_Datatype), value, intent(in) :: datatype
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_Request), intent(out) :: request
+    integer(c_int) :: ierror
+end function MPIR_Isend_cdesc
+
+function MPIR_Issend_cdesc(buf, count, datatype, dest, tag, comm, request) &
+    bind(C, name="MPIR_Issend_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Datatype, c_Comm, c_Request
+    implicit none
+    type(*), dimension(..), intent(in) :: buf
+    integer(c_int), value, intent(in) :: count, dest, tag
+    integer(c_Datatype), value, intent(in) :: datatype
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_Request), intent(out) :: request
+    integer(c_int) :: ierror
+end function MPIR_Issend_cdesc
+
+function MPIR_Recv_cdesc(buf, count, datatype, source, tag, comm, status) &
+    bind(C, name="MPIR_Recv_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_ptr
+    use :: mpi_c_interface_types, only : c_Datatype, c_Comm
+    implicit none
+    type(*), dimension(..) :: buf
+    integer(c_int), value, intent(in) :: count, source, tag
+    integer(c_Datatype), value, intent(in) :: datatype
+    integer(c_Comm), value, intent(in) :: comm
+    type(c_ptr), value, intent(in) :: status
+    integer(c_int) :: ierror
+end function MPIR_Recv_cdesc
+
+function MPIR_Recv_init_cdesc(buf, count, datatype, source, tag, comm, request) &
+    bind(C, name="MPIR_Recv_init_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Datatype, c_Comm, c_Request
+    implicit none
+    type(*), dimension(..) :: buf
+    integer(c_int), value, intent(in) :: count, source, tag
+    integer(c_Datatype), value, intent(in) :: datatype
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_Request), intent(out) :: request
+    integer(c_int) :: ierror
+end function MPIR_Recv_init_cdesc
+
+function MPIR_Rsend_cdesc(buf, count, datatype, dest, tag, comm) &
+    bind(C, name="MPIR_Rsend_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Datatype, c_Comm
+    implicit none
+    type(*), dimension(..), intent(in) :: buf
+    integer(c_int), value, intent(in) :: count, dest, tag
+    integer(c_Datatype), value, intent(in) :: datatype
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_int) :: ierror
+end function MPIR_Rsend_cdesc
+
+function MPIR_Rsend_init_cdesc(buf, count, datatype, dest, tag, comm, request) &
+    bind(C, name="MPIR_Rsend_init_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Datatype, c_Comm, c_Request
+    implicit none
+    type(*), dimension(..) :: buf
+    integer(c_int), value, intent(in) :: count, dest, tag
+    integer(c_Datatype), value, intent(in) :: datatype
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_Request), intent(out) :: request
+    integer(c_int) :: ierror
+end function MPIR_Rsend_init_cdesc
+
+function MPIR_Send_cdesc(buf, count, datatype, dest, tag, comm) &
+    bind(C, name="MPIR_Send_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Datatype, c_Comm
+    implicit none
+    type(*), dimension(..), intent(in) :: buf
+    integer(c_int), value, intent(in) :: count, dest, tag
+    integer(c_Datatype), value, intent(in) :: datatype
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_int) :: ierror
+end function MPIR_Send_cdesc
+
+function MPIR_Sendrecv_cdesc(sendbuf, sendcount, sendtype, dest, sendtag, recvbuf, &
+           recvcount, recvtype, source, recvtag, comm, status) &
+    bind(C, name="MPIR_Sendrecv_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_ptr
+    use :: mpi_c_interface_types, only : c_Datatype, c_Comm
+    implicit none
+    type(*), dimension(..), intent(in) :: sendbuf
+    type(*), dimension(..) :: recvbuf
+    integer(c_int), value, intent(in) :: sendcount, dest, sendtag, recvcount, source, recvtag
+    integer(c_Datatype), value, intent(in) :: sendtype, recvtype
+    integer(c_Comm), value, intent(in) :: comm
+    type(c_ptr), value, intent(in) :: status
+    integer(c_int) :: ierror
+end function MPIR_Sendrecv_cdesc
+
+function MPIR_Sendrecv_replace_cdesc(buf, count, datatype, dest, sendtag, source, recvtag, &
+           comm, status) &
+    bind(C, name="MPIR_Sendrecv_replace_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_ptr
+    use :: mpi_c_interface_types, only : c_Datatype, c_Comm
+    implicit none
+    type(*), dimension(..) :: buf
+    integer(c_int), value, intent(in) :: count, dest, sendtag, source, recvtag
+    integer(c_Datatype), value, intent(in) :: datatype
+    integer(c_Comm), value, intent(in) :: comm
+    type(c_ptr), value, intent(in) :: status
+    integer(c_int) :: ierror
+end function MPIR_Sendrecv_replace_cdesc
+
+function MPIR_Send_init_cdesc(buf, count, datatype, dest, tag, comm, request) &
+    bind(C, name="MPIR_Send_init_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Datatype, c_Comm, c_Request
+    implicit none
+    type(*), dimension(..) :: buf
+    integer(c_int), value, intent(in) :: count, dest, tag
+    integer(c_Datatype), value, intent(in) :: datatype
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_Request), intent(out) :: request
+    integer(c_int) :: ierror
+end function MPIR_Send_init_cdesc
+
+function MPIR_Ssend_cdesc(buf, count, datatype, dest, tag, comm) &
+    bind(C, name="MPIR_Ssend_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Datatype, c_Comm
+    implicit none
+    type(*), dimension(..), intent(in) :: buf
+    integer(c_int), value, intent(in) :: count, dest, tag
+    integer(c_Datatype), value, intent(in) :: datatype
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_int) :: ierror
+end function MPIR_Ssend_cdesc
+
+function MPIR_Ssend_init_cdesc(buf, count, datatype, dest, tag, comm, request) &
+    bind(C, name="MPIR_Ssend_init_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Datatype, c_Comm, c_Request
+    implicit none
+    type(*), dimension(..) :: buf
+    integer(c_int), value, intent(in) :: count, dest, tag
+    integer(c_Datatype), value, intent(in) :: datatype
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_Request), intent(out) :: request
+    integer(c_int) :: ierror
+end function MPIR_Ssend_init_cdesc
+
+function MPIR_Get_address_cdesc(location, address) &
+    bind(C, name="MPIR_Get_address_cdesc") result(ierror)
+    use :: mpi_f08_compile_constants, only : MPI_ADDRESS_KIND
+    use, intrinsic :: iso_c_binding, only : c_int
+    implicit none
+    type(*), dimension(..) :: location
+    integer(MPI_ADDRESS_KIND), intent(out) :: address
+    integer(c_int) :: ierror
+end function MPIR_Get_address_cdesc
+
+function MPIR_Pack_cdesc(inbuf, incount, datatype, outbuf, outsize, position, comm) &
+    bind(C, name="MPIR_Pack_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Datatype, c_Comm
+    implicit none
+    type(*), dimension(..), intent(in) :: inbuf
+    type(*), dimension(..) :: outbuf
+    integer(c_int), value, intent(in) :: incount, outsize
+    integer(c_Datatype), value, intent(in) :: datatype
+    integer(c_int), intent(inout) :: position
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_int) :: ierror
+end function MPIR_Pack_cdesc
+
+function MPIR_Pack_external_cdesc(datarep, inbuf, incount, datatype, outbuf, outsize, position) &
+    bind(C, name="MPIR_Pack_external_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_char
+    use :: mpi_f08_compile_constants, only : MPI_ADDRESS_KIND
+    use :: mpi_c_interface_types, only : c_Datatype
+    implicit none
+    character(kind=c_char), intent(in) :: datarep(*)
+    type(*), dimension(..), intent(in) :: inbuf
+    type(*), dimension(..) :: outbuf
+    integer(c_int), value, intent(in) :: incount
+    integer(c_Datatype), value, intent(in) :: datatype
+    integer(MPI_ADDRESS_KIND), value, intent(in) :: outsize
+    integer(MPI_ADDRESS_KIND), intent(inout) :: position
+    integer(c_int) :: ierror
+end function MPIR_Pack_external_cdesc
+
+function MPIR_Unpack_cdesc(inbuf, insize, position, outbuf, outcount, datatype, comm) &
+    bind(C, name="MPIR_Unpack_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Datatype, c_Comm
+    implicit none
+    type(*), dimension(..), intent(in) :: inbuf
+    type(*), dimension(..) :: outbuf
+    integer(c_int), value, intent(in) :: insize, outcount
+    integer(c_int), intent(inout) :: position
+    integer(c_Datatype), value, intent(in) :: datatype
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_int) :: ierror
+end function MPIR_Unpack_cdesc
+
+function MPIR_Unpack_external_cdesc(datarep, inbuf, insize, position, outbuf, outcount, datatype) &
+    bind(C, name="MPIR_Unpack_external_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_char
+    use :: mpi_f08_compile_constants, only : MPI_ADDRESS_KIND
+    use :: mpi_c_interface_types, only : c_Datatype
+    implicit none
+    character(kind=c_char), intent(in) :: datarep(*)
+    type(*), dimension(..), intent(in) :: inbuf
+    type(*), dimension(..) :: outbuf
+    integer(MPI_ADDRESS_KIND), value, intent(in) :: insize
+    integer(MPI_ADDRESS_KIND), intent(inout) :: position
+    integer(c_int), value, intent(in) :: outcount
+    integer(c_Datatype), value, intent(in) :: datatype
+    integer(c_int) :: ierror
+end function MPIR_Unpack_external_cdesc
+
+function MPIR_Allgather_cdesc(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, comm) &
+    bind(C, name="MPIR_Allgather_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Datatype, c_Comm
+    implicit none
+    type(*), dimension(..), intent(in) :: sendbuf
+    type(*), dimension(..) :: recvbuf
+    integer(c_int), value, intent(in) :: sendcount, recvcount
+    integer(c_Datatype), value, intent(in) :: sendtype, recvtype
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_int) :: ierror
+end function MPIR_Allgather_cdesc
+
+function MPIR_Iallgather_cdesc(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, comm, request) &
+    bind(C, name="MPIR_Iallgather_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Datatype, c_Comm, c_Request
+    implicit none
+    type(*), dimension(..), intent(in) :: sendbuf
+    type(*), dimension(..) :: recvbuf
+    integer(c_int), value, intent(in) :: sendcount, recvcount
+    integer(c_Datatype), value, intent(in) :: sendtype, recvtype
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_Request), intent(out) :: request
+    integer(c_int) :: ierror
+end function MPIR_Iallgather_cdesc
+
+function MPIR_Allgatherv_cdesc(sendbuf, sendcount, sendtype, recvbuf, recvcounts, displs, recvtype, comm) &
+    bind(C, name="MPIR_Allgatherv_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Datatype, c_Comm
+    implicit none
+    type(*), dimension(..), intent(in) :: sendbuf
+    type(*), dimension(..) :: recvbuf
+    integer(c_int), value, intent(in) :: sendcount
+    integer(c_int), intent(in) :: recvcounts(*), displs(*)
+    integer(c_Datatype), value, intent(in) :: sendtype, recvtype
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_int) :: ierror
+end function MPIR_Allgatherv_cdesc
+
+function MPIR_Iallgatherv_cdesc(sendbuf, sendcount, sendtype, recvbuf, recvcounts, displs, &
+           recvtype, comm, request) &
+    bind(C, name="MPIR_Iallgatherv_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Datatype, c_Comm, c_Request
+    implicit none
+    type(*), dimension(..), intent(in) :: sendbuf
+    type(*), dimension(..) :: recvbuf
+    integer(c_int), value, intent(in) :: sendcount
+    integer(c_int), intent(in) :: recvcounts(*), displs(*)
+    integer(c_Datatype), value, intent(in) :: sendtype, recvtype
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_Request), intent(out) :: request
+    integer(c_int) :: ierror
+end function MPIR_Iallgatherv_cdesc
+
+function MPIR_Allreduce_cdesc(sendbuf, recvbuf, count, datatype, op, comm) &
+    bind(C, name="MPIR_Allreduce_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Datatype, c_Op, c_Comm
+    implicit none
+    type(*), dimension(..), intent(in) :: sendbuf
+    type(*), dimension(..) :: recvbuf
+    integer(c_int), value, intent(in) :: count
+    integer(c_Datatype), value, intent(in) :: datatype
+    integer(c_Op), value, intent(in) :: op
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_int) :: ierror
+end function MPIR_Allreduce_cdesc
+
+function MPIR_Iallreduce_cdesc(sendbuf, recvbuf, count, datatype, op, comm, request) &
+    bind(C, name="MPIR_Iallreduce_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Datatype, c_Op, c_Comm, c_Request
+    implicit none
+    type(*), dimension(..), intent(in) :: sendbuf
+    type(*), dimension(..) :: recvbuf
+    integer(c_int), value, intent(in) :: count
+    integer(c_Datatype), value, intent(in) :: datatype
+    integer(c_Op), value, intent(in) :: op
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_Request), intent(out) :: request
+    integer(c_int) :: ierror
+end function MPIR_Iallreduce_cdesc
+
+function MPIR_Alltoall_cdesc(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, comm) &
+    bind(C, name="MPIR_Alltoall_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Datatype, c_Comm
+    implicit none
+    type(*), dimension(..), intent(in) :: sendbuf
+    type(*), dimension(..) :: recvbuf
+    integer(c_int), value, intent(in) :: sendcount, recvcount
+    integer(c_Datatype), value, intent(in) :: sendtype, recvtype
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_int) :: ierror
+end function MPIR_Alltoall_cdesc
+
+function MPIR_Ialltoall_cdesc(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, comm, request) &
+    bind(C, name="MPIR_Ialltoall_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Datatype, c_Comm, c_Request
+    implicit none
+    type(*), dimension(..), intent(in) :: sendbuf
+    type(*), dimension(..) :: recvbuf
+    integer(c_int), value, intent(in) :: sendcount, recvcount
+    integer(c_Datatype), value, intent(in) :: sendtype, recvtype
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_Request), intent(out) :: request
+    integer(c_int) :: ierror
+end function MPIR_Ialltoall_cdesc
+
+function MPIR_Alltoallv_cdesc(sendbuf, sendcounts, sdispls, sendtype, recvbuf, recvcounts, &
+           rdispls, recvtype, comm) &
+    bind(C, name="MPIR_Alltoallv_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Datatype, c_Comm
+    implicit none
+    type(*), dimension(..), intent(in) :: sendbuf
+    type(*), dimension(..) :: recvbuf
+    integer(c_int), intent(in) :: sendcounts(*), sdispls(*), recvcounts(*), rdispls(*)
+    integer(c_Datatype), value, intent(in) :: sendtype, recvtype
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_int) :: ierror
+end function MPIR_Alltoallv_cdesc
+
+function MPIR_Ialltoallv_cdesc(sendbuf, sendcounts, sdispls, sendtype, recvbuf, recvcounts, &
+           rdispls, recvtype, comm, request) &
+    bind(C, name="MPIR_Ialltoallv_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Datatype, c_Comm, c_Request
+    implicit none
+    type(*), dimension(..), intent(in) :: sendbuf
+    type(*), dimension(..) :: recvbuf
+    integer(c_int), intent(in) :: sendcounts(*), sdispls(*), recvcounts(*), rdispls(*)
+    integer(c_Datatype), value, intent(in) :: sendtype, recvtype
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_Request), intent(out) :: request
+    integer(c_int) :: ierror
+end function MPIR_Ialltoallv_cdesc
+
+function MPIR_Alltoallw_cdesc(sendbuf, sendcounts, sdispls, sendtypes, recvbuf, recvcounts, &
+           rdispls, recvtypes, comm) &
+    bind(C, name="MPIR_Alltoallw_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Datatype, c_Comm
+    implicit none
+    type(*), dimension(..), intent(in) :: sendbuf
+    type(*), dimension(..) :: recvbuf
+    integer(c_int), intent(in) :: sendcounts(*), sdispls(*), recvcounts(*), rdispls(*)
+    integer(c_Datatype), intent(in) :: sendtypes(*), recvtypes(*)
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_int) :: ierror
+end function MPIR_Alltoallw_cdesc
+
+function MPIR_Ialltoallw_cdesc(sendbuf, sendcounts, sdispls, sendtypes, recvbuf, recvcounts, &
+           rdispls, recvtypes, comm, request) &
+    bind(C, name="MPIR_Ialltoallw_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Datatype, c_Comm, c_Request
+    implicit none
+    type(*), dimension(..), intent(in) :: sendbuf
+    type(*), dimension(..) :: recvbuf
+    integer(c_int), intent(in) :: sendcounts(*), sdispls(*), recvcounts(*), rdispls(*)
+    integer(c_Datatype), intent(in) :: sendtypes(*), recvtypes(*)
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_Request), intent(out) :: request
+    integer(c_int) :: ierror
+end function MPIR_Ialltoallw_cdesc
+
+function MPIR_Bcast_cdesc(buffer, count, datatype, root, comm) &
+    bind(C, name="MPIR_Bcast_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Datatype, c_Comm
+    implicit none
+    type(*), dimension(..) :: buffer
+    integer(c_int), value, intent(in) :: count, root
+    integer(c_Datatype), value, intent(in) :: datatype
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_int) :: ierror
+end function MPIR_Bcast_cdesc
+
+function MPIR_Ibcast_cdesc(buffer, count, datatype, root, comm, request) &
+    bind(C, name="MPIR_Ibcast_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Datatype, c_Comm, c_Request
+    implicit none
+    type(*), dimension(..) :: buffer
+    integer(c_int), value, intent(in) :: count, root
+    integer(c_Datatype), value, intent(in) :: datatype
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_Request), intent(out) :: request
+    integer(c_int) :: ierror
+end function MPIR_Ibcast_cdesc
+
+function MPIR_Exscan_cdesc(sendbuf, recvbuf, count, datatype, op, comm) &
+    bind(C, name="MPIR_Exscan_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Datatype, c_Op, c_Comm
+    implicit none
+    type(*), dimension(..), intent(in) :: sendbuf
+    type(*), dimension(..) :: recvbuf
+    integer(c_int), value, intent(in) :: count
+    integer(c_Datatype), value, intent(in) :: datatype
+    integer(c_Op), value, intent(in) :: op
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_int) :: ierror
+end function MPIR_Exscan_cdesc
+
+function MPIR_Iexscan_cdesc(sendbuf, recvbuf, count, datatype, op, comm, request) &
+    bind(C, name="MPIR_Iexscan_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Datatype, c_Op, c_Comm, c_Request
+    implicit none
+    type(*), dimension(..), intent(in) :: sendbuf
+    type(*), dimension(..) :: recvbuf
+    integer(c_int), value, intent(in) :: count
+    integer(c_Datatype), value, intent(in) :: datatype
+    integer(c_Op), value, intent(in) :: op
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_Request), intent(out) :: request
+    integer(c_int) :: ierror
+end function MPIR_Iexscan_cdesc
+
+function MPIR_Gather_cdesc(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, root, comm) &
+    bind(C, name="MPIR_Gather_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Datatype, c_Comm
+    implicit none
+    type(*), dimension(..), intent(in) :: sendbuf
+    type(*), dimension(..) :: recvbuf
+    integer(c_int), value, intent(in) :: sendcount, recvcount, root
+    integer(c_Datatype), value, intent(in) :: sendtype, recvtype
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_int) :: ierror
+end function MPIR_Gather_cdesc
+
+function MPIR_Igather_cdesc(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, &
+            root, comm, request) &
+    bind(C, name="MPIR_Igather_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Datatype, c_Comm, c_Request
+    implicit none
+    type(*), dimension(..), intent(in) :: sendbuf
+    type(*), dimension(..) :: recvbuf
+    integer(c_int), value, intent(in) :: sendcount, recvcount, root
+    integer(c_Datatype), value, intent(in) :: sendtype, recvtype
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_Request), intent(out) :: request
+    integer(c_int) :: ierror
+end function MPIR_Igather_cdesc
+
+function MPIR_Gatherv_cdesc(sendbuf, sendcount, sendtype, recvbuf, recvcounts, displs, recvtype, &
+           root, comm) &
+    bind(C, name="MPIR_Gatherv_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Datatype, c_Comm
+    implicit none
+    type(*), dimension(..), intent(in) :: sendbuf
+    type(*), dimension(..) :: recvbuf
+    integer(c_int), value, intent(in) :: sendcount, root
+    integer(c_int), intent(in) :: recvcounts(*), displs(*)
+    integer(c_Datatype), value, intent(in) :: sendtype, recvtype
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_int) :: ierror
+end function MPIR_Gatherv_cdesc
+
+function MPIR_Igatherv_cdesc(sendbuf, sendcount, sendtype, recvbuf, recvcounts, displs, &
+           recvtype, root, comm, request) &
+    bind(C, name="MPIR_Igatherv_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Datatype, c_Comm, c_Request
+    implicit none
+    type(*), dimension(..), intent(in) :: sendbuf
+    type(*), dimension(..) :: recvbuf
+    integer(c_int), value, intent(in) :: sendcount, root
+    integer(c_int), intent(in) :: recvcounts(*), displs(*)
+    integer(c_Datatype), value, intent(in) :: sendtype, recvtype
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_Request), intent(out) :: request
+    integer(c_int) :: ierror
+end function MPIR_Igatherv_cdesc
+
+function MPIR_Reduce_cdesc(sendbuf, recvbuf, count, datatype, op, root, comm) &
+    bind(C, name="MPIR_Reduce_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Datatype, c_Op, c_Comm
+    implicit none
+    type(*), dimension(..), intent(in) :: sendbuf
+    type(*), dimension(..) :: recvbuf
+    integer(c_int), value, intent(in) :: count, root
+    integer(c_Datatype), value, intent(in) :: datatype
+    integer(c_Op), value, intent(in) :: op
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_int) :: ierror
+end function MPIR_Reduce_cdesc
+
+function MPIR_Ireduce_cdesc(sendbuf, recvbuf, count, datatype, op, root, comm, request) &
+    bind(C, name="MPIR_Ireduce_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Datatype, c_Op, c_Comm, c_Request
+    implicit none
+    type(*), dimension(..), intent(in) :: sendbuf
+    type(*), dimension(..) :: recvbuf
+    integer(c_int), value, intent(in) :: count, root
+    integer(c_Datatype), value, intent(in) :: datatype
+    integer(c_Op), value, intent(in) :: op
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_Request), intent(out) :: request
+    integer(c_int) :: ierror
+end function MPIR_Ireduce_cdesc
+
+function MPIR_Reduce_local_cdesc(inbuf, inoutbuf, count, datatype, op) &
+    bind(C, name="MPIR_Reduce_local_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Datatype, c_Op
+    implicit none
+    type(*), dimension(..), intent(in) :: inbuf
+    type(*), dimension(..) :: inoutbuf
+    integer(c_int), value, intent(in) :: count
+    integer(c_Datatype), value, intent(in) :: datatype
+    integer(c_Op), value, intent(in) :: op
+    integer(c_int) :: ierror
+end function MPIR_Reduce_local_cdesc
+
+function MPIR_Reduce_scatter_cdesc(sendbuf, recvbuf, recvcounts, datatype, op, comm) &
+    bind(C, name="MPIR_Reduce_scatter_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Datatype, c_Op, c_Comm
+    implicit none
+    type(*), dimension(..), intent(in) :: sendbuf
+    type(*), dimension(..) :: recvbuf
+    integer(c_int), intent(in) :: recvcounts(*)
+    integer(c_Datatype), value, intent(in) :: datatype
+    integer(c_Op), value, intent(in) :: op
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_int) :: ierror
+end function MPIR_Reduce_scatter_cdesc
+
+function MPIR_Ireduce_scatter_cdesc(sendbuf, recvbuf, recvcounts, datatype, op, comm, request) &
+    bind(C, name="MPIR_Ireduce_scatter_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Datatype, c_Op, c_Comm, c_Request
+    implicit none
+    type(*), dimension(..), intent(in) :: sendbuf
+    type(*), dimension(..) :: recvbuf
+    integer(c_int), intent(in) :: recvcounts(*)
+    integer(c_Datatype), value, intent(in) :: datatype
+    integer(c_Op), value, intent(in) :: op
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_Request), intent(out) :: request
+    integer(c_int) :: ierror
+end function MPIR_Ireduce_scatter_cdesc
+
+function MPIR_Reduce_scatter_block_cdesc(sendbuf, recvbuf, recvcount, datatype, op, comm) &
+    bind(C, name="MPIR_Reduce_scatter_block_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Datatype, c_Op, c_Comm
+    implicit none
+    type(*), dimension(..), intent(in) :: sendbuf
+    type(*), dimension(..) :: recvbuf
+    integer(c_int), value, intent(in) :: recvcount
+    integer(c_Datatype), value, intent(in) :: datatype
+    integer(c_Op), value, intent(in) :: op
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_int) :: ierror
+end function MPIR_Reduce_scatter_block_cdesc
+
+function MPIR_Ireduce_scatter_block_cdesc(sendbuf, recvbuf, recvcount, datatype, op, comm, request) &
+    bind(C, name="MPIR_Ireduce_scatter_block_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Datatype, c_Op, c_Comm, c_Request
+    implicit none
+    type(*), dimension(..), intent(in) :: sendbuf
+    type(*), dimension(..) :: recvbuf
+    integer(c_int), value, intent(in) :: recvcount
+    integer(c_Datatype), value, intent(in) :: datatype
+    integer(c_Op), value, intent(in) :: op
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_Request), intent(out) :: request
+    integer(c_int) :: ierror
+end function MPIR_Ireduce_scatter_block_cdesc
+
+function MPIR_Scan_cdesc(sendbuf, recvbuf, count, datatype, op, comm) &
+    bind(C, name="MPIR_Scan_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Datatype, c_Op, c_Comm
+    implicit none
+    type(*), dimension(..), intent(in) :: sendbuf
+    type(*), dimension(..) :: recvbuf
+    integer(c_int), value, intent(in) :: count
+    integer(c_Datatype), value, intent(in) :: datatype
+    integer(c_Op), value, intent(in) :: op
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_int) :: ierror
+end function MPIR_Scan_cdesc
+
+function MPIR_Iscan_cdesc(sendbuf, recvbuf, count, datatype, op, comm, request) &
+    bind(C, name="MPIR_Iscan_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Datatype, c_Op, c_Comm, c_Request
+    implicit none
+    type(*), dimension(..), intent(in) :: sendbuf
+    type(*), dimension(..) :: recvbuf
+    integer(c_int), value, intent(in) :: count
+    integer(c_Datatype), value, intent(in) :: datatype
+    integer(c_Op), value, intent(in) :: op
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_Request), intent(out) :: request
+    integer(c_int) :: ierror
+end function MPIR_Iscan_cdesc
+
+function MPIR_Scatter_cdesc(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, root, comm) &
+    bind(C, name="MPIR_Scatter_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Datatype, c_Comm
+    implicit none
+    type(*), dimension(..), intent(in) :: sendbuf
+    type(*), dimension(..) :: recvbuf
+    integer(c_int), value, intent(in) :: sendcount, recvcount, root
+    integer(c_Datatype), value, intent(in) :: sendtype, recvtype
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_int) :: ierror
+end function MPIR_Scatter_cdesc
+
+function MPIR_Iscatter_cdesc(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, root, comm, request) &
+    bind(C, name="MPIR_Iscatter_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Datatype, c_Comm, c_Request
+    implicit none
+    type(*), dimension(..), intent(in) :: sendbuf
+    type(*), dimension(..) :: recvbuf
+    integer(c_int), value, intent(in) :: sendcount, recvcount, root
+    integer(c_Datatype), value, intent(in) :: sendtype, recvtype
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_Request), intent(out) :: request
+    integer(c_int) :: ierror
+end function MPIR_Iscatter_cdesc
+
+function MPIR_Scatterv_cdesc(sendbuf, sendcounts, displs, sendtype, recvbuf, recvcount, recvtype, root, comm) &
+    bind(C, name="MPIR_Scatterv_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Datatype, c_Comm
+    implicit none
+    type(*), dimension(..), intent(in) :: sendbuf
+    type(*), dimension(..) :: recvbuf
+    integer(c_int), value, intent(in) :: recvcount, root
+    integer(c_int), intent(in) :: sendcounts(*), displs(*)
+    integer(c_Datatype), value, intent(in) :: sendtype, recvtype
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_int) :: ierror
+end function MPIR_Scatterv_cdesc
+
+function MPIR_Iscatterv_cdesc(sendbuf, sendcounts, displs, sendtype, recvbuf, recvcount, &
+           recvtype, root, comm, request) &
+    bind(C, name="MPIR_Iscatterv_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Datatype, c_Comm, c_Request
+    implicit none
+    type(*), dimension(..), intent(in) :: sendbuf
+    type(*), dimension(..) :: recvbuf
+    integer(c_int), value, intent(in) :: recvcount, root
+    integer(c_int), intent(in) :: sendcounts(*), displs(*)
+    integer(c_Datatype), value, intent(in) :: sendtype, recvtype
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_Request), intent(out) :: request
+    integer(c_int) :: ierror
+end function MPIR_Iscatterv_cdesc
+
+function MPIR_Accumulate_cdesc(origin_addr, origin_count, origin_datatype, target_rank, &
+           target_disp, target_count, target_datatype, op, win) &
+    bind(C, name="MPIR_Accumulate_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_f08_compile_constants, only : MPI_ADDRESS_KIND
+    use :: mpi_c_interface_types, only : c_Datatype, c_Op, c_Win
+    implicit none
+    type(*), dimension(..), intent(in) :: origin_addr
+    integer(c_int), value, intent(in) :: origin_count, target_rank, target_count
+    integer(c_Datatype), value, intent(in) :: origin_datatype
+    integer(MPI_ADDRESS_KIND), value, intent(in) :: target_disp
+    integer(c_Datatype), value, intent(in) :: target_datatype
+    integer(c_Op), value, intent(in) :: op
+    integer(c_Win), value, intent(in) :: win
+    integer(c_int) :: ierror
+end function MPIR_Accumulate_cdesc
+
+function MPIR_Get_cdesc(origin_addr, origin_count, origin_datatype, target_rank, &
+           target_disp, target_count, target_datatype, win) &
+    bind(C, name="MPIR_Get_cdesc") result(ierror)
+    use :: mpi_f08_compile_constants, only : MPI_ADDRESS_KIND
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Datatype, c_Win
+    implicit none
+    type(*), dimension(..) :: origin_addr
+    integer(c_int), value, intent(in) :: origin_count, target_rank, target_count
+    integer(c_Datatype), value, intent(in) :: origin_datatype
+    integer(MPI_ADDRESS_KIND), value, intent(in) :: target_disp
+    integer(c_Datatype), value, intent(in) :: target_datatype
+    integer(c_Win), value, intent(in) :: win
+    integer(c_int) :: ierror
+end function MPIR_Get_cdesc
+
+function MPIR_Put_cdesc(origin_addr, origin_count, origin_datatype, target_rank, &
+           target_disp, target_count, target_datatype, win) &
+    bind(C, name="MPIR_Put_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_f08_compile_constants, only : MPI_ADDRESS_KIND
+    use :: mpi_c_interface_types, only : c_Datatype, c_Win
+    implicit none
+    type(*), dimension(..), intent(in) :: origin_addr
+    integer(c_int), value, intent(in) :: origin_count, target_rank, target_count
+    integer(c_Datatype), value, intent(in) :: origin_datatype
+    integer(MPI_ADDRESS_KIND), value, intent(in) :: target_disp
+    integer(c_Datatype), value, intent(in) :: target_datatype
+    integer(c_Win), value, intent(in) :: win
+    integer(c_int) :: ierror
+end function MPIR_Put_cdesc
+
+function MPIR_Win_complete_f08(win) &
+    bind(C, name="MPIR_Win_complete_c") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_f08_compile_constants, only : MPI_ADDRESS_KIND
+    use :: mpi_c_interface_types, only : c_Win
+    implicit none
+    integer(c_Win), value, intent(in) :: win
+    integer(c_int) :: ierror
+end function MPIR_Win_complete_f08
+
+function MPIR_Win_create_cdesc(base, size, disp_unit, info, comm, win) &
+    bind(C, name="MPIR_Win_create_cdesc") result(ierror)
+    use :: mpi_f08_compile_constants, only : MPI_ADDRESS_KIND
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Info, c_Comm, c_Win
+    implicit none
+    type(*), dimension(..) :: base
+    integer(MPI_ADDRESS_KIND), value, intent(in) :: size
+    integer(c_int), value, intent(in) :: disp_unit
+    integer(c_Info), value, intent(in) :: info
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_Win), intent(out) :: win
+    integer(c_int) :: ierror
+end function MPIR_Win_create_cdesc
+
+
+
+function MPIR_File_iread_cdesc(fh, buf, count, datatype, request) &
+    bind(C, name="MPIR_File_iread_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_File, c_Datatype, c_Request
+    implicit none
+    integer(c_File), value, intent(in) :: fh
+    type(*), dimension(..) :: buf
+    integer(c_int), value, intent(in) :: count
+    integer(c_Datatype), value, intent(in) :: datatype
+    integer(c_Request), intent(out) :: request
+    integer(c_int) :: ierror
+end function MPIR_File_iread_cdesc
+
+function MPIR_File_iread_at_cdesc(fh, offset, buf, count, datatype, request) &
+    bind(C, name="MPIR_File_iread_at_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_f08_compile_constants, only : MPI_OFFSET_KIND
+    use :: mpi_c_interface_types, only : c_File, c_Datatype, c_Request
+    implicit none
+    integer(c_File), value, intent(in) :: fh
+    integer(MPI_OFFSET_KIND), value, intent(in) :: offset
+    type(*), dimension(..) :: buf
+    integer(c_int), value, intent(in) :: count
+    integer(c_Datatype), value, intent(in) :: datatype
+    integer(c_Request), intent(out) :: request
+    integer(c_int) :: ierror
+end function MPIR_File_iread_at_cdesc
+
+function MPIR_File_iread_shared_cdesc(fh, buf, count, datatype, request) &
+    bind(C, name="MPIR_File_iread_shared_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_File, c_Datatype, c_Request
+    implicit none
+    integer(c_File), value, intent(in) :: fh
+    type(*), dimension(..) :: buf
+    integer(c_int), value, intent(in) :: count
+    integer(c_Datatype), value, intent(in) :: datatype
+    integer(c_Request), intent(out) :: request
+    integer(c_int) :: ierror
+end function MPIR_File_iread_shared_cdesc
+
+function MPIR_File_iwrite_cdesc(fh, buf, count, datatype, request) &
+    bind(C, name="MPIR_File_iwrite_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_File, c_Datatype, c_Request
+    implicit none
+    integer(c_File), value, intent(in) :: fh
+    type(*), dimension(..), intent(in) :: buf
+    integer(c_int), value, intent(in) :: count
+    integer(c_Datatype), value, intent(in) :: datatype
+    integer(c_Request), intent(out) :: request
+    integer(c_int) :: ierror
+end function MPIR_File_iwrite_cdesc
+
+function MPIR_File_iwrite_at_cdesc(fh, offset, buf, count, datatype, request) &
+    bind(C, name="MPIR_File_iwrite_at_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_f08_compile_constants, only : MPI_OFFSET_KIND
+    use :: mpi_c_interface_types, only : c_File, c_Datatype, c_Request
+    implicit none
+    integer(c_File), value, intent(in) :: fh
+    integer(MPI_OFFSET_KIND), value, intent(in) :: offset
+    type(*), dimension(..), intent(in) :: buf
+    integer(c_int), value, intent(in) :: count
+    integer(c_Datatype), value, intent(in) :: datatype
+    integer(c_Request), intent(out) :: request
+    integer(c_int) :: ierror
+end function MPIR_File_iwrite_at_cdesc
+
+function MPIR_File_iwrite_shared_cdesc(fh, buf, count, datatype, request) &
+    bind(C, name="MPIR_File_iwrite_shared_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_File, c_Datatype, c_Request
+    implicit none
+    type(*), dimension(..), intent(in) :: buf
+    integer(c_File), value, intent(in) :: fh
+    integer(c_int), value, intent(in) :: count
+    integer(c_Datatype), value, intent(in) :: datatype
+    integer(c_Request), intent(out) :: request
+    integer(c_int) :: ierror
+end function MPIR_File_iwrite_shared_cdesc
+
+function MPIR_File_read_cdesc(fh, buf, count, datatype, status) &
+    bind(C, name="MPIR_File_read_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_ptr
+    use :: mpi_c_interface_types, only : c_File, c_Datatype
+    implicit none
+    integer(c_File), value, intent(in) :: fh
+    type(*), dimension(..) :: buf
+    integer(c_int), value, intent(in) :: count
+    integer(c_Datatype), value, intent(in) :: datatype
+    type(c_ptr), value, intent(in) :: status
+    integer(c_int) :: ierror
+end function MPIR_File_read_cdesc
+
+function MPIR_File_read_all_cdesc(fh, buf, count, datatype, status) &
+    bind(C, name="MPIR_File_read_all_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_ptr
+    use :: mpi_c_interface_types, only : c_File, c_Datatype
+    implicit none
+    integer(c_File), value, intent(in) :: fh
+    type(*), dimension(..) :: buf
+    integer(c_int), value, intent(in) :: count
+    integer(c_Datatype), value, intent(in) :: datatype
+    type(c_ptr), value, intent(in) :: status
+    integer(c_int) :: ierror
+end function MPIR_File_read_all_cdesc
+
+function MPIR_File_read_all_begin_cdesc(fh, buf, count, datatype) &
+    bind(C, name="MPIR_File_read_all_begin_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_File, c_Datatype
+    implicit none
+    integer(c_File), value, intent(in) :: fh
+    type(*), dimension(..) :: buf
+    integer(c_int), value, intent(in) :: count
+    integer(c_Datatype), value, intent(in) :: datatype
+    integer(c_int) :: ierror
+end function MPIR_File_read_all_begin_cdesc
+
+function MPIR_File_read_all_end_cdesc(fh, buf, status) &
+    bind(C, name="MPIR_File_read_all_end_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_ptr
+    use :: mpi_c_interface_types, only : c_File
+    implicit none
+    integer(c_File), value, intent(in) :: fh
+    type(*), dimension(..) :: buf
+    type(c_ptr), value, intent(in) :: status
+    integer(c_int) :: ierror
+end function MPIR_File_read_all_end_cdesc
+
+function MPIR_File_read_at_cdesc(fh, offset, buf, count, datatype, status) &
+    bind(C, name="MPIR_File_read_at_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_ptr
+    use :: mpi_f08_compile_constants, only : MPI_OFFSET_KIND
+    use :: mpi_c_interface_types, only : c_File, c_Datatype
+    implicit none
+    integer(c_File), value, intent(in) :: fh
+    integer(MPI_OFFSET_KIND), value, intent(in) :: offset
+    type(*), dimension(..) :: buf
+    integer(c_int), value, intent(in) :: count
+    integer(c_Datatype), value, intent(in) :: datatype
+    type(c_ptr), value, intent(in) :: status
+    integer(c_int) :: ierror
+end function MPIR_File_read_at_cdesc
+
+function MPIR_File_read_at_all_cdesc(fh, offset, buf, count, datatype, status) &
+    bind(C, name="MPIR_File_read_at_all_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_ptr
+    use :: mpi_f08_compile_constants, only : MPI_OFFSET_KIND
+    use :: mpi_c_interface_types, only : c_File, c_Datatype
+    implicit none
+    integer(c_File), value, intent(in) :: fh
+    integer(MPI_OFFSET_KIND), value, intent(in) :: offset
+    type(*), dimension(..) :: buf
+    integer(c_int), value, intent(in) :: count
+    integer(c_Datatype), value, intent(in) :: datatype
+    type(c_ptr), value, intent(in) :: status
+    integer(c_int) :: ierror
+end function MPIR_File_read_at_all_cdesc
+
+function MPIR_File_read_at_all_begin_cdesc(fh, offset, buf, count, datatype) &
+    bind(C, name="MPIR_File_read_at_all_begin_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_f08_compile_constants, only : MPI_OFFSET_KIND
+    use :: mpi_c_interface_types, only : c_File, c_Datatype
+    implicit none
+    integer(c_File), value, intent(in) :: fh
+    integer(MPI_OFFSET_KIND), value, intent(in) :: offset
+    type(*), dimension(..) :: buf
+    integer(c_int), value, intent(in) :: count
+    integer(c_Datatype), value, intent(in) :: datatype
+    integer(c_int) :: ierror
+end function MPIR_File_read_at_all_begin_cdesc
+
+function MPIR_File_read_at_all_end_cdesc(fh, buf, status) &
+    bind(C, name="MPIR_File_read_at_all_end_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_ptr
+    use :: mpi_c_interface_types, only : c_File
+    implicit none
+    integer(c_File), value, intent(in) :: fh
+    type(*), dimension(..) :: buf
+    type(c_ptr), value, intent(in) :: status
+    integer(c_int) :: ierror
+end function MPIR_File_read_at_all_end_cdesc
+
+function MPIR_File_read_ordered_cdesc(fh, buf, count, datatype, status) &
+    bind(C, name="MPIR_File_read_ordered_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_ptr
+    use :: mpi_c_interface_types, only : c_File, c_Datatype
+    implicit none
+    integer(c_File), value, intent(in) :: fh
+    type(*), dimension(..) :: buf
+    integer(c_int), value, intent(in) :: count
+    integer(c_Datatype), value, intent(in) :: datatype
+    type(c_ptr), value, intent(in) :: status
+    integer(c_int) :: ierror
+end function MPIR_File_read_ordered_cdesc
+
+function MPIR_File_read_ordered_begin_cdesc(fh, buf, count, datatype) &
+    bind(C, name="MPIR_File_read_ordered_begin_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_File, c_Datatype
+    implicit none
+    integer(c_File), value, intent(in) :: fh
+    type(*), dimension(..) :: buf
+    integer(c_int), value, intent(in) :: count
+    integer(c_Datatype), value, intent(in) :: datatype
+    integer(c_int) :: ierror
+end function MPIR_File_read_ordered_begin_cdesc
+
+function MPIR_File_read_ordered_end_cdesc(fh, buf, status) &
+    bind(C, name="MPIR_File_read_ordered_end_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_ptr
+    use :: mpi_c_interface_types, only : c_File
+    implicit none
+    integer(c_File), value, intent(in) :: fh
+    type(*), dimension(..) :: buf
+    type(c_ptr), value, intent(in) :: status
+    integer(c_int) :: ierror
+end function MPIR_File_read_ordered_end_cdesc
+
+function MPIR_File_read_shared_cdesc(fh, buf, count, datatype, status) &
+    bind(C, name="MPIR_File_read_shared_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_ptr
+    use :: mpi_c_interface_types, only : c_File, c_Datatype
+    implicit none
+    integer(c_File), value, intent(in) :: fh
+    type(*), dimension(..) :: buf
+    integer(c_int), value, intent(in) :: count
+    integer(c_Datatype), value, intent(in) :: datatype
+    type(c_ptr), value, intent(in) :: status
+    integer(c_int) :: ierror
+end function MPIR_File_read_shared_cdesc
+
+function MPIR_File_write_cdesc(fh, buf, count, datatype, status) &
+    bind(C, name="MPIR_File_write_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_ptr
+    use :: mpi_c_interface_types, only : c_File, c_Datatype
+    implicit none
+    integer(c_File), value, intent(in) :: fh
+    type(*), dimension(..), intent(in) :: buf
+    integer(c_int), value, intent(in) :: count
+    integer(c_Datatype), value, intent(in) :: datatype
+    type(c_ptr), value, intent(in) :: status
+    integer(c_int) :: ierror
+end function MPIR_File_write_cdesc
+
+function MPIR_File_write_all_cdesc(fh, buf, count, datatype, status) &
+    bind(C, name="MPIR_File_write_all_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_ptr
+    use :: mpi_c_interface_types, only : c_File, c_Datatype
+    implicit none
+    integer(c_File), value, intent(in) :: fh
+    type(*), dimension(..), intent(in) :: buf
+    integer(c_int), value, intent(in) :: count
+    integer(c_Datatype), value, intent(in) :: datatype
+    type(c_ptr), value, intent(in) :: status
+    integer(c_int) :: ierror
+end function MPIR_File_write_all_cdesc
+
+function MPIR_File_write_all_begin_cdesc(fh, buf, count, datatype) &
+    bind(C, name="MPIR_File_write_all_begin_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_File, c_Datatype
+    implicit none
+    integer(c_File), value, intent(in) :: fh
+    type(*), dimension(..), intent(in) :: buf
+    integer(c_int), value, intent(in) :: count
+    integer(c_Datatype), value, intent(in) :: datatype
+    integer(c_int) :: ierror
+end function MPIR_File_write_all_begin_cdesc
+
+function MPIR_File_write_all_end_cdesc(fh, buf, status) &
+    bind(C, name="MPIR_File_write_all_end_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_ptr
+    use :: mpi_c_interface_types, only : c_File
+    implicit none
+    integer(c_File), value, intent(in) :: fh
+    type(*), dimension(..), intent(in) :: buf
+    type(c_ptr), value, intent(in) :: status
+    integer(c_int) :: ierror
+end function MPIR_File_write_all_end_cdesc
+
+function MPIR_File_write_at_cdesc(fh, offset, buf, count, datatype, status) &
+    bind(C, name="MPIR_File_write_at_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_ptr
+    use :: mpi_f08_compile_constants, only : MPI_OFFSET_KIND
+    use :: mpi_c_interface_types, only : c_File, c_Datatype
+    implicit none
+    integer(c_File), value, intent(in) :: fh
+    integer(MPI_OFFSET_KIND), value, intent(in) :: offset
+    type(*), dimension(..), intent(in) :: buf
+    integer(c_int), value, intent(in) :: count
+    integer(c_Datatype), value, intent(in) :: datatype
+    type(c_ptr), value, intent(in) :: status
+    integer(c_int) :: ierror
+end function MPIR_File_write_at_cdesc
+
+function MPIR_File_write_at_all_cdesc(fh, offset, buf, count, datatype, status) &
+    bind(C, name="MPIR_File_write_at_all_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_ptr
+    use :: mpi_f08_compile_constants, only : MPI_OFFSET_KIND
+    use :: mpi_c_interface_types, only : c_File, c_Datatype
+    implicit none
+    integer(c_File), value, intent(in) :: fh
+    integer(MPI_OFFSET_KIND), value, intent(in) :: offset
+    type(*), dimension(..) :: buf
+    integer(c_int), value, intent(in) :: count
+    integer(c_Datatype), value, intent(in) :: datatype
+    type(c_ptr), value, intent(in) :: status
+    integer(c_int) :: ierror
+end function MPIR_File_write_at_all_cdesc
+
+function MPIR_File_write_at_all_begin_cdesc(fh, offset, buf, count, datatype) &
+    bind(C, name="MPIR_File_write_at_all_begin_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_f08_compile_constants, only : MPI_OFFSET_KIND
+    use :: mpi_c_interface_types, only : c_File, c_Datatype
+    implicit none
+    integer(c_File), value, intent(in) :: fh
+    integer(MPI_OFFSET_KIND), value, intent(in) :: offset
+    type(*), dimension(..), intent(in) :: buf
+    integer(c_int), value, intent(in) :: count
+    integer(c_Datatype), value, intent(in) :: datatype
+    integer(c_int) :: ierror
+end function MPIR_File_write_at_all_begin_cdesc
+
+function MPIR_File_write_at_all_end_cdesc(fh, buf, status) &
+    bind(C, name="MPIR_File_write_at_all_end_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_ptr
+    use :: mpi_c_interface_types, only : c_File
+    implicit none
+    integer(c_File), value, intent(in) :: fh
+    type(*), dimension(..), intent(in) :: buf
+    type(c_ptr), value, intent(in) :: status
+    integer(c_int) :: ierror
+end function MPIR_File_write_at_all_end_cdesc
+
+function MPIR_File_write_ordered_cdesc(fh, buf, count, datatype, status) &
+    bind(C, name="MPIR_File_write_ordered_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_ptr
+    use :: mpi_c_interface_types, only : c_File, c_Datatype
+    implicit none
+    integer(c_File), value, intent(in) :: fh
+    type(*), dimension(..), intent(in) :: buf
+    integer(c_int), value, intent(in) :: count
+    integer(c_Datatype), value, intent(in) :: datatype
+    type(c_ptr), value, intent(in) :: status
+    integer(c_int) :: ierror
+end function MPIR_File_write_ordered_cdesc
+
+function MPIR_File_write_ordered_begin_cdesc(fh, buf, count, datatype) &
+    bind(C, name="MPIR_File_write_ordered_begin_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_File, c_Datatype
+    implicit none
+    integer(c_File), value, intent(in) :: fh
+    type(*), dimension(..), intent(in) :: buf
+    integer(c_int), value, intent(in) :: count
+    integer(c_Datatype), value, intent(in) :: datatype
+    integer(c_int) :: ierror
+end function MPIR_File_write_ordered_begin_cdesc
+
+function MPIR_File_write_ordered_end_cdesc(fh, buf, status) &
+    bind(C, name="MPIR_File_write_ordered_end_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_ptr
+    use :: mpi_c_interface_types, only : c_File
+    implicit none
+    integer(c_File), value, intent(in) :: fh
+    type(*), dimension(..), intent(in) :: buf
+    type(c_ptr), value, intent(in) :: status
+    integer(c_int) :: ierror
+end function MPIR_File_write_ordered_end_cdesc
+
+function MPIR_File_write_shared_cdesc(fh, buf, count, datatype, status) &
+    bind(C, name="MPIR_File_write_shared_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_ptr
+    use :: mpi_c_interface_types, only : c_File, c_Datatype
+    implicit none
+    integer(c_File), value, intent(in) :: fh
+    type(*), dimension(..), intent(in) :: buf
+    integer(c_int), value, intent(in) :: count
+    integer(c_Datatype), value, intent(in) :: datatype
+    type(c_ptr), value, intent(in) :: status
+    integer(c_int) :: ierror
+end function MPIR_File_write_shared_cdesc
+
+function MPIR_Free_mem_c(base) &
+    BIND(C, name="MPIR_Free_mem_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    implicit none
+    type(*), dimension(..), intent(in), asynchronous :: base
+    integer(c_int) :: ierror
+end function MPIR_Free_mem_c
+
+function MPIR_F_sync_reg_cdesc(buf) &
+    bind(C, name="MPIR_F_sync_reg_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    implicit none
+    type(*), dimension(..) :: buf
+    integer(c_int) :: ierror
+end function MPIR_F_sync_reg_cdesc
+
+function MPIR_Imrecv_cdesc(buf, count, datatype, message, request) &
+    bind(C, name="MPIR_Imrecv_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Datatype, c_Message, c_Request
+    implicit none
+    type(*), dimension(..) :: buf
+    integer(c_int), value, intent(in) :: count
+    integer(c_Datatype), value, intent(in) :: datatype
+    integer(c_Message), intent(inout) :: message
+    integer(c_Request), intent(out) :: request
+    integer(c_int) :: ierror
+end function MPIR_Imrecv_cdesc
+
+function MPIR_Mrecv_cdesc(buf, count, datatype, message, status) &
+    bind(C, name="MPIR_Mrecv_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_ptr
+    use :: mpi_c_interface_types, only : c_Datatype, c_Message
+    implicit none
+    type(*), dimension(..) :: buf
+    integer(c_int), value, intent(in) :: count
+    integer(c_Datatype), value, intent(in) :: datatype
+    integer(c_Message), intent(inout) :: message
+    type(c_ptr), value, intent(in) :: status
+    integer(c_int) :: ierror
+end function MPIR_Mrecv_cdesc
+
+function MPIR_Neighbor_allgather_cdesc(sendbuf, sendcount, sendtype, recvbuf, &
+           recvcount, recvtype, comm) &
+    bind(C, name="MPIR_Neighbor_allgather_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Datatype, c_Comm
+    implicit none
+    type(*), dimension(..), intent(in) :: sendbuf
+    type(*), dimension(..) :: recvbuf
+    integer(c_int), value, intent(in) :: sendcount, recvcount
+    integer(c_Datatype), value, intent(in) :: sendtype, recvtype
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_int) :: ierror
+end function MPIR_Neighbor_allgather_cdesc
+
+function MPIR_Ineighbor_allgather_cdesc(sendbuf, sendcount, sendtype, recvbuf, &
+           recvcount, recvtype, comm, request) &
+    bind(C, name="MPIR_Ineighbor_allgather_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Datatype, c_Comm, c_Request
+    implicit none
+    type(*), dimension(..), intent(in) :: sendbuf
+    type(*), dimension(..) :: recvbuf
+    integer(c_int), value, intent(in) :: sendcount, recvcount
+    integer(c_Datatype), value, intent(in) :: sendtype, recvtype
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_Request), intent(out) :: request
+    integer(c_int) :: ierror
+end function MPIR_Ineighbor_allgather_cdesc
+
+function MPIR_Neighbor_allgatherv_cdesc(sendbuf, sendcount, sendtype, recvbuf, &
+           recvcounts, displs, recvtype, comm) &
+    bind(C, name="MPIR_Neighbor_allgatherv_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Datatype, c_Comm
+    implicit none
+    type(*), dimension(..), intent(in) :: sendbuf
+    type(*), dimension(..) :: recvbuf
+    integer(c_int), value, intent(in) :: sendcount
+    integer(c_int), intent(in) :: recvcounts(*), displs(*)
+    integer(c_Datatype), value, intent(in) :: sendtype, recvtype
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_int) :: ierror
+end function MPIR_Neighbor_allgatherv_cdesc
+
+function MPIR_Ineighbor_allgatherv_cdesc(sendbuf, sendcount, sendtype, recvbuf, &
+           recvcounts, displs, recvtype, comm, request) &
+    bind(C, name="MPIR_Ineighbor_allgatherv_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Datatype, c_Comm, c_Request
+    implicit none
+    type(*), dimension(..), intent(in) :: sendbuf
+    type(*), dimension(..) :: recvbuf
+    integer(c_int), value, intent(in) :: sendcount
+    integer(c_int), intent(in) :: recvcounts(*), displs(*)
+    integer(c_Datatype), value, intent(in) :: sendtype, recvtype
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_Request), intent(out) :: request
+    integer(c_int) :: ierror
+end function MPIR_Ineighbor_allgatherv_cdesc
+
+function MPIR_Neighbor_alltoall_cdesc(sendbuf, sendcount, sendtype, recvbuf, &
+           recvcount, recvtype, comm) &
+    bind(C, name="MPIR_Neighbor_alltoall_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Datatype, c_Comm
+    implicit none
+    type(*), dimension(..), intent(in) :: sendbuf
+    type(*), dimension(..) :: recvbuf
+    integer(c_int), value, intent(in) :: sendcount, recvcount
+    integer(c_Datatype), value, intent(in) :: sendtype, recvtype
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_int) :: ierror
+end function MPIR_Neighbor_alltoall_cdesc
+
+function MPIR_Ineighbor_alltoall_cdesc(sendbuf, sendcount, sendtype, recvbuf, &
+           recvcount, recvtype, comm, request) &
+    bind(C, name="MPIR_Ineighbor_alltoall_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Datatype, c_Comm, c_Request
+    implicit none
+    type(*), dimension(..), intent(in) :: sendbuf
+    type(*), dimension(..) :: recvbuf
+    integer(c_int), value, intent(in) :: sendcount, recvcount
+    integer(c_Datatype), value, intent(in) :: sendtype, recvtype
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_Request), intent(out) :: request
+    integer(c_int) :: ierror
+end function MPIR_Ineighbor_alltoall_cdesc
+
+function MPIR_Neighbor_alltoallv_cdesc(sendbuf, sendcounts, sdispls, sendtype, recvbuf, &
+           recvcounts, rdispls, recvtype, comm) &
+    bind(C, name="MPIR_Neighbor_alltoallv_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Datatype, c_Comm
+    implicit none
+    type(*), dimension(..), intent(in) :: sendbuf
+    type(*), dimension(..) :: recvbuf
+    integer(c_int), intent(in) :: sendcounts(*), sdispls(*), recvcounts(*), rdispls(*)
+    integer(c_Datatype), value, intent(in) :: sendtype, recvtype
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_int) :: ierror
+end function MPIR_Neighbor_alltoallv_cdesc
+
+function MPIR_Ineighbor_alltoallv_cdesc(sendbuf, sendcounts, sdispls, sendtype, recvbuf, &
+           recvcounts, rdispls, recvtype, comm, request) &
+    bind(C, name="MPIR_Ineighbor_alltoallv_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Datatype, c_Comm, c_Request
+    implicit none
+    type(*), dimension(..), intent(in) :: sendbuf
+    type(*), dimension(..) :: recvbuf
+    integer(c_int), intent(in) :: sendcounts(*), sdispls(*), recvcounts(*), rdispls(*)
+    integer(c_Datatype), value, intent(in) :: sendtype, recvtype
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_Request), value, intent(in) :: request
+    integer(c_int) :: ierror
+end function MPIR_Ineighbor_alltoallv_cdesc
+
+function MPIR_Neighbor_alltoallw_cdesc(sendbuf, sendcounts, sdispls, sendtypes, recvbuf, &
+           recvcounts, rdispls, recvtypes, comm) &
+    bind(C, name="MPIR_Neighbor_alltoallw_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_f08_compile_constants, only : MPI_ADDRESS_KIND
+    use :: mpi_c_interface_types, only : c_Datatype, c_Comm
+    implicit none
+    type(*), dimension(..), intent(in) :: sendbuf
+    type(*), dimension(..) :: recvbuf
+    integer(c_int), intent(in) :: sendcounts(*), recvcounts(*)
+    integer(MPI_ADDRESS_KIND), intent(in) :: sdispls(*), rdispls(*)
+    integer(c_Datatype), intent(in) :: sendtypes(*), recvtypes(*)
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_int) :: ierror
+end function MPIR_Neighbor_alltoallw_cdesc
+
+function MPIR_Ineighbor_alltoallw_cdesc(sendbuf, sendcounts, sdispls, sendtypes, recvbuf, &
+           recvcounts, rdispls, recvtypes, comm, request) &
+    bind(C, name="MPIR_Ineighbor_alltoallw_cdesc") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_f08_compile_constants, only : MPI_ADDRESS_KIND
+    use :: mpi_c_interface_types, only : c_Datatype, c_Comm, c_Request
+    implicit none
+    type(*), dimension(..), intent(in) :: sendbuf
+    type(*), dimension(..) :: recvbuf
+    integer(c_int), intent(in) :: sendcounts(*), recvcounts(*)
+    integer(MPI_ADDRESS_KIND), intent(in) :: sdispls(*), rdispls(*)
+    integer(c_Datatype), intent(in) :: sendtypes(*), recvtypes(*)
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_Request), value, intent(in) :: request
+    integer(c_int) :: ierror
+end function MPIR_Ineighbor_alltoallw_cdesc
+
+end interface
+
+end module mpi_c_interface_cdesc
diff --git a/src/binding/fortran/use_mpi_f08/mpi_c_interface_cdesc.f90 b/src/binding/fortran/use_mpi_f08/mpi_c_interface_cdesc.f90
deleted file mode 100644
index d5017d7..0000000
--- a/src/binding/fortran/use_mpi_f08/mpi_c_interface_cdesc.f90
+++ /dev/null
@@ -1,100 +0,0 @@
-module mpi_c_interface_cdesc
-implicit none
-
-interface
-
-function MPIR_Bsend_init_cdesc (buf, count, datatype, dest, tag, comm, request) &
-            BIND(C, name="MPIR_Bsend_init_cdesc") RESULT (res)
-    use :: mpi_c_interface_types, only: C_Datatype, C_Comm, C_request
-    use,intrinsic :: iso_c_binding, only: c_int
-    type(*),dimension(..)             :: buf
-    integer(c_int),      value,intent(in)  :: count
-    integer(c_Datatype), value,intent(in)  :: datatype
-    integer(c_int),      value,intent(in)  :: dest
-    integer(c_int),      value,intent(in)  :: tag
-    integer(c_Comm),     value,intent(in)  :: comm
-    integer(C_request),       intent(out)  :: request
-    integer(c_int)                         :: res
-end function MPIR_Bsend_init_cdesc
-
-function MPIR_Buffer_attach_cdesc (buffer, size) &
-            BIND(C, name="MPIR_Buffer_attach_cdesc") RESULT (res)
-    use,intrinsic :: iso_c_binding, only: c_int
-    type(*),dimension(..),asynchronous :: buffer
-    integer(c_int),       value, intent(in) :: size
-    integer(c_int)                          :: res
-end function MPIR_Buffer_attach_cdesc
-
-function MPIR_Bsend_cdesc (buf, count, datatype, dest, tag, comm) &
-            BIND(C, name="MPIR_Bsend_cdesc") RESULT (res)
-    use :: mpi_c_interface_types, only: C_Datatype, C_Comm
-    use,intrinsic :: iso_c_binding, only: c_int
-    type(*),dimension(..)             :: buf
-    integer(c_int),      value,intent(in)  :: count
-    integer(c_Datatype), value,intent(in)  :: datatype
-    integer(c_int),      value,intent(in)  :: dest
-    integer(c_int),      value,intent(in)  :: tag
-    integer(c_Comm),     value,intent(in)  :: comm
-    integer(c_int)                         :: res
-end function MPIR_Bsend_cdesc
-
-function MPIR_Irecv_cdesc (buf, count, datatype, source, tag, comm, request) &
-            BIND(C, name="MPIR_Irecv_cdesc") RESULT (res)
-    use :: mpi_c_interface_types, only: C_Datatype, C_Comm, C_Request
-    use,intrinsic :: iso_c_binding, only: c_int
-    type(*),dimension(..)             :: buf
-    integer(c_int),      value,intent(in)  :: count
-    integer(c_Datatype), value,intent(in)  :: datatype
-    integer(c_int),      value,intent(in)  :: source
-    integer(c_int),      value,intent(in)  :: tag
-    integer(c_Comm),     value,intent(in)  :: comm
-    integer(c_Request),        intent(out) :: request
-    integer(c_int)                    :: res
-end function MPIR_Irecv_cdesc
-
-
-function MPIR_Isend_cdesc (buf, count, datatype, dest, tag, comm, request) &
-            BIND(C, name="MPIR_Isend_cdesc") RESULT (res)
-    use :: mpi_c_interface_types, only: C_Datatype, C_Comm, C_Request
-    use,intrinsic :: iso_c_binding, only: c_int
-    type(*),dimension(..)                 :: buf
-    integer(c_int),      value,intent(in) :: count
-    integer(C_Datatype), value,intent(in) :: datatype
-    integer(c_int),      value,intent(in) :: dest
-    integer(c_int),      value,intent(in) :: tag
-    integer(C_Comm),     value,intent(in) :: comm
-    integer(C_Request),       intent(out) :: request
-    integer(c_int)                        :: res
-end function MPIR_Isend_cdesc
-
-
-function MPIR_Recv_cdesc (buf,count,datatype,source,tag,comm, status) &
-           BIND(C, name="MPIR_Recv_cdesc") RESULT (res)
-    use :: mpi_c_interface_types, only: c_Status, C_Datatype, C_Comm
-    use,intrinsic :: iso_c_binding, only: c_int
-    type(*),dimension(..)                 :: buf
-    integer(c_int),      value,intent(in) :: count
-    integer(C_Datatype), value,intent(in) :: datatype
-    integer(c_int),      value,intent(in) :: source
-    integer(c_int),      value,intent(in) :: tag
-    integer(C_Comm),     value,intent(in) :: comm
-    type(c_Status),       intent(out) :: status
-    integer(c_int)                        :: res
-end function MPIR_Recv_cdesc
-
-function MPIR_Send_cdesc (buf,count,datatype,dest,tag,comm) &
-           BIND(C, name="MPIR_Send_cdesc") RESULT (res)
-    use :: mpi_c_interface_types, only: C_Datatype, C_Comm
-    use,intrinsic :: iso_c_binding, only: c_int
-    type(*),dimension(..),    intent(in) :: buf
-    integer(c_int),     value,intent(in) :: count
-    integer(C_Datatype),value,intent(in) :: datatype
-    integer(c_int),     value,intent(in) :: dest
-    integer(c_int),     value,intent(in) :: tag
-    integer(C_Comm),    value,intent(in) :: comm
-    integer(c_int)                       :: res
-end function MPIR_Send_cdesc
-
-end interface
-
-end module mpi_c_interface_cdesc
diff --git a/src/binding/fortran/use_mpi_f08/mpi_c_interface_glue.F90 b/src/binding/fortran/use_mpi_f08/mpi_c_interface_glue.F90
new file mode 100644
index 0000000..5d85714
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/mpi_c_interface_glue.F90
@@ -0,0 +1,312 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+
+module mpi_c_interface_glue
+
+use, intrinsic :: iso_c_binding, only : c_char, C_NULL_CHAR
+
+implicit none
+
+public :: MPIR_Fortran_string_f2c
+public :: MPIR_Fortran_string_c2f
+
+public :: MPIR_Comm_copy_attr_f08_proxy
+public :: MPIR_Comm_delete_attr_f08_proxy
+public :: MPIR_Type_copy_attr_f08_proxy
+public :: MPIR_Type_delete_attr_f08_proxy
+public :: MPIR_Win_copy_attr_f08_proxy
+public :: MPIR_Win_delete_attr_f08_proxy
+public :: MPIR_Keyval_set_proxy
+public :: MPIR_Grequest_set_lang_fortran
+
+! Bind to C's enum MPIR_AttrType in mpi_attr.h
+enum, bind(C)
+    enumerator :: MPIR_ATTR_PTR  = 0
+    enumerator :: MPIR_ATTR_AINT = 1
+    enumerator :: MPIR_ATTR_INT  = 3
+end enum
+
+interface
+
+subroutine MPIR_Keyval_set_proxy(keyval, attr_copy_proxy, attr_delete_proxy) bind(C, name="MPIR_Keyval_set_proxy")
+    use :: iso_c_binding, only : c_int, c_funptr
+    integer(c_int), value, intent(in) :: keyval
+    type(c_funptr), value, intent(in) :: attr_copy_proxy, attr_delete_proxy
+    ! The subroutine is implemented in attrutil.c on the C side
+end subroutine MPIR_Keyval_set_proxy
+
+! Just need to tag the lang is Fortran, so it is fine to bind to *_lang_f77
+subroutine MPIR_Grequest_set_lang_fortran(request) bind(C, name="MPIR_Grequest_set_lang_f77")
+    use :: mpi_c_interface_types, only : c_Request
+    integer(c_Request), value, intent(in) :: request
+    ! The subroutine is implemented in mpir_request.c on the C side
+end subroutine MPIR_Grequest_set_lang_fortran
+
+end interface
+
+contains
+
+! Copy Fortran string to C charater array, assuming the C array is one-char
+! longer for the terminating null char.
+! fstring : the Fortran input string
+! cstring : the C output string (with memory already allocated)
+subroutine MPIR_Fortran_string_f2c(fstring, cstring)
+    implicit none
+    character(len=*), intent(in) :: fstring
+    character(kind=c_char), intent(out) :: cstring(:)
+    integer :: i
+
+    do i = 1, len_trim(fstring)
+        cstring(i) = fstring(i:i)
+    end do
+
+    cstring(i) = C_NULL_CHAR
+
+end subroutine MPIR_Fortran_string_f2c
+
+! Copy C charater array to Fortran string
+subroutine MPIR_Fortran_string_c2f(cstring, fstring)
+    implicit none
+    character(kind=c_char), intent(in) :: cstring(:)
+    character(len=*), intent(out) :: fstring
+    integer :: i, j, length
+
+    i = 1
+    do while (cstring(i) /= C_NULL_CHAR)
+        i = i + 1
+    end do
+
+    do j = 1, i - 1
+        fstring(j:j) = cstring(j)
+    end do
+
+    ! Zero out the trailing characters
+    length = len(fstring)
+    do j = i, length
+        fstring(j:j) = ' '
+    end do
+end subroutine MPIR_Fortran_string_c2f
+
+function MPIR_Comm_copy_attr_f08_proxy (user_function, oldcomm, comm_keyval, extra_state, &
+        attr_type, attribute_val_in, attribute_val_out, flag) result(ierror)
+
+    use :: iso_c_binding, only : c_int, c_intptr_t
+    use :: mpi_f08, only : MPI_ADDRESS_KIND, MPI_Comm, MPI_Comm_copy_attr_function
+    use :: mpi_c_interface_types, only : c_Comm
+
+    implicit none
+
+    procedure (MPI_Comm_copy_attr_function)          :: user_function
+    integer(c_Comm), value, intent(in)               :: oldcomm
+    integer(c_int), value, intent(in)                :: comm_keyval
+    integer(c_intptr_t), value, intent(in)           :: extra_state
+    integer(kind(MPIR_ATTR_AINT)), value, intent(in) :: attr_type ! Only used in C proxy
+    integer(c_intptr_t), value, intent(in)           :: attribute_val_in
+    integer(c_intptr_t), intent(out)                 :: attribute_val_out
+    integer(c_int), intent(out)                      :: flag
+    integer(c_int)                                   :: ierror
+
+    type(MPI_Comm)            :: oldcomm_f
+    integer                   :: comm_keyval_f
+    integer(MPI_ADDRESS_KIND) :: extra_state_f
+    integer(MPI_ADDRESS_KIND) :: attribute_val_in_f
+    integer(MPI_ADDRESS_KIND) :: attribute_val_out_f
+    logical                   :: flag_f
+    integer                   :: ierror_f
+
+    oldcomm_f%MPI_VAL   = oldcomm
+    comm_keyval_f       = comm_keyval
+    attribute_val_in_f  = attribute_val_in
+    extra_state_f       = extra_state
+
+    call user_function(oldcomm_f, comm_keyval_f, extra_state_f, attribute_val_in_f, attribute_val_out_f, flag_f, ierror_f)
+
+    attribute_val_out = attribute_val_out_f
+    flag = merge(1, 0, flag_f)
+    ierror = ierror_f
+
+end function MPIR_Comm_copy_attr_f08_proxy
+
+function MPIR_Comm_delete_attr_f08_proxy (user_function, comm, comm_keyval, attr_type, &
+        attribute_val, extra_state) result(ierror)
+    use :: iso_c_binding, only : c_int, c_intptr_t
+    use :: mpi_f08, only : MPI_ADDRESS_KIND, MPI_Comm, MPI_Comm_delete_attr_function
+    use :: mpi_c_interface_types, only : c_Comm
+
+    implicit none
+
+    procedure (MPI_Comm_delete_attr_function)        :: user_function
+    integer(c_Comm), value, intent(in)               :: comm
+    integer(c_int), value, intent(in)                :: comm_keyval
+    integer(kind(MPIR_ATTR_AINT)), value, intent(in) :: attr_type ! Only used in C proxy
+    integer(c_intptr_t), value, intent(in)           :: attribute_val
+    integer(c_intptr_t), value, intent(in)           :: extra_state
+    integer(c_int)                                   :: ierror
+
+    type(MPI_Comm)            :: comm_f
+    integer                   :: comm_keyval_f
+    integer(MPI_ADDRESS_KIND) :: attribute_val_f
+    integer(MPI_ADDRESS_KIND) :: extra_state_f
+    integer                   :: ierror_f
+
+    comm_f%MPI_VAL  = comm
+    comm_keyval_f   = comm_keyval
+    attribute_val_f = attribute_val
+    extra_state_f   = extra_state
+
+    call user_function(comm_f, comm_keyval_f, attribute_val_f, extra_state_f, ierror_f)
+
+    ierror = ierror_f
+
+end function MPIR_Comm_delete_attr_f08_proxy
+
+function MPIR_Type_copy_attr_f08_proxy (user_function, oldtype, type_keyval, extra_state, &
+        attr_type, attribute_val_in, attribute_val_out, flag) result(ierror)
+
+    use :: iso_c_binding, only : c_int, c_intptr_t
+    use :: mpi_f08, only : MPI_ADDRESS_KIND, MPI_Datatype, MPI_Type_copy_attr_function
+    use :: mpi_c_interface_types, only : c_Datatype
+
+    implicit none
+
+    procedure (MPI_Type_copy_attr_function)          :: user_function
+    integer(c_Datatype), value, intent(in)           :: oldtype
+    integer(c_int), value, intent(in)                :: type_keyval
+    integer(c_intptr_t), value, intent(in)           :: extra_state
+    integer(kind(MPIR_ATTR_AINT)), value, intent(in) :: attr_type
+    integer(c_intptr_t), value, intent(in)           :: attribute_val_in
+    integer(c_intptr_t), intent(out)                 :: attribute_val_out
+    integer(c_int), intent(out)                      :: flag
+    integer(c_int)                                   :: ierror
+
+    type(MPI_Datatype)        :: oldtype_f
+    integer                   :: type_keyval_f
+    integer(MPI_ADDRESS_KIND) :: extra_state_f
+    integer(MPI_ADDRESS_KIND) :: attribute_val_in_f
+    integer(MPI_ADDRESS_KIND) :: attribute_val_out_f
+    logical                   :: flag_f
+    integer                   :: ierror_f
+
+    oldtype_f%MPI_VAL   = oldtype
+    type_keyval_f       = type_keyval
+    attribute_val_in_f  = attribute_val_in
+    extra_state_f       = extra_state
+
+    call user_function(oldtype_f, type_keyval_f, extra_state_f, attribute_val_in_f, attribute_val_out_f, flag_f, ierror_f)
+
+    attribute_val_out = attribute_val_out_f
+    flag = merge(1, 0, flag_f)
+    ierror = ierror_f
+
+end function MPIR_Type_copy_attr_f08_proxy
+
+function MPIR_Type_delete_attr_f08_proxy (user_function, type, type_keyval, attr_type, &
+        attribute_val, extra_state) result(ierror)
+    use :: iso_c_binding, only : c_int, c_intptr_t
+    use :: mpi_f08, only : MPI_ADDRESS_KIND, MPI_Datatype, MPI_Type_delete_attr_function
+    use :: mpi_c_interface_types, only : c_Datatype
+
+    implicit none
+
+    procedure (MPI_Type_delete_attr_function)        :: user_function
+    integer(c_Datatype), value, intent(in)           :: type
+    integer(c_int), value, intent(in)                :: type_keyval
+    integer(kind(MPIR_ATTR_AINT)), value, intent(in) :: attr_type ! Only used in C proxy
+    integer(c_intptr_t), value, intent(in)           :: attribute_val
+    integer(c_intptr_t), value, intent(in)           :: extra_state
+    integer(c_int)                                   :: ierror
+
+    type(MPI_Datatype)        :: type_f
+    integer                   :: type_keyval_f
+    integer(MPI_ADDRESS_KIND) :: attribute_val_f
+    integer(MPI_ADDRESS_KIND) :: extra_state_f
+    integer                   :: ierror_f
+
+    type_f%MPI_VAL  = type
+    type_keyval_f   = type_keyval
+    attribute_val_f = attribute_val
+    extra_state_f   = extra_state
+
+    call user_function(type_f, type_keyval_f, attribute_val_f, extra_state_f, ierror_f)
+
+    ierror = ierror_f
+
+end function MPIR_Type_delete_attr_f08_proxy
+
+function MPIR_Win_copy_attr_f08_proxy (user_function, oldwin, win_keyval, extra_state, &
+        attr_type, attribute_val_in, attribute_val_out, flag) result(ierror)
+
+    use :: iso_c_binding, only : c_int, c_intptr_t
+    use :: mpi_f08, only : MPI_ADDRESS_KIND, MPI_Win, MPI_Win_copy_attr_function
+    use :: mpi_c_interface_types, only : c_Win
+
+    implicit none
+
+    procedure (MPI_Win_copy_attr_function)           :: user_function
+    integer(c_Win), value, intent(in)                :: oldwin
+    integer(c_int), value, intent(in)                :: win_keyval
+    integer(c_intptr_t), value, intent(in)           :: extra_state
+    integer(kind(MPIR_ATTR_AINT)), value, intent(in) :: attr_type ! Only used in C proxy
+    integer(c_intptr_t), value, intent(in)           :: attribute_val_in
+    integer(c_intptr_t), intent(out)                 :: attribute_val_out
+    integer(c_int), intent(out)                      :: flag
+    integer(c_int)                                   :: ierror
+
+    type(MPI_Win)             :: oldwin_f
+    integer                   :: win_keyval_f
+    integer(MPI_ADDRESS_KIND) :: extra_state_f
+    integer(MPI_ADDRESS_KIND) :: attribute_val_in_f
+    integer(MPI_ADDRESS_KIND) :: attribute_val_out_f
+    logical                   :: flag_f
+    integer                   :: ierror_f
+
+    oldwin_f%MPI_VAL   = oldwin
+    win_keyval_f       = win_keyval
+    attribute_val_in_f  = attribute_val_in
+    extra_state_f       = extra_state
+
+    call user_function(oldwin_f, win_keyval_f, extra_state_f, attribute_val_in_f, attribute_val_out_f, flag_f, ierror_f)
+
+    attribute_val_out = attribute_val_out_f
+    flag = merge(1, 0, flag_f)
+    ierror = ierror_f
+
+end function MPIR_Win_copy_attr_f08_proxy
+
+function MPIR_Win_delete_attr_f08_proxy (user_function, win, win_keyval, attr_type, &
+        attribute_val, extra_state) result(ierror)
+    use :: iso_c_binding, only : c_int, c_intptr_t
+    use :: mpi_f08, only : MPI_ADDRESS_KIND, MPI_Win, MPI_Win_delete_attr_function
+    use :: mpi_c_interface_types, only : c_Win
+
+    implicit none
+
+    procedure (MPI_Win_delete_attr_function)         :: user_function
+    integer(c_Win), value, intent(in)                :: win
+    integer(c_int), value, intent(in)                :: win_keyval
+    integer(kind(MPIR_ATTR_AINT)), value, intent(in) :: attr_type ! Only used in C proxy
+    integer(c_intptr_t), value, intent(in)           :: attribute_val
+    integer(c_intptr_t), value, intent(in)           :: extra_state
+    integer(c_int)                                   :: ierror
+
+    type(MPI_Win)             :: win_f
+    integer                   :: win_keyval_f
+    integer(MPI_ADDRESS_KIND) :: attribute_val_f
+    integer(MPI_ADDRESS_KIND) :: extra_state_f
+    integer                   :: ierror_f
+
+    win_f%MPI_VAL  = win
+    win_keyval_f   = win_keyval
+    attribute_val_f = attribute_val
+    extra_state_f   = extra_state
+
+    call user_function(win_f, win_keyval_f, attribute_val_f, extra_state_f, ierror_f)
+
+    ierror = ierror_f
+
+end function MPIR_Win_delete_attr_f08_proxy
+
+end module mpi_c_interface_glue
diff --git a/src/binding/fortran/use_mpi_f08/mpi_c_interface_nobuf.F90 b/src/binding/fortran/use_mpi_f08/mpi_c_interface_nobuf.F90
new file mode 100644
index 0000000..c24e6f0
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/mpi_c_interface_nobuf.F90
@@ -0,0 +1,2364 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+module mpi_c_interface_nobuf
+
+implicit none
+
+interface
+
+function MPIR_Buffer_detach_c(buffer_addr, size) &
+    bind(C, name="PMPI_Buffer_detach") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_ptr
+    implicit none
+    type(c_ptr), intent(out) :: buffer_addr
+    integer(c_int), intent(out) :: size
+    integer(c_int) :: ierror
+end function MPIR_Buffer_detach_c
+
+function MPIR_Cancel_c(request) &
+    bind(C, name="PMPI_Cancel") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Request
+    implicit none
+    integer(c_Request), value, intent(in) :: request
+    integer(c_int) :: ierror
+end function MPIR_Cancel_c
+
+function MPIR_Get_count_c(status, datatype, count) &
+    bind(C, name="PMPI_Get_count") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_ptr
+    use :: mpi_c_interface_types, only : c_Datatype
+    implicit none
+    type(c_ptr), value, intent(in) :: status
+    integer(c_Datatype), value, intent(in) :: datatype
+    integer(c_int), intent(out) :: count
+    integer(c_int) :: ierror
+end function MPIR_Get_count_c
+
+function MPIR_Start_c(request) &
+    bind(C, name="PMPI_Start") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Request
+    implicit none
+    integer(c_Request), intent(inout) :: request
+    integer(c_int) :: ierror
+end function MPIR_Start_c
+
+function MPIR_Startall_c(count, array_of_requests) &
+    bind(C, name="PMPI_Startall") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Request
+    implicit none
+    integer(c_int), value, intent(in) :: count
+    integer(c_Request), intent(inout) :: array_of_requests(count)
+    integer(c_int) :: ierror
+end function MPIR_Startall_c
+
+function MPIR_Test_c(request, flag, status) &
+    bind(C, name="PMPI_Test") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_ptr
+    use :: mpi_c_interface_types, only : c_Request
+    implicit none
+    integer(c_Request), intent(inout) :: request
+    integer(c_int), intent(out) :: flag
+    type(c_ptr), value, intent(in) :: status
+    integer(c_int) :: ierror
+end function MPIR_Test_c
+
+function MPIR_Testall_c(count, array_of_requests, flag, array_of_statuses) &
+    bind(C, name="PMPI_Testall") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_ptr
+    use :: mpi_c_interface_types, only : c_Request
+    implicit none
+    integer(c_int), value, intent(in) :: count
+    integer(c_Request), intent(inout) :: array_of_requests(count)
+    integer(c_int), intent(out) :: flag
+    type(c_ptr), value, intent(in) :: array_of_statuses
+    integer(c_int) :: ierror
+end function MPIR_Testall_c
+
+function MPIR_Testany_c(count, array_of_requests, index, flag, status) &
+    bind(C, name="PMPI_Testany") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_ptr
+    use :: mpi_c_interface_types, only : c_Request
+    implicit none
+    integer(c_int), value, intent(in) :: count
+    integer(c_Request), intent(inout) :: array_of_requests(count)
+    integer(c_int), intent(out) :: index
+    integer(c_int), intent(out) :: flag
+    type(c_ptr), value, intent(in) :: status
+    integer(c_int) :: ierror
+end function MPIR_Testany_c
+
+function MPIR_Testsome_c(incount, array_of_requests, outcount,  &
+          array_of_indices, array_of_statuses) bind(C, name="PMPI_Testsome") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_ptr
+    use :: mpi_c_interface_types, only : c_Request
+    implicit none
+    integer(c_int), value, intent(in) :: incount
+    integer(c_Request), intent(inout) :: array_of_requests(incount)
+    integer(c_int), intent(out) :: outcount, array_of_indices(*)
+    type(c_ptr), value, intent(in) :: array_of_statuses
+    integer(c_int) :: ierror
+end function MPIR_Testsome_c
+
+function MPIR_Test_cancelled_c(status, flag) &
+    bind(C, name="PMPI_Test_cancelled") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_ptr
+    implicit none
+    type(c_ptr), value, intent(in) :: status
+    integer(c_int), intent(out) :: flag
+    integer(c_int) :: ierror
+end function MPIR_Test_cancelled_c
+
+function MPIR_Wait_c(request, status) &
+    bind(C, name="PMPI_Wait") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_ptr
+    use :: mpi_c_interface_types, only : c_Request
+    implicit none
+    integer(c_Request), intent(inout) :: request
+    type(c_ptr), value, intent(in) :: status
+    integer(c_int) :: ierror
+end function MPIR_Wait_c
+
+function MPIR_Waitall_c(count, array_of_requests, array_of_statuses) &
+    bind(C, name="PMPI_Waitall") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_ptr
+    use :: mpi_c_interface_types, only : c_Request
+    implicit none
+    integer(c_int), value, intent(in) :: count
+    integer(c_Request), intent(inout) :: array_of_requests(count)
+    type(c_ptr), value, intent(in) :: array_of_statuses
+    integer(c_int) :: ierror
+end function MPIR_Waitall_c
+
+function MPIR_Waitany_c(count, array_of_requests, index, status) &
+    bind(C, name="PMPI_Waitany") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_ptr
+    use :: mpi_c_interface_types, only : c_Request
+    implicit none
+    integer(c_int), value, intent(in) :: count
+    integer(c_Request), intent(inout) :: array_of_requests(count)
+    integer(c_int), intent(out) :: index
+    type(c_ptr), value, intent(in) :: status
+    integer(c_int) :: ierror
+end function MPIR_Waitany_c
+
+function MPIR_Waitsome_c(incount, array_of_requests, outcount, &
+           array_of_indices, array_of_statuses) &
+    bind(C, name="PMPI_Waitsome") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_ptr
+    use :: mpi_c_interface_types, only : c_Request
+    implicit none
+    integer(c_int), value, intent(in) :: incount
+    integer(c_Request), intent(inout) :: array_of_requests(incount)
+    integer(c_int), intent(out) :: outcount, array_of_indices(*)
+    type(c_ptr), value, intent(in) :: array_of_statuses
+    integer(c_int) :: ierror
+end function MPIR_Waitsome_c
+
+function MPIR_Get_elements_c(status, datatype, count) &
+    bind(C, name="PMPI_Get_elements") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_ptr
+    use :: mpi_c_interface_types, only : c_Datatype
+    implicit none
+    type(c_ptr), value, intent(in) :: status
+    integer(c_Datatype), value, intent(in) :: datatype
+    integer(c_int), intent(out) :: count
+    integer(c_int) :: ierror
+end function MPIR_Get_elements_c
+
+function MPIR_Get_elements_x_c(status, datatype, count) &
+    bind(C, name="PMPI_Get_elements_x") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_ptr
+    use :: mpi_f08_compile_constants, only : MPI_COUNT_KIND
+    use :: mpi_c_interface_types, only : c_Datatype
+    implicit none
+    type(c_ptr), value, intent(in) :: status
+    integer(c_Datatype), value, intent(in) :: datatype
+    integer(MPI_COUNT_KIND), intent(out) :: count
+    integer(c_int) :: ierror
+end function MPIR_Get_elements_x_c
+
+function MPIR_Pack_external_size_c(datarep, incount, datatype, size) &
+    bind(C, name="PMPI_Pack_external_size") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_char
+    use :: mpi_f08_compile_constants, only : MPI_ADDRESS_KIND
+    use :: mpi_c_interface_types, only : c_Datatype
+    implicit none
+    integer(c_Datatype), value, intent(in) :: datatype
+    integer(c_int), value, intent(in) :: incount
+    character(kind=c_char), intent(in) :: datarep(*)
+    integer(MPI_ADDRESS_KIND), intent(out) :: size
+    integer(c_int) :: ierror
+end function MPIR_Pack_external_size_c
+
+function MPIR_Pack_size_c(incount, datatype, comm, size) &
+    bind(C, name="PMPI_Pack_size") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Datatype, c_Comm
+    implicit none
+    integer(c_int), value, intent(in) :: incount
+    integer(c_Datatype), value, intent(in) :: datatype
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_int), intent(out) :: size
+    integer(c_int) :: ierror
+end function MPIR_Pack_size_c
+
+function MPIR_Type_commit_c(datatype) &
+    bind(C, name="PMPI_Type_commit") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Datatype
+    implicit none
+    integer(c_Datatype), intent(inout) :: datatype
+    integer(c_int) :: ierror
+end function MPIR_Type_commit_c
+
+function MPIR_Type_contiguous_c(count, oldtype, newtype) &
+    bind(C, name="PMPI_Type_contiguous") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Datatype
+    implicit none
+    integer(c_int), value, intent(in) :: count
+    integer(c_Datatype), value, intent(in) :: oldtype
+    integer(c_Datatype), intent(out) :: newtype
+    integer(c_int) :: ierror
+end function MPIR_Type_contiguous_c
+
+function MPIR_Type_create_darray_c(size, rank, ndims, array_of_gsizes, &
+           array_of_distribs, array_of_dargs, array_of_psizes, order, oldtype, newtype) &
+    bind(C, name="PMPI_Type_create_darray") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Datatype
+    implicit none
+    integer(c_int), value, intent(in) :: size, rank, ndims, order
+    integer(c_int), intent(in) :: array_of_gsizes(ndims), array_of_distribs(ndims)
+    integer(c_int), intent(in) :: array_of_dargs(ndims), array_of_psizes(ndims)
+    integer(c_Datatype), value, intent(in) :: oldtype
+    integer(c_Datatype), intent(out) :: newtype
+    integer(c_int) :: ierror
+end function MPIR_Type_create_darray_c
+
+function MPIR_Type_create_hindexed_c(count, array_of_blocklengths, &
+           array_of_displacements, oldtype, newtype) &
+    bind(C, name="PMPI_Type_create_hindexed") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_f08_compile_constants, only : MPI_ADDRESS_KIND
+    use :: mpi_c_interface_types, only : c_Datatype
+    implicit none
+    integer(c_int), value, intent(in) :: count
+    integer(c_int), intent(in) :: array_of_blocklengths(count)
+    integer(MPI_ADDRESS_KIND), intent(in) :: array_of_displacements(count)
+    integer(c_Datatype), value, intent(in) :: oldtype
+    integer(c_Datatype), intent(out) :: newtype
+    integer(c_int) :: ierror
+end function MPIR_Type_create_hindexed_c
+
+function MPIR_Type_create_hvector_c(count, blocklength, stride, oldtype, newtype) &
+    bind(C, name="PMPI_Type_create_hvector") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_f08_compile_constants, only : MPI_ADDRESS_KIND
+    use :: mpi_c_interface_types, only : c_Datatype
+    implicit none
+    integer(c_int), value, intent(in) :: count, blocklength
+    integer(MPI_ADDRESS_KIND), value, intent(in) :: stride
+    integer(c_Datatype), value, intent(in) :: oldtype
+    integer(c_Datatype), intent(out) :: newtype
+    integer(c_int) :: ierror
+end function MPIR_Type_create_hvector_c
+
+function MPIR_Type_create_indexed_block_c(count, blocklength, &
+            array_of_displacements, oldtype, newtype) &
+    bind(C, name="PMPI_Type_create_indexed_block") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Datatype
+    implicit none
+    integer(c_int), value, intent(in) :: count, blocklength
+    integer(c_int), intent(in) :: array_of_displacements(count)
+    integer(c_Datatype), value, intent(in) :: oldtype
+    integer(c_Datatype), intent(out) :: newtype
+    integer(c_int) :: ierror
+end function MPIR_Type_create_indexed_block_c
+
+function MPIR_Type_create_hindexed_block_c(count, blocklength, &
+           array_of_displacements, oldtype, newtype) &
+    bind(C, name="PMPI_Type_create_hindexed_block") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_f08_compile_constants, only : MPI_ADDRESS_KIND
+    use :: mpi_c_interface_types, only : c_Datatype
+    implicit none
+    integer(c_int), value, intent(in) :: count, blocklength
+    integer(MPI_ADDRESS_KIND), intent(in) :: array_of_displacements(count)
+    integer(c_Datatype), value, intent(in) :: oldtype
+    integer(c_Datatype), intent(out) :: newtype
+    integer(c_int) :: ierror
+end function MPIR_Type_create_hindexed_block_c
+
+function MPIR_Type_create_resized_c(oldtype, lb, extent, newtype) &
+    bind(C, name="PMPI_Type_create_resized") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_f08_compile_constants, only : MPI_ADDRESS_KIND
+    use :: mpi_c_interface_types, only : c_Datatype
+    implicit none
+    integer(MPI_ADDRESS_KIND), value, intent(in) :: lb, extent
+    integer(c_Datatype), value, intent(in) :: oldtype
+    integer(c_Datatype), intent(out) :: newtype
+    integer(c_int) :: ierror
+end function MPIR_Type_create_resized_c
+
+function MPIR_Type_create_struct_c(count, array_of_blocklengths, &
+           array_of_displacements, array_of_types, newtype) &
+    bind(C, name="PMPI_Type_create_struct") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_f08_compile_constants, only : MPI_ADDRESS_KIND
+    use :: mpi_c_interface_types, only : c_Datatype
+    implicit none
+    integer(c_int), value, intent(in) :: count
+    integer(c_int), intent(in) :: array_of_blocklengths(count)
+    integer(MPI_ADDRESS_KIND), intent(in) :: array_of_displacements(count)
+    integer(c_Datatype), intent(in) :: array_of_types(count)
+    integer(c_Datatype), intent(out) :: newtype
+    integer(c_int) :: ierror
+end function MPIR_Type_create_struct_c
+
+function MPIR_Type_create_subarray_c(ndims, array_of_sizes, array_of_subsizes, &
+           array_of_starts, order, oldtype, newtype) &
+    bind(C, name="PMPI_Type_create_subarray") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Datatype
+    implicit none
+    integer(c_int), value, intent(in) :: ndims, order
+    integer(c_int), intent(in) :: array_of_sizes(ndims), array_of_subsizes(ndims)
+    integer(c_int), intent(in) :: array_of_starts(ndims)
+    integer(c_Datatype), value, intent(in) :: oldtype
+    integer(c_Datatype), intent(out) :: newtype
+    integer(c_int) :: ierror
+end function MPIR_Type_create_subarray_c
+
+function MPIR_Type_dup_c(oldtype, newtype) &
+    bind(C, name="PMPI_Type_dup") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Datatype
+    implicit none
+    integer(c_Datatype), value, intent(in) :: oldtype
+    integer(c_Datatype), intent(out) :: newtype
+    integer(c_int) :: ierror
+end function MPIR_Type_dup_c
+
+function MPIR_Type_free_c(datatype) &
+    bind(C, name="PMPI_Type_free") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Datatype
+    implicit none
+    integer(c_Datatype), intent(inout) :: datatype
+    integer(c_int) :: ierror
+end function MPIR_Type_free_c
+
+function MPIR_Type_get_contents_c(datatype, max_integers, max_addresses, max_datatypes, &
+           array_of_integers, array_of_addresses, array_of_datatypes) &
+    bind(C, name="PMPI_Type_get_contents") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_f08_compile_constants, only : MPI_ADDRESS_KIND
+    use :: mpi_c_interface_types, only : c_Datatype
+    implicit none
+    integer(c_Datatype), value, intent(in) :: datatype
+    integer(c_int), value, intent(in) :: max_integers, max_addresses, max_datatypes
+    integer(c_int), intent(out) :: array_of_integers(max_integers)
+    integer(MPI_ADDRESS_KIND), intent(out) :: array_of_addresses(max_addresses)
+    integer(c_Datatype), intent(out) :: array_of_datatypes(max_datatypes)
+    integer(c_int) :: ierror
+end function MPIR_Type_get_contents_c
+
+function MPIR_Type_get_envelope_c(datatype, num_integers, num_addresses, num_datatypes, combiner) &
+    bind(C, name="PMPI_Type_get_envelope") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Datatype
+    implicit none
+    integer(c_Datatype), value, intent(in) :: datatype
+    integer(c_int), intent(out) :: num_integers, num_addresses, num_datatypes, combiner
+    integer(c_int) :: ierror
+end function MPIR_Type_get_envelope_c
+
+function MPIR_Type_get_extent_c(datatype, lb, extent) &
+    bind(C, name="PMPI_Type_get_extent") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_f08_compile_constants, only : MPI_ADDRESS_KIND
+    use :: mpi_c_interface_types, only : c_Datatype
+    implicit none
+    integer(c_Datatype), value, intent(in) :: datatype
+    integer(MPI_ADDRESS_KIND), intent(out) :: lb, extent
+    integer(c_int) :: ierror
+end function MPIR_Type_get_extent_c
+
+function MPIR_Type_get_extent_x_c(datatype, lb, extent) &
+    bind(C, name="PMPI_Type_get_extent_x") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_f08_compile_constants, only : MPI_COUNT_KIND
+    use :: mpi_c_interface_types, only : c_Datatype
+    implicit none
+    integer(c_Datatype), value, intent(in) :: datatype
+    integer(MPI_COUNT_KIND), intent(out) :: lb, extent
+    integer(c_int) :: ierror
+end function MPIR_Type_get_extent_x_c
+
+function MPIR_Type_get_true_extent_c(datatype, true_lb, true_extent) &
+    bind(C, name="PMPI_Type_get_true_extent") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_f08_compile_constants, only : MPI_ADDRESS_KIND
+    use :: mpi_c_interface_types, only : c_Datatype
+    implicit none
+    integer(c_Datatype), value, intent(in) :: datatype
+    integer(MPI_ADDRESS_KIND), intent(out) :: true_lb, true_extent
+    integer(c_int) :: ierror
+end function MPIR_Type_get_true_extent_c
+
+function MPIR_Type_get_true_extent_x_c(datatype, true_lb, true_extent) &
+    bind(C, name="PMPI_Type_get_true_extent_x") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_f08_compile_constants, only : MPI_COUNT_KIND
+    use :: mpi_c_interface_types, only : c_Datatype
+    implicit none
+    integer(c_Datatype), value, intent(in) :: datatype
+    integer(MPI_COUNT_KIND), intent(out) :: true_lb, true_extent
+    integer(c_int) :: ierror
+end function MPIR_Type_get_true_extent_x_c
+
+function MPIR_Type_indexed_c(count, array_of_blocklengths, &
+           array_of_displacements, oldtype, newtype) &
+    bind(C, name="PMPI_Type_indexed") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Datatype
+    implicit none
+    integer(c_int), value, intent(in) :: count
+    integer(c_int), intent(in) :: array_of_blocklengths(count), array_of_displacements(count)
+    integer(c_Datatype), value, intent(in) :: oldtype
+    integer(c_Datatype), intent(out) :: newtype
+    integer(c_int) :: ierror
+end function MPIR_Type_indexed_c
+
+function MPIR_Type_size_c(datatype, size) &
+    bind(C, name="PMPI_Type_size") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Datatype
+    implicit none
+    integer(c_Datatype), value, intent(in) :: datatype
+    integer(c_int), intent(out) :: size
+    integer(c_int) :: ierror
+end function MPIR_Type_size_c
+
+function MPIR_Type_size_x_c(datatype, size) &
+    bind(C, name="PMPI_Type_size_x") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_f08_compile_constants, only : MPI_COUNT_KIND
+    use :: mpi_c_interface_types, only : c_Datatype
+    implicit none
+    integer(c_Datatype), value, intent(in) :: datatype
+    integer(MPI_COUNT_KIND), intent(out) :: size
+    integer(c_int) :: ierror
+end function MPIR_Type_size_x_c
+
+function MPIR_Type_vector_c(count, blocklength, stride, oldtype, newtype) &
+    bind(C, name="PMPI_Type_vector") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Datatype
+    implicit none
+    integer(c_int), value, intent(in) :: count, blocklength, stride
+    integer(c_Datatype), value, intent(in) :: oldtype
+    integer(c_Datatype), intent(out) :: newtype
+    integer(c_int) :: ierror
+end function MPIR_Type_vector_c
+
+
+function MPIR_Barrier_c(comm) &
+    bind(C, name="PMPI_Barrier") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Comm
+    implicit none
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_int) :: ierror
+end function MPIR_Barrier_c
+
+function MPIR_Ibarrier_c(comm, request) &
+    bind(C, name="PMPI_Ibarrier") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Comm, c_Request
+    implicit none
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_Request), intent(out) :: request
+    integer(c_int) :: ierror
+end function MPIR_Ibarrier_c
+
+function MPIR_Op_commutative_c(op, commute) &
+    bind(C, name="PMPI_Op_commutative") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Op
+    implicit none
+    integer(c_Op), value, intent(in) :: op
+    integer(c_int), intent(out) :: commute
+    integer(c_int) :: ierror
+end function MPIR_Op_commutative_c
+
+function MPIR_Op_create_c(user_fn, commute, op) &
+    bind(C, name="PMPI_Op_create") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_funptr
+    use :: mpi_c_interface_types, only : c_Op
+    implicit none
+    type(c_funptr), value :: user_fn
+    integer(c_int), intent(in) :: commute
+    integer(c_Op), intent(out) :: op
+    integer(c_int) :: ierror
+end function MPIR_Op_create_c
+
+function MPIR_Op_free_c(op) &
+    bind(C, name="PMPI_Op_free") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Op
+    implicit none
+    integer(c_Op), intent(inout) :: op
+    integer(c_int) :: ierror
+end function MPIR_Op_free_c
+
+function MPIR_Comm_compare_c(comm1,comm2,result) &
+    bind(C, name="PMPI_Comm_compare") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Comm
+    implicit none
+    integer(c_Comm), value, intent(in) :: comm1, comm2
+    integer(c_int), intent(out) :: result
+    integer(c_int) :: ierror
+end function MPIR_Comm_compare_c
+
+function MPIR_Comm_create_c(comm, group, newcomm) &
+    bind(C, name="PMPI_Comm_create") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Group, c_Comm
+    implicit none
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_Group), value, intent(in) :: group
+    integer(c_Comm), intent(out) :: newcomm
+    integer(c_int) :: ierror
+end function MPIR_Comm_create_c
+
+function MPIR_Comm_create_group_c(comm, group, tag, newcomm) &
+    bind(C, name="PMPI_Comm_create_group") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Group, c_Comm
+    implicit none
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_Group), value, intent(in) :: group
+    integer(c_int), value, intent(in) :: tag
+    integer(c_Comm), intent(out) :: newcomm
+    integer(c_int) :: ierror
+end function MPIR_Comm_create_group_c
+
+function MPIR_Comm_create_keyval_c(comm_copy_attr_fn, comm_delete_attr_fn, comm_keyval, extra_state) &
+    bind(C, name="PMPI_Comm_create_keyval") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_funptr
+    use :: mpi_f08_compile_constants, only : MPI_ADDRESS_KIND
+    implicit none
+    type(c_funptr), value :: comm_copy_attr_fn
+    type(c_funptr), value :: comm_delete_attr_fn
+    integer(c_int), intent(out) :: comm_keyval
+    integer(MPI_ADDRESS_KIND), value, intent(in) :: extra_state
+    integer(c_int) :: ierror
+end function MPIR_Comm_create_keyval_c
+
+function MPIR_Comm_delete_attr_c(comm, comm_keyval) &
+    bind(C, name="PMPI_Comm_delete_attr") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Comm
+    implicit none
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_int), value, intent(in) :: comm_keyval
+    integer(c_int) :: ierror
+end function MPIR_Comm_delete_attr_c
+
+function MPIR_Comm_dup_c(comm, newcomm) &
+    bind(C, name="PMPI_Comm_dup") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Comm
+    implicit none
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_Comm), intent(out) :: newcomm
+    integer(c_int) :: ierror
+end function MPIR_Comm_dup_c
+
+function MPIR_Comm_dup_with_info_c(comm, info, newcomm) &
+    bind(C, name="PMPI_Comm_dup_with_info") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Comm, c_Info
+    implicit none
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_Info), value, intent(in) :: info
+    integer(c_Comm), intent(out) :: newcomm
+    integer(c_int) :: ierror
+end function MPIR_Comm_dup_with_info_c
+
+function MPIR_Comm_idup_c(comm, newcomm, request) &
+    bind(C, name="PMPI_Comm_idup") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Comm, c_Request
+    implicit none
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_Comm), intent(out) :: newcomm
+    integer(c_Request), intent(out) :: request
+    integer(c_int) :: ierror
+end function MPIR_Comm_idup_c
+
+function MPIR_Comm_free_c(comm) &
+    bind(C, name="PMPI_Comm_free") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Comm
+    implicit none
+    integer(c_Comm), intent(inout) :: comm
+    integer(c_int) :: ierror
+end function MPIR_Comm_free_c
+
+function MPIR_Comm_free_keyval_c(comm_keyval) &
+    bind(C, name="PMPI_Comm_free_keyval") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    implicit none
+    integer(c_int), intent(inout) :: comm_keyval
+    integer(c_int) :: ierror
+end function MPIR_Comm_free_keyval_c
+
+! Not bind to MPI_Comm_get_attr directly due to the attr_type tag
+function MPIR_Comm_get_attr_c(comm, comm_keyval, attribute_val, flag, attr_type) &
+    bind(C, name="MPIR_CommGetAttr") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_f08_compile_constants, only : MPI_ADDRESS_KIND
+    use :: mpi_c_interface_types, only : c_Comm
+    use :: mpi_c_interface_glue, only : MPIR_ATTR_AINT
+    implicit none
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_int), value, intent(in) :: comm_keyval
+    integer(MPI_ADDRESS_KIND), intent(out) :: attribute_val
+    integer(c_int), intent(out) :: flag
+    integer(kind(MPIR_ATTR_AINT)), value, intent(in) :: attr_type
+    integer(c_int) :: ierror
+end function MPIR_Comm_get_attr_c
+
+function MPIR_Comm_get_name_c(comm, comm_name, resultlen) &
+    bind(C, name="PMPI_Comm_get_name") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_char
+    use :: mpi_f08_compile_constants, only : MPI_MAX_OBJECT_NAME
+    use :: mpi_c_interface_types, only : c_Comm
+    implicit none
+    integer(c_Comm), value, intent(in) :: comm
+    character(kind=c_char), intent(out) :: comm_name(MPI_MAX_OBJECT_NAME+1)
+    integer(c_int), intent(out) :: resultlen
+    integer(c_int) :: ierror
+end function MPIR_Comm_get_name_c
+
+function MPIR_Comm_group_c(comm, group) &
+    bind(C, name="PMPI_Comm_group") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Comm, c_Group
+    implicit none
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_Group), intent(out) :: group
+    integer(c_int) :: ierror
+end function MPIR_Comm_group_c
+
+function MPIR_Comm_rank_c(comm, rank) &
+    bind(C, name="PMPI_Comm_rank") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Comm
+    implicit none
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_int), intent(out) :: rank
+    integer(c_int) :: ierror
+end function MPIR_Comm_rank_c
+
+function MPIR_Comm_remote_group_c(comm, group) &
+    bind(C, name="PMPI_Comm_remote_group") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Comm, c_Group
+    implicit none
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_Group), intent(out) :: group
+    integer(c_int) :: ierror
+end function MPIR_Comm_remote_group_c
+
+function MPIR_Comm_remote_size_c(comm, size) &
+    bind(C, name="PMPI_Comm_remote_size") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Comm
+    implicit none
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_int), intent(out) :: size
+    integer(c_int) :: ierror
+end function MPIR_Comm_remote_size_c
+
+function MPIR_Comm_set_attr_c(comm, comm_keyval, attribute_val, attr_type) &
+    bind(C, name="MPIR_CommSetAttr") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_f08_compile_constants, only : MPI_ADDRESS_KIND
+    use :: mpi_c_interface_types, only : c_Comm
+    use :: mpi_c_interface_glue, only : MPIR_ATTR_AINT
+    implicit none
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_int), value, intent(in) :: comm_keyval
+    integer(MPI_ADDRESS_KIND), value, intent(in) :: attribute_val
+    integer(kind(MPIR_ATTR_AINT)), value, intent(in) :: attr_type
+    integer(c_int) :: ierror
+end function MPIR_Comm_set_attr_c
+
+function MPIR_Comm_set_name_c(comm, comm_name) &
+    bind(C, name="PMPI_Comm_set_name") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_char
+    use :: mpi_c_interface_types, only : c_Comm
+    implicit none
+    integer(c_Comm), value, intent(in) :: comm
+    character(kind=c_char), intent(in) :: comm_name(*)
+    integer(c_int) :: ierror
+end function MPIR_Comm_set_name_c
+
+function MPIR_Comm_size_c(comm, size) &
+    bind(C, name="PMPI_Comm_size") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Comm
+    implicit none
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_int), intent(out) :: size
+    integer(c_int) :: ierror
+end function MPIR_Comm_size_c
+
+function MPIR_Comm_split_c(comm, color, key, newcomm) &
+    bind(C, name="PMPI_Comm_split") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Comm
+    implicit none
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_int), value, intent(in) :: color, key
+    integer(c_Comm), intent(out) :: newcomm
+    integer(c_int) :: ierror
+end function MPIR_Comm_split_c
+
+function MPIR_Comm_test_inter_c(comm, flag) &
+    bind(C, name="PMPI_Comm_test_inter") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Comm
+    implicit none
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_int), intent(out) :: flag
+    integer(c_int) :: ierror
+end function MPIR_Comm_test_inter_c
+
+function MPIR_Group_compare_c(group1,group2,result) &
+    bind(C, name="PMPI_Group_compare") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Group
+    implicit none
+    integer(c_Group), value, intent(in) :: group1, group2
+    integer(c_int), intent(out) :: result
+    integer(c_int) :: ierror
+end function MPIR_Group_compare_c
+
+function MPIR_Group_difference_c(group1,group2,newgroup) &
+    bind(C, name="PMPI_Group_difference") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Group
+    implicit none
+    integer(c_Group), value, intent(in) :: group1, group2
+    integer(c_Group), intent(out) :: newgroup
+    integer(c_int) :: ierror
+end function MPIR_Group_difference_c
+
+function MPIR_Group_excl_c(group, n,ranks, newgroup) &
+    bind(C, name="PMPI_Group_excl") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Group
+    implicit none
+    integer(c_Group), value, intent(in) :: group
+    integer(c_int), value, intent(in) :: n
+    integer(c_int), intent(in) :: ranks(n)
+    integer(c_Group), intent(out) :: newgroup
+    integer(c_int) :: ierror
+end function MPIR_Group_excl_c
+
+function MPIR_Group_free_c(group) &
+    bind(C, name="PMPI_Group_free") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Group
+    implicit none
+    integer(c_Group), intent(inout) :: group
+    integer(c_int) :: ierror
+end function MPIR_Group_free_c
+
+function MPIR_Group_incl_c(group, n,ranks, newgroup) &
+    bind(C, name="PMPI_Group_incl") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Group
+    implicit none
+    integer(c_int), value, intent(in) :: n
+    integer(c_int), intent(in) :: ranks(n)
+    integer(c_Group), value, intent(in) :: group
+    integer(c_Group), intent(out) :: newgroup
+    integer(c_int) :: ierror
+end function MPIR_Group_incl_c
+
+function MPIR_Group_intersection_c(group1,group2,newgroup) &
+    bind(C, name="PMPI_Group_intersection") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Group
+    implicit none
+    integer(c_Group), value, intent(in) :: group1, group2
+    integer(c_Group), intent(out) :: newgroup
+    integer(c_int) :: ierror
+end function MPIR_Group_intersection_c
+
+function MPIR_Group_range_excl_c(group, n,ranges, newgroup) &
+    bind(C, name="PMPI_Group_range_excl") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Group
+    implicit none
+    integer(c_Group), value, intent(in) :: group
+    integer(c_int), value, intent(in) :: n
+    integer(c_int), intent(in) :: ranges(3,n)
+    integer(c_Group), intent(out) :: newgroup
+    integer(c_int) :: ierror
+end function MPIR_Group_range_excl_c
+
+function MPIR_Group_range_incl_c(group, n,ranges, newgroup) &
+    bind(C, name="PMPI_Group_range_incl") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Group
+    implicit none
+    integer(c_Group), value, intent(in) :: group
+    integer(c_int), value, intent(in) :: n
+    integer(c_int), intent(in) :: ranges(3,n)
+    integer(c_Group), intent(out) :: newgroup
+    integer(c_int) :: ierror
+end function MPIR_Group_range_incl_c
+
+function MPIR_Group_rank_c(group, rank) &
+    bind(C, name="PMPI_Group_rank") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Group
+    implicit none
+    integer(c_Group), value, intent(in) :: group
+    integer(c_int), intent(out) :: rank
+    integer(c_int) :: ierror
+end function MPIR_Group_rank_c
+
+function MPIR_Group_size_c(group, size) &
+    bind(C, name="PMPI_Group_size") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Group
+    implicit none
+    integer(c_Group), value, intent(in) :: group
+    integer(c_int), intent(out) :: size
+    integer(c_int) :: ierror
+end function MPIR_Group_size_c
+
+function MPIR_Group_translate_ranks_c(group1,n, ranks1,group2,ranks2) &
+    bind(C, name="PMPI_Group_translate_ranks") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Group
+    implicit none
+    integer(c_Group), value, intent(in) :: group1, group2
+    integer(c_int), value, intent(in) :: n
+    integer(c_int), intent(in) :: ranks1(n)
+    integer(c_int), intent(out) :: ranks2(n)
+    integer(c_int) :: ierror
+end function MPIR_Group_translate_ranks_c
+
+function MPIR_Group_union_c(group1,group2,newgroup) &
+    bind(C, name="PMPI_Group_union") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Group
+    implicit none
+    integer(c_Group), value, intent(in) :: group1, group2
+    integer(c_Group), intent(out) :: newgroup
+    integer(c_int) :: ierror
+end function MPIR_Group_union_c
+
+function MPIR_Intercomm_create_c(local_comm, local_leader, peer_comm, remote_leader, tag, newintercomm) &
+    bind(C, name="PMPI_Intercomm_create") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Comm
+    implicit none
+    integer(c_Comm), value, intent(in) :: local_comm, peer_comm
+    integer(c_int), value, intent(in) :: local_leader, remote_leader, tag
+    integer(c_Comm), intent(out) :: newintercomm
+    integer(c_int) :: ierror
+end function MPIR_Intercomm_create_c
+
+function MPIR_Intercomm_merge_c(intercomm, high, newintracomm) &
+    bind(C, name="PMPI_Intercomm_merge") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Comm
+    implicit none
+    integer(c_Comm), value, intent(in) :: intercomm
+    integer(c_int), intent(in) :: high
+    integer(c_Comm), intent(out) :: newintracomm
+    integer(c_int) :: ierror
+end function MPIR_Intercomm_merge_c
+
+function MPIR_Type_create_keyval_c(type_copy_attr_fn, type_delete_attr_fn, type_keyval, extra_state) &
+    bind(C, name="PMPI_Type_create_keyval") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_funptr
+    use :: mpi_f08_compile_constants, only : MPI_ADDRESS_KIND
+    implicit none
+    type(c_funptr), value :: type_copy_attr_fn
+    type(c_funptr), value :: type_delete_attr_fn
+    integer(c_int), intent(out) :: type_keyval
+    integer(MPI_ADDRESS_KIND), value, intent(in) :: extra_state
+    integer(c_int) :: ierror
+end function MPIR_Type_create_keyval_c
+
+function MPIR_Type_delete_attr_c(datatype, type_keyval) &
+    bind(C, name="PMPI_Type_delete_attr") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Datatype
+    implicit none
+    integer(c_Datatype), value, intent(in) :: datatype
+    integer(c_int), value, intent(in) :: type_keyval
+    integer(c_int) :: ierror
+end function MPIR_Type_delete_attr_c
+
+function MPIR_Type_free_keyval_c(type_keyval) &
+    bind(C, name="PMPI_Type_free_keyval") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    implicit none
+    integer(c_int), intent(inout) :: type_keyval
+    integer(c_int) :: ierror
+end function MPIR_Type_free_keyval_c
+
+function MPIR_Type_get_attr_c(datatype, type_keyval, attribute_val, flag, attr_type) &
+    bind(C, name="MPIR_TypeGetAttr") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_f08_compile_constants, only : MPI_ADDRESS_KIND
+    use :: mpi_c_interface_types, only : c_Datatype
+    use :: mpi_c_interface_glue, only : MPIR_ATTR_AINT
+    implicit none
+    integer(c_Datatype), value, intent(in) :: datatype
+    integer(c_int), value, intent(in) :: type_keyval
+    integer(MPI_ADDRESS_KIND), intent(out) :: attribute_val
+    integer(c_int), intent(out) :: flag
+    integer(kind(MPIR_ATTR_AINT)), value, intent(in) :: attr_type
+    integer(c_int) :: ierror
+end function MPIR_Type_get_attr_c
+
+function MPIR_Type_get_name_c(datatype, type_name, resultlen) &
+    bind(C, name="PMPI_Type_get_name") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_char
+    use :: mpi_f08_compile_constants, only : MPI_MAX_OBJECT_NAME
+    use :: mpi_c_interface_types, only : c_Datatype
+    implicit none
+    integer(c_Datatype), value, intent(in) :: datatype
+    character(kind=c_char), intent(out) :: type_name(MPI_MAX_OBJECT_NAME+1)
+    integer(c_int), intent(out) :: resultlen
+    integer(c_int) :: ierror
+end function MPIR_Type_get_name_c
+
+function MPIR_Type_set_attr_c(datatype, type_keyval, attribute_val, attr_type) &
+    bind(C, name="MPIR_TypeSetAttr") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_f08_compile_constants, only : MPI_ADDRESS_KIND
+    use :: mpi_c_interface_types, only : c_Datatype
+    use :: mpi_c_interface_glue, only : MPIR_ATTR_AINT
+    implicit none
+    integer(c_Datatype), value, intent(in) :: datatype
+    integer(c_int), value, intent(in) :: type_keyval
+    integer(MPI_ADDRESS_KIND), value, intent(in) :: attribute_val
+    integer(kind(MPIR_ATTR_AINT)), value, intent(in) :: attr_type
+    integer(c_int) :: ierror
+end function MPIR_Type_set_attr_c
+
+function MPIR_Type_set_name_c(datatype, type_name) &
+    bind(C, name="PMPI_Type_set_name") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_char
+    use :: mpi_c_interface_types, only : c_Datatype
+    implicit none
+    integer(c_Datatype), value, intent(in) :: datatype
+    character(kind=c_char), intent(in) :: type_name(*)
+    integer(c_int) :: ierror
+end function MPIR_Type_set_name_c
+
+function MPIR_Win_create_keyval_c(win_copy_attr_fn, win_delete_attr_fn, win_keyval, extra_state) &
+    bind(C, name="PMPI_Win_create_keyval") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_funptr
+    use :: mpi_f08_compile_constants, only : MPI_ADDRESS_KIND
+    implicit none
+    type(c_funptr), value :: win_copy_attr_fn
+    type(c_funptr), value :: win_delete_attr_fn
+    integer(c_int), intent(out) :: win_keyval
+    integer(MPI_ADDRESS_KIND), value, intent(in) :: extra_state
+    integer(c_int) :: ierror
+end function MPIR_Win_create_keyval_c
+
+function MPIR_Win_delete_attr_c(win, win_keyval) &
+    bind(C, name="PMPI_Win_delete_attr") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Win
+    implicit none
+    integer(c_Win), value, intent(in) :: win
+    integer(c_int), value, intent(in) :: win_keyval
+    integer(c_int) :: ierror
+end function MPIR_Win_delete_attr_c
+
+function MPIR_Win_free_keyval_c(win_keyval) &
+    bind(C, name="PMPI_Win_free_keyval") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    implicit none
+    integer(c_int), intent(inout) :: win_keyval
+    integer(c_int) :: ierror
+end function MPIR_Win_free_keyval_c
+
+function MPIR_Win_get_attr_c(win, win_keyval, attribute_val, flag, attr_type) &
+    bind(C, name="MPIR_WinGetAttr") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_f08_compile_constants, only : MPI_ADDRESS_KIND
+    use :: mpi_c_interface_types, only : c_Win
+    use :: mpi_c_interface_glue, only : MPIR_ATTR_AINT
+    implicit none
+    integer(c_Win), value, intent(in) :: win
+    integer(c_int), value, intent(in) :: win_keyval
+    integer(MPI_ADDRESS_KIND), intent(out) :: attribute_val
+    integer(c_int), intent(out) :: flag
+    integer(kind(MPIR_ATTR_AINT)), value, intent(in) :: attr_type
+    integer(c_int) :: ierror
+end function MPIR_Win_get_attr_c
+
+function MPIR_Win_get_name_c(win, win_name, resultlen) &
+    bind(C, name="PMPI_Win_get_name") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_char
+    use :: mpi_f08_compile_constants, only : MPI_MAX_OBJECT_NAME
+    use :: mpi_c_interface_types, only : c_Win
+    implicit none
+    integer(c_Win), value, intent(in) :: win
+    character(kind=c_char), intent(out) :: win_name(MPI_MAX_OBJECT_NAME+1)
+    integer(c_int), intent(out) :: resultlen
+    integer(c_int) :: ierror
+end function MPIR_Win_get_name_c
+
+function MPIR_Win_set_attr_c(win, win_keyval, attribute_val, attr_type) &
+    bind(C, name="MPIR_WinSetAttr") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_f08_compile_constants, only : MPI_ADDRESS_KIND
+    use :: mpi_c_interface_types, only : c_Win
+    use :: mpi_c_interface_glue, only : MPIR_ATTR_AINT
+    implicit none
+    integer(c_Win), value, intent(in) :: win
+    integer(c_int), value, intent(in) :: win_keyval
+    integer(MPI_ADDRESS_KIND), value, intent(in) :: attribute_val
+    integer(kind(MPIR_ATTR_AINT)), value, intent(in) :: attr_type
+    integer(c_int) :: ierror
+end function MPIR_Win_set_attr_c
+
+function MPIR_Win_set_name_c(win, win_name) &
+    bind(C, name="PMPI_Win_set_name") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_char
+    use :: mpi_c_interface_types, only : c_Win
+    implicit none
+    integer(c_Win), value, intent(in) :: win
+    character(kind=c_char), intent(in) :: win_name(*)
+    integer(c_int) :: ierror
+end function MPIR_Win_set_name_c
+
+function MPIR_Cartdim_get_c(comm, ndims) &
+    bind(C, name="PMPI_Cartdim_get") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Comm
+    implicit none
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_int), intent(out) :: ndims
+    integer(c_int) :: ierror
+end function MPIR_Cartdim_get_c
+
+function MPIR_Cart_coords_c(comm, rank, maxdims, coords) &
+    bind(C, name="PMPI_Cart_coords") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Comm
+    implicit none
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_int), value, intent(in) :: rank, maxdims
+    integer(c_int), intent(out) :: coords(maxdims)
+    integer(c_int) :: ierror
+end function MPIR_Cart_coords_c
+
+function MPIR_Cart_create_c(comm_old, ndims, dims, periods, reorder, comm_cart) &
+    bind(C, name="PMPI_Cart_create") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Comm
+    implicit none
+    integer(c_Comm), value, intent(in) :: comm_old
+    integer(c_int), value, intent(in) :: ndims
+    integer(c_int), intent(in) :: dims(ndims)
+    integer(c_int), intent(in) :: periods(ndims), reorder
+    integer(c_Comm), intent(out) :: comm_cart
+    integer(c_int) :: ierror
+end function MPIR_Cart_create_c
+
+function MPIR_Cart_get_c(comm, maxdims, dims, periods, coords) &
+    bind(C, name="PMPI_Cart_get") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Comm
+    implicit none
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_int), value, intent(in) :: maxdims
+    integer(c_int), intent(out) :: dims(maxdims), coords(maxdims)
+    integer(c_int), intent(out) :: periods(maxdims)
+    integer(c_int) :: ierror
+end function MPIR_Cart_get_c
+
+function MPIR_Cart_map_c(comm, ndims, dims, periods, newrank) &
+    bind(C, name="PMPI_Cart_map") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Comm
+    implicit none
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_int), value, intent(in) :: ndims
+    integer(c_int), intent(in) :: dims(ndims)
+    integer(c_int), intent(in) :: periods(ndims)
+    integer(c_int), intent(out) :: newrank
+    integer(c_int) :: ierror
+end function MPIR_Cart_map_c
+
+function MPIR_Cart_rank_c(comm, coords, rank) &
+    bind(C, name="PMPI_Cart_rank") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Comm
+    implicit none
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_int), intent(in) :: coords(*)
+    integer(c_int), intent(out) :: rank
+    integer(c_int) :: ierror
+end function MPIR_Cart_rank_c
+
+function MPIR_Cart_shift_c(comm, direction, disp, rank_source, rank_dest) &
+    bind(C, name="PMPI_Cart_shift") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Comm
+    implicit none
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_int), value, intent(in) :: direction, disp
+    integer(c_int), intent(out) :: rank_source, rank_dest
+    integer(c_int) :: ierror
+end function MPIR_Cart_shift_c
+
+function MPIR_Cart_sub_c(comm, remain_dims, newcomm) &
+    bind(C, name="PMPI_Cart_sub") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Comm
+    implicit none
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_int), intent(in) :: remain_dims(*)
+    integer(c_Comm), intent(out) :: newcomm
+    integer(c_int) :: ierror
+end function MPIR_Cart_sub_c
+
+function MPIR_Dims_create_c(nnodes, ndims, dims) &
+    bind(C, name="PMPI_Dims_create") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    implicit none
+    integer(c_int), value, intent(in) :: nnodes, ndims
+    integer(c_int), intent(inout) :: dims(ndims)
+    integer(c_int) :: ierror
+end function MPIR_Dims_create_c
+
+function MPIR_Dist_graph_create_c(comm_old, n,sources, degrees, destinations, weights, &
+           info, reorder, comm_dist_graph) &
+    bind(C, name="PMPI_Dist_graph_create") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_ptr
+    use :: mpi_c_interface_types, only : c_Comm, c_Info
+    implicit none
+    integer(c_Comm), value, intent(in) :: comm_old
+    integer(c_int), value, intent(in) :: n
+    integer(c_int), intent(in) :: sources(n), degrees(n), destinations(*)
+    type(c_ptr), value, intent(in) :: weights
+    integer(c_Info), value, intent(in) :: info
+    integer(c_int), intent(in) :: reorder
+    integer(c_Comm), intent(out) :: comm_dist_graph
+    integer(c_int) :: ierror
+end function MPIR_Dist_graph_create_c
+
+function MPIR_Dist_graph_create_adjacent_c(comm_old, indegree, sources, sourceweights, &
+           outdegree, destinations, destweights, info, reorder, comm_dist_graph) &
+    bind(C, name="PMPI_Dist_graph_create_adjacent") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_ptr
+    use :: mpi_c_interface_types, only : c_Comm, c_Info
+    implicit none
+    integer(c_Comm), value, intent(in) :: comm_old
+    integer(c_int), value, intent(in) :: indegree, outdegree
+    integer(c_int), intent(in) :: sources(indegree), destinations(outdegree)
+    type(c_ptr), value, intent(in) :: sourceweights
+    type(c_ptr), value, intent(in) :: destweights
+    integer(c_Info), value, intent(in) :: info
+    integer(c_int), intent(in) :: reorder
+    integer(c_Comm), intent(out) :: comm_dist_graph
+    integer(c_int) :: ierror
+end function MPIR_Dist_graph_create_adjacent_c
+
+function MPIR_Dist_graph_neighbors_c(comm, maxindegree, sources, sourceweights, &
+           maxoutdegree, destinations, destweights) &
+    bind(C, name="PMPI_Dist_graph_neighbors") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Comm
+    implicit none
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_int), value, intent(in) :: maxindegree, maxoutdegree
+    integer(c_int), intent(out) :: sources(maxindegree), destinations(maxoutdegree)
+    integer(c_int), intent(out) :: sourceweights(maxindegree), destweights(maxoutdegree)
+    integer(c_int) :: ierror
+end function MPIR_Dist_graph_neighbors_c
+
+function MPIR_Dist_graph_neighbors_count_c(comm, indegree, outdegree, weighted) &
+    bind(C, name="PMPI_Dist_graph_neighbors_count") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Comm
+    implicit none
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_int), intent(out) :: indegree, outdegree
+    integer(c_int), intent(out) :: weighted
+    integer(c_int) :: ierror
+end function MPIR_Dist_graph_neighbors_count_c
+
+function MPIR_Graphdims_get_c(comm, nnodes, nedges) &
+    bind(C, name="PMPI_Graphdims_get") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Comm
+    implicit none
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_int), intent(out) :: nnodes, nedges
+    integer(c_int) :: ierror
+end function MPIR_Graphdims_get_c
+
+function MPIR_Graph_create_c(comm_old, nnodes, index, edges, reorder, comm_graph) &
+    bind(C, name="PMPI_Graph_create") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Comm
+    implicit none
+    integer(c_Comm), value, intent(in) :: comm_old
+    integer(c_int), value, intent(in) :: nnodes
+    integer(c_int), intent(in) :: index(nnodes), edges(*)
+    integer(c_int), intent(in) :: reorder
+    integer(c_Comm), intent(out) :: comm_graph
+    integer(c_int) :: ierror
+end function MPIR_Graph_create_c
+
+function MPIR_Graph_get_c(comm, maxindex, maxedges, index, edges) &
+    bind(C, name="PMPI_Graph_get") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Comm
+    implicit none
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_int), value, intent(in) :: maxindex, maxedges
+    integer(c_int), intent(out) :: index(maxindex), edges(maxedges)
+    integer(c_int) :: ierror
+end function MPIR_Graph_get_c
+
+function MPIR_Graph_map_c(comm, nnodes, index, edges, newrank) &
+    bind(C, name="PMPI_Graph_map") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Comm
+    implicit none
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_int), value, intent(in) :: nnodes
+    integer(c_int), intent(in) :: index(nnodes), edges(*)
+    integer(c_int), intent(out) :: newrank
+    integer(c_int) :: ierror
+end function MPIR_Graph_map_c
+
+function MPIR_Graph_neighbors_c(comm, rank, maxneighbors, neighbors) &
+    bind(C, name="PMPI_Graph_neighbors") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Comm
+    implicit none
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_int), value, intent(in) :: rank, maxneighbors
+    integer(c_int), intent(out) :: neighbors(maxneighbors)
+    integer(c_int) :: ierror
+end function MPIR_Graph_neighbors_c
+
+function MPIR_Graph_neighbors_count_c(comm, rank, nneighbors) &
+    bind(C, name="PMPI_Graph_neighbors_count") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Comm
+    implicit none
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_int), value, intent(in) :: rank
+    integer(c_int), intent(out) :: nneighbors
+    integer(c_int) :: ierror
+end function MPIR_Graph_neighbors_count_c
+
+function MPIR_Topo_test_c(comm, status) &
+    bind(C, name="PMPI_Topo_test") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Comm
+    implicit none
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_int), intent(out) :: status
+    integer(c_int) :: ierror
+end function MPIR_Topo_test_c
+
+function  MPIR_Wtick_c() &
+    bind(C, name="PMPI_Wtick") result(res)
+    use, intrinsic :: iso_c_binding, only : c_double
+    implicit none
+    real(c_double) :: res
+end function MPIR_Wtick_c
+
+function  MPIR_Wtime_c() &
+    bind(C, name="PMPI_Wtime") result(res)
+    use, intrinsic :: iso_c_binding, only : c_double
+    implicit none
+    real(c_double) :: res
+end function MPIR_Wtime_c
+
+function MPIR_Abort_c(comm, errorcode) &
+    bind(C, name="PMPI_Abort") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Comm
+    implicit none
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_int), value, intent(in) :: errorcode
+    integer(c_int) :: ierror
+end function MPIR_Abort_c
+
+function MPIR_Add_error_class_c(errorclass) &
+    bind(C, name="PMPI_Add_error_class") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    implicit none
+    integer(c_int), intent(out) :: errorclass
+    integer(c_int) :: ierror
+end function MPIR_Add_error_class_c
+
+function MPIR_Add_error_code_c(errorclass, errorcode) &
+    bind(C, name="PMPI_Add_error_code") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Datatype, c_Comm, c_Request
+    implicit none
+    integer(c_int), value, intent(in) :: errorclass
+    integer(c_int), intent(out) :: errorcode
+    integer(c_int) :: ierror
+end function MPIR_Add_error_code_c
+
+function MPIR_Add_error_string_c(errorcode, string) &
+    bind(C, name="PMPI_Add_error_string") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_char
+    use :: mpi_c_interface_types, only : c_Datatype, c_Comm, c_Request
+    implicit none
+    integer(c_int), value, intent(in) :: errorcode
+    character(kind=c_char), intent(in) :: string(*)
+    integer(c_int) :: ierror
+end function MPIR_Add_error_string_c
+
+function MPIR_Alloc_mem_c(size, info, baseptr) &
+    bind(C, name="PMPI_Alloc_mem") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_ptr, c_int
+    use :: mpi_f08_compile_constants, only : MPI_ADDRESS_KIND
+    use :: mpi_c_interface_types, only : c_Info
+    implicit none
+    integer(MPI_ADDRESS_KIND), value, intent(in) :: size
+    integer(c_Info), value, intent(in) :: info
+    type(c_ptr), intent(out) :: baseptr
+    integer(c_int) :: ierror
+end function MPIR_Alloc_mem_c
+
+function MPIR_Comm_call_errhandler_c(comm, errorcode) &
+    bind(C, name="PMPI_Comm_call_errhandler") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Comm
+    implicit none
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_int), value, intent(in) :: errorcode
+    integer(c_int) :: ierror
+end function MPIR_Comm_call_errhandler_c
+
+function MPIR_Comm_create_errhandler_c(comm_errhandler_fn, errhandler) &
+    bind(C, name="PMPI_Comm_create_errhandler") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_funptr
+    use :: mpi_c_interface_types, only : c_Errhandler
+    implicit none
+    type(c_funptr), value :: comm_errhandler_fn
+    integer(c_Errhandler), intent(out) :: errhandler
+    integer(c_int) :: ierror
+end function MPIR_Comm_create_errhandler_c
+
+function MPIR_Comm_get_errhandler_c(comm, errhandler) &
+    bind(C, name="PMPI_Comm_get_errhandler") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Comm, c_Errhandler
+    implicit none
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_Errhandler), intent(out) :: errhandler
+    integer(c_int) :: ierror
+end function MPIR_Comm_get_errhandler_c
+
+function MPIR_Comm_set_errhandler_c(comm, errhandler) &
+    bind(C, name="PMPI_Comm_set_errhandler") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Comm, c_Errhandler
+    implicit none
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_Errhandler), value, intent(in) :: errhandler
+    integer(c_int) :: ierror
+end function MPIR_Comm_set_errhandler_c
+
+function MPIR_Errhandler_free_c(errhandler) &
+    bind(C, name="PMPI_Errhandler_free") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Errhandler
+    implicit none
+    integer(c_Errhandler), intent(inout) :: errhandler
+    integer(c_int) :: ierror
+end function MPIR_Errhandler_free_c
+
+function MPIR_Error_class_c(errorcode, errorclass) &
+    bind(C, name="PMPI_Error_class") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    implicit none
+    integer(c_int), value, intent(in) :: errorcode
+    integer(c_int), intent(out) :: errorclass
+    integer(c_int) :: ierror
+end function MPIR_Error_class_c
+
+function MPIR_Error_string_c(errorcode, string, resultlen) &
+    bind(C, name="PMPI_Error_string") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_char
+    use :: mpi_f08_compile_constants, only : MPI_MAX_ERROR_STRING
+    implicit none
+    integer(c_int), value, intent(in) :: errorcode
+    character(kind=c_char), intent(out) :: string(MPI_MAX_ERROR_STRING+1)
+    integer(c_int), intent(out) :: resultlen
+    integer(c_int) :: ierror
+end function MPIR_Error_string_c
+
+function MPIR_File_call_errhandler_c(fh, errorcode) &
+    bind(C, name="PMPI_File_call_errhandler") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_File
+    implicit none
+    integer(c_File), value, intent(in) :: fh
+    integer(c_int), value, intent(in) :: errorcode
+    integer(c_int) :: ierror
+end function MPIR_File_call_errhandler_c
+
+function MPIR_File_create_errhandler_c(file_errhandler_fn, errhandler) &
+    bind(C, name="PMPI_File_create_errhandler") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_funptr
+    use :: mpi_c_interface_types, only : c_Errhandler
+    implicit none
+    type(c_funptr), value :: file_errhandler_fn
+    integer(c_Errhandler), intent(out) :: errhandler
+    integer(c_int) :: ierror
+end function MPIR_File_create_errhandler_c
+
+function MPIR_File_get_errhandler_c(file, errhandler) &
+    bind(C, name="PMPI_File_get_errhandler") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_File, c_Errhandler
+    implicit none
+    integer(c_File), value, intent(in) :: file
+    integer(c_Errhandler), intent(out) :: errhandler
+    integer(c_int) :: ierror
+end function MPIR_File_get_errhandler_c
+
+function MPIR_File_set_errhandler_c(file, errhandler) &
+    bind(C, name="PMPI_File_set_errhandler") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_File, c_Errhandler
+    implicit none
+    integer(c_File), value, intent(in) :: file
+    integer(c_Errhandler), value, intent(in) :: errhandler
+    integer(c_int) :: ierror
+end function MPIR_File_set_errhandler_c
+
+function MPIR_Finalize_c() &
+    bind(C, name="PMPI_Finalize") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    implicit none
+    integer(c_int) :: ierror
+end function MPIR_Finalize_c
+
+function MPIR_Finalized_c(flag) &
+    bind(C, name="PMPI_Finalized") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    implicit none
+    integer(c_int), intent(out) :: flag
+    integer(c_int) :: ierror
+end function MPIR_Finalized_c
+
+function MPIR_Get_processor_name_c(name, resultlen) &
+    bind(C, name="PMPI_Get_processor_name") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_char
+    use :: mpi_f08_compile_constants, only : MPI_MAX_PROCESSOR_NAME
+    implicit none
+    character(kind=c_char), intent(out) :: name(MPI_MAX_PROCESSOR_NAME+1)
+    integer(c_int), intent(out) :: resultlen
+    integer(c_int) :: ierror
+end function MPIR_Get_processor_name_c
+
+function MPIR_Get_version_c(version, subversion) &
+    bind(C, name="PMPI_Get_version") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    implicit none
+    integer(c_int), intent(out) :: version, subversion
+    integer(c_int) :: ierror
+end function MPIR_Get_version_c
+
+function MPIR_Init_c(argc, argv) &
+    bind(C, name="PMPI_Init") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_ptr
+    implicit none
+    type(c_ptr), value, intent(in) :: argc
+    type(c_ptr), value, intent(in) :: argv
+    integer(c_int) :: ierror
+end function MPIR_Init_c
+
+function MPIR_Initialized_c(flag) &
+    bind(C, name="PMPI_Initialized") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    implicit none
+    integer(c_int), intent(out) :: flag
+    integer(c_int) :: ierror
+end function MPIR_Initialized_c
+
+function MPIR_Win_call_errhandler_c(win, errorcode) &
+    bind(C, name="PMPI_Win_call_errhandler") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Win
+    implicit none
+    integer(c_Win), value, intent(in) :: win
+    integer(c_int), value, intent(in) :: errorcode
+    integer(c_int) :: ierror
+end function MPIR_Win_call_errhandler_c
+
+function MPIR_Win_create_errhandler_c(win_errhandler_fn, errhandler) &
+    bind(C, name="PMPI_Win_create_errhandler") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_funptr
+    use :: mpi_c_interface_types, only : c_Errhandler
+    implicit none
+    type(c_funptr), value :: win_errhandler_fn
+    integer(c_Errhandler), intent(out) :: errhandler
+    integer(c_int) :: ierror
+end function MPIR_Win_create_errhandler_c
+
+function MPIR_Win_get_errhandler_c(win, errhandler) &
+    bind(C, name="PMPI_Win_get_errhandler") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Win, c_Errhandler
+    implicit none
+    integer(c_Win), value, intent(in) :: win
+    integer(c_Errhandler), intent(out) :: errhandler
+    integer(c_int) :: ierror
+end function MPIR_Win_get_errhandler_c
+
+function MPIR_Win_set_errhandler_c(win, errhandler) &
+    bind(C, name="PMPI_Win_set_errhandler") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Win, c_Errhandler
+    implicit none
+    integer(c_Win), value, intent(in) :: win
+    integer(c_Errhandler), value, intent(in) :: errhandler
+    integer(c_int) :: ierror
+end function MPIR_Win_set_errhandler_c
+
+function MPIR_Info_create_c(info) &
+    bind(C, name="PMPI_Info_create") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Info
+    implicit none
+    integer(c_Info), intent(out) :: info
+    integer(c_int) :: ierror
+end function MPIR_Info_create_c
+
+function MPIR_Info_delete_c(info, key) &
+    bind(C, name="PMPI_Info_delete") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_char
+    use :: mpi_c_interface_types, only : c_Info
+    implicit none
+    integer(c_Info), value, intent(in) :: info
+    character(kind=c_char), intent(in) :: key(*)
+    integer(c_int) :: ierror
+end function MPIR_Info_delete_c
+
+function MPIR_Info_dup_c(info, newinfo) &
+    bind(C, name="PMPI_Info_dup") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Info
+    implicit none
+    integer(c_Info), value, intent(in) :: info
+    integer(c_Info), intent(out) :: newinfo
+    integer(c_int) :: ierror
+end function MPIR_Info_dup_c
+
+function MPIR_Info_free_c(info) &
+    bind(C, name="PMPI_Info_free") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Info
+    implicit none
+    integer(c_Info), intent(inout) :: info
+    integer(c_int) :: ierror
+end function MPIR_Info_free_c
+
+function MPIR_Info_get_c(info, key, valuelen, value, flag) &
+    bind(C, name="PMPI_Info_get") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_char
+    use :: mpi_c_interface_types, only : c_Info
+    implicit none
+    integer(c_Info), value, intent(in) :: info
+    character(kind=c_char), intent(in) :: key(*)
+    integer(c_int), value, intent(in) :: valuelen
+    character(kind=c_char), intent(out) :: value(valuelen+1)
+    integer(c_int), intent(out) :: flag
+    integer(c_int) :: ierror
+end function MPIR_Info_get_c
+
+function MPIR_Info_get_nkeys_c(info, nkeys) &
+    bind(C, name="PMPI_Info_get_nkeys") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Info
+    implicit none
+    integer(c_Info), value, intent(in) :: info
+    integer(c_int), intent(out) :: nkeys
+    integer(c_int) :: ierror
+end function MPIR_Info_get_nkeys_c
+
+function MPIR_Info_get_nthkey_c(info, n,key) &
+    bind(C, name="PMPI_Info_get_nthkey") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_char
+    use :: mpi_c_interface_types, only : c_Info
+    implicit none
+    integer(c_Info), value, intent(in) :: info
+    integer(c_int), value, intent(in) :: n
+    character(kind=c_char), intent(out) :: key(*)
+    integer(c_int) :: ierror
+end function MPIR_Info_get_nthkey_c
+
+function MPIR_Info_get_valuelen_c(info, key, valuelen, flag) &
+    bind(C, name="PMPI_Info_get_valuelen") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_char
+    use :: mpi_c_interface_types, only : c_Info
+    implicit none
+    integer(c_Info), value, intent(in) :: info
+    character(kind=c_char), intent(in) :: key(*)
+    integer(c_int), intent(out) :: valuelen
+    integer(c_int), intent(out) :: flag
+    integer(c_int) :: ierror
+end function MPIR_Info_get_valuelen_c
+
+function MPIR_Info_set_c(info, key, value) &
+    bind(C, name="PMPI_Info_set") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_char
+    use :: mpi_c_interface_types, only : c_Info
+    implicit none
+    integer(c_Info), value, intent(in) :: info
+    character(kind=c_char), intent(in) :: key(*), value(*)
+    integer(c_int) :: ierror
+end function MPIR_Info_set_c
+
+function MPIR_Close_port_c(port_name) &
+    bind(C, name="PMPI_Close_port") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_char
+    implicit none
+    character(kind=c_char), intent(in) :: port_name(*)
+    integer(c_int) :: ierror
+end function MPIR_Close_port_c
+
+function MPIR_Comm_accept_c(port_name, info, root, comm, newcomm) &
+    bind(C, name="PMPI_Comm_accept") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_char
+    use :: mpi_c_interface_types, only : c_Info, c_Comm
+    implicit none
+    character(kind=c_char), intent(in) :: port_name(*)
+    integer(c_Info), value, intent(in) :: info
+    integer(c_int), value, intent(in) :: root
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_Comm), intent(out) :: newcomm
+    integer(c_int) :: ierror
+end function MPIR_Comm_accept_c
+
+function MPIR_Comm_connect_c(port_name, info, root, comm, newcomm) &
+    bind(C, name="PMPI_Comm_connect") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_char
+    use :: mpi_c_interface_types, only : c_Info, c_Comm
+    implicit none
+    character(kind=c_char), intent(in) :: port_name(*)
+    integer(c_Info), value, intent(in) :: info
+    integer(c_int), value, intent(in) :: root
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_Comm), intent(out) :: newcomm
+    integer(c_int) :: ierror
+end function MPIR_Comm_connect_c
+
+function MPIR_Comm_disconnect_c(comm) &
+    bind(C, name="PMPI_Comm_disconnect") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Comm
+    implicit none
+    integer(c_Comm), intent(inout) :: comm
+    integer(c_int) :: ierror
+end function MPIR_Comm_disconnect_c
+
+function MPIR_Comm_get_parent_c(parent) &
+    bind(C, name="PMPI_Comm_get_parent") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Comm
+    implicit none
+    integer(c_Comm), intent(out) :: parent
+    integer(c_int) :: ierror
+end function MPIR_Comm_get_parent_c
+
+function MPIR_Comm_join_c(fd, intercomm) &
+    bind(C, name="PMPI_Comm_join") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Comm
+    implicit none
+    integer(c_int), value, intent(in) :: fd
+    integer(c_Comm), intent(out) :: intercomm
+    integer(c_int) :: ierror
+end function MPIR_Comm_join_c
+
+function MPIR_Lookup_name_c(service_name, info, port_name) &
+    bind(C, name="PMPI_Lookup_name") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_char
+    use :: mpi_f08_compile_constants, only : MPI_MAX_PORT_NAME
+    use :: mpi_c_interface_types, only : c_Info
+    implicit none
+    character(kind=c_char), intent(in) :: service_name(*)
+    integer(c_Info), value, intent(in) :: info
+    character(kind=c_char), intent(out) :: port_name(MPI_MAX_PORT_NAME+1)
+    integer(c_int) :: ierror
+end function MPIR_Lookup_name_c
+
+function MPIR_Open_port_c(info, port_name) &
+    bind(C, name="PMPI_Open_port") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_char
+    use :: mpi_f08_compile_constants, only : MPI_MAX_PORT_NAME
+    use :: mpi_c_interface_types, only : c_Info
+    implicit none
+    integer(c_Info), value, intent(in) :: info
+    character(kind=c_char), intent(out) :: port_name(MPI_MAX_PORT_NAME+1)
+    integer(c_int) :: ierror
+end function MPIR_Open_port_c
+
+function MPIR_Publish_name_c(service_name, info, port_name) &
+    bind(C, name="PMPI_Publish_name") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_char
+    use :: mpi_c_interface_types, only : c_Info
+    implicit none
+    integer(c_Info), value, intent(in) :: info
+    character(kind=c_char), intent(in) :: service_name(*), port_name(*)
+    integer(c_int) :: ierror
+end function MPIR_Publish_name_c
+
+function MPIR_Unpublish_name_c(service_name, info, port_name) &
+    bind(C, name="PMPI_Unpublish_name") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_char
+    use :: mpi_c_interface_types, only : c_Info
+    implicit none
+    character(kind=c_char), intent(in) :: service_name(*), port_name(*)
+    integer(c_Info), value, intent(in) :: info
+    integer(c_int) :: ierror
+end function MPIR_Unpublish_name_c
+
+function MPIR_Win_complete_c(win) &
+    bind(C, name="PMPI_Win_complete") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Win
+    implicit none
+    integer(c_Win), value, intent(in) :: win
+    integer(c_int) :: ierror
+end function MPIR_Win_complete_c
+
+function MPIR_Win_fence_c(assert, win) &
+    bind(C, name="PMPI_Win_fence") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Win
+    implicit none
+    integer(c_int), value, intent(in) :: assert
+    integer(c_Win), value, intent(in) :: win
+    integer(c_int) :: ierror
+end function MPIR_Win_fence_c
+
+function MPIR_Win_free_c(win) &
+    bind(C, name="PMPI_Win_free") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Win
+    implicit none
+    integer(c_Win), intent(inout) :: win
+    integer(c_int) :: ierror
+end function MPIR_Win_free_c
+
+function MPIR_Win_get_group_c(win, group) &
+    bind(C, name="PMPI_Win_get_group") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Win, c_Group
+    implicit none
+    integer(c_Win), value, intent(in) :: win
+    integer(c_Group), intent(out) :: group
+    integer(c_int) :: ierror
+end function MPIR_Win_get_group_c
+
+function MPIR_Win_lock_c(lock_type, rank, assert, win) &
+    bind(C, name="PMPI_Win_lock") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Win
+    implicit none
+    integer(c_int), value, intent(in) :: lock_type, rank, assert
+    integer(c_Win), value, intent(in) :: win
+    integer(c_int) :: ierror
+end function MPIR_Win_lock_c
+
+function MPIR_Win_post_c(group, assert, win) &
+    bind(C, name="PMPI_Win_post") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Win, c_Group
+    implicit none
+    integer(c_Group), value, intent(in) :: group
+    integer(c_int), value, intent(in) :: assert
+    integer(c_Win), value, intent(in) :: win
+    integer(c_int) :: ierror
+end function MPIR_Win_post_c
+
+function MPIR_Win_start_c(group, assert, win) &
+    bind(C, name="PMPI_Win_start") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Win, c_Group
+    implicit none
+    integer(c_Group), value, intent(in) :: group
+    integer(c_int), value, intent(in) :: assert
+    integer(c_Win), value, intent(in) :: win
+    integer(c_int) :: ierror
+end function MPIR_Win_start_c
+
+function MPIR_Win_test_c(win, flag) &
+    bind(C, name="PMPI_Win_test") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Win
+    implicit none
+    integer(c_int), intent(out) :: flag
+    integer(c_Win), value, intent(in) :: win
+    integer(c_int) :: ierror
+end function MPIR_Win_test_c
+
+function MPIR_Win_unlock_c(rank, win) &
+    bind(C, name="PMPI_Win_unlock") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Win
+    implicit none
+    integer(c_int), value, intent(in) :: rank
+    integer(c_Win), value, intent(in) :: win
+    integer(c_int) :: ierror
+end function MPIR_Win_unlock_c
+
+function MPIR_Win_wait_c(win) &
+    bind(C, name="PMPI_Win_wait") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Win
+    implicit none
+    integer(c_Win), value, intent(in) :: win
+    integer(c_int) :: ierror
+end function MPIR_Win_wait_c
+
+function MPIR_Grequest_complete_c(request) &
+    bind(C, name="PMPI_Grequest_complete") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Request
+    implicit none
+    integer(c_Request), value, intent(in) :: request
+    integer(c_int) :: ierror
+end function MPIR_Grequest_complete_c
+
+function MPIR_Grequest_start_c(query_fn, free_fn, cancel_fn, extra_state, request) &
+    bind(C, name="PMPI_Grequest_start") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_funptr
+    use :: mpi_f08_compile_constants, only : MPI_ADDRESS_KIND
+    use :: mpi_c_interface_types, only : c_Request
+    implicit none
+    type(c_funptr), value :: query_fn
+    type(c_funptr), value :: free_fn
+    type(c_funptr), value :: cancel_fn
+    integer(MPI_ADDRESS_KIND), intent(in) :: extra_state
+    integer(c_Request), intent(out) :: request
+    integer(c_int) :: ierror
+end function MPIR_Grequest_start_c
+
+function MPIR_Init_thread_c(argc, argv, required, provided) &
+    bind(C, name="PMPI_Init_thread") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_ptr
+    implicit none
+    type(c_ptr), value, intent(in) :: argc
+    type(c_ptr), value, intent(in) :: argv
+    integer(c_int), value, intent(in) :: required
+    integer(c_int), intent(out) :: provided
+    integer(c_int) :: ierror
+end function MPIR_Init_thread_c
+
+function MPIR_Is_thread_main_c(flag) &
+    bind(C, name="PMPI_Is_thread_main") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    implicit none
+    integer(c_int), intent(out) :: flag
+    integer(c_int) :: ierror
+end function MPIR_Is_thread_main_c
+
+function MPIR_Query_thread_c(provided) &
+    bind(C, name="PMPI_Query_thread") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    implicit none
+    integer(c_int), intent(out) :: provided
+    integer(c_int) :: ierror
+end function MPIR_Query_thread_c
+
+function MPIR_Status_set_cancelled_c(status, flag) &
+    bind(C, name="PMPI_Status_set_cancelled") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_ptr
+    implicit none
+    type(c_ptr), value, intent(in) :: status
+    integer(c_int), intent(out) :: flag
+    integer(c_int) :: ierror
+end function MPIR_Status_set_cancelled_c
+
+function MPIR_Status_set_elements_c(status, datatype, count) &
+    bind(C, name="PMPI_Status_set_elements") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_ptr
+    use :: mpi_c_interface_types, only : c_Datatype
+    implicit none
+    type(c_ptr), value, intent(in) :: status
+    integer(c_Datatype), value, intent(in) :: datatype
+    integer(c_int), value, intent(in) :: count
+    integer(c_int) :: ierror
+end function MPIR_Status_set_elements_c
+
+function MPIR_Status_set_elements_x_c(status, datatype, count) &
+    bind(C, name="PMPI_Status_set_elements_x") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_ptr
+    use :: mpi_f08_compile_constants, only : MPI_COUNT_KIND
+    use :: mpi_c_interface_types, only : c_Datatype
+    implicit none
+    type(c_ptr), value, intent(in) :: status
+    integer(c_Datatype), value, intent(in) :: datatype
+    integer(MPI_COUNT_KIND), value, intent(in) :: count
+    integer(c_int) :: ierror
+end function MPIR_Status_set_elements_x_c
+
+function MPIR_File_close_c(fh) &
+    bind(C, name="PMPI_File_close") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_File
+    implicit none
+    integer(c_File), intent(inout) :: fh
+    integer(c_int) :: ierror
+end function MPIR_File_close_c
+
+function MPIR_File_delete_c(filename, info) &
+    bind(C, name="PMPI_File_delete") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_char
+    use :: mpi_c_interface_types, only : c_Info
+    implicit none
+    character(kind=c_char), intent(in) :: filename(*)
+    integer(c_Info), value, intent(in) :: info
+    integer(c_int) :: ierror
+end function MPIR_File_delete_c
+
+function MPIR_File_get_amode_c(fh, amode) &
+    bind(C, name="PMPI_File_get_amode") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_File
+    implicit none
+    integer(c_File), value, intent(in) :: fh
+    integer(c_int), intent(out) :: amode
+    integer(c_int) :: ierror
+end function MPIR_File_get_amode_c
+
+function MPIR_File_get_atomicity_c(fh, flag) &
+    bind(C, name="PMPI_File_get_atomicity") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_File
+    implicit none
+    integer(c_File), value, intent(in) :: fh
+    integer(c_int), intent(out) :: flag
+    integer(c_int) :: ierror
+end function MPIR_File_get_atomicity_c
+
+function MPIR_File_get_byte_offset_c(fh, offset, disp) &
+    bind(C, name="PMPI_File_get_byte_offset") result(ierror)
+    use :: mpi_f08_compile_constants, only : MPI_OFFSET_KIND
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_File
+    implicit none
+    integer(c_File), value, intent(in) :: fh
+    integer(MPI_OFFSET_KIND), value, intent(in) :: offset
+    integer(MPI_OFFSET_KIND), intent(out) :: disp
+    integer(c_int) :: ierror
+end function MPIR_File_get_byte_offset_c
+
+function MPIR_File_get_group_c(fh, group) &
+    bind(C, name="PMPI_File_get_group") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_File, c_Group
+    implicit none
+    integer(c_File), value, intent(in) :: fh
+    integer(c_Group), intent(out) :: group
+    integer(c_int) :: ierror
+end function MPIR_File_get_group_c
+
+function MPIR_File_get_info_c(fh, info_used) &
+    bind(C, name="PMPI_File_get_info") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_File, c_Info
+    implicit none
+    integer(c_File), value, intent(in) :: fh
+    integer(c_Info), intent(out) :: info_used
+    integer(c_int) :: ierror
+end function MPIR_File_get_info_c
+
+function MPIR_File_get_position_c(fh, offset) &
+    bind(C, name="PMPI_File_get_position") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_f08_compile_constants, only : MPI_OFFSET_KIND
+    use :: mpi_c_interface_types, only : c_File
+    implicit none
+    integer(c_File), value, intent(in) :: fh
+    integer(MPI_OFFSET_KIND), intent(out) :: offset
+    integer(c_int) :: ierror
+end function MPIR_File_get_position_c
+
+function MPIR_File_get_position_shared_c(fh, offset) &
+    bind(C, name="PMPI_File_get_position_shared") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_f08_compile_constants, only : MPI_OFFSET_KIND
+    use :: mpi_c_interface_types, only : c_File
+    implicit none
+    integer(c_File), value, intent(in) :: fh
+    integer(MPI_OFFSET_KIND), intent(out) :: offset
+    integer(c_int) :: ierror
+end function MPIR_File_get_position_shared_c
+
+function MPIR_File_get_size_c(fh, size) &
+    bind(C, name="PMPI_File_get_size") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_f08_compile_constants, only : MPI_OFFSET_KIND
+    use :: mpi_c_interface_types, only : c_File
+    implicit none
+    integer(c_File), value, intent(in) :: fh
+    integer(MPI_OFFSET_KIND), intent(out) :: size
+    integer(c_int) :: ierror
+end function MPIR_File_get_size_c
+
+function MPIR_File_get_type_extent_c(fh, datatype, extent) &
+    bind(C, name="PMPI_File_get_type_extent") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_f08_compile_constants, only : MPI_ADDRESS_KIND
+    use :: mpi_c_interface_types, only : c_File, c_Datatype
+    implicit none
+    integer(c_File), value, intent(in) :: fh
+    integer(c_Datatype), value, intent(in) :: datatype
+    integer(MPI_ADDRESS_KIND), intent(out) :: extent
+    integer(c_int) :: ierror
+end function MPIR_File_get_type_extent_c
+
+function MPIR_File_get_view_c(fh, disp, etype, filetype, datarep) &
+    bind(C, name="PMPI_File_get_view") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_char
+    use :: mpi_f08_compile_constants, only : MPI_OFFSET_KIND
+    use :: mpi_c_interface_types, only : c_File, c_Datatype
+    implicit none
+    integer(c_File), value, intent(in) :: fh
+    integer(MPI_OFFSET_KIND), intent(out) :: disp
+    integer(c_Datatype), intent(out) :: etype
+    integer(c_Datatype), intent(out) :: filetype
+    character(kind=c_char), intent(out) :: datarep(*)
+    integer(c_int) :: ierror
+end function MPIR_File_get_view_c
+
+function MPIR_File_open_c(comm, filename, amode, info, fh) &
+    bind(C, name="PMPI_File_open") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_char
+    use :: mpi_c_interface_types, only : c_Comm, c_Info, c_File
+    implicit none
+    integer(c_Comm), value, intent(in) :: comm
+    character(kind=c_char), intent(in) :: filename(*)
+    integer(c_int), value, intent(in) :: amode
+    integer(c_Info), value, intent(in) :: info
+    integer(c_File), intent(out) :: fh
+    integer(c_int) :: ierror
+end function MPIR_File_open_c
+
+function MPIR_File_preallocate_c(fh, size) &
+    bind(C, name="PMPI_File_preallocate") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_f08_compile_constants, only : MPI_OFFSET_KIND
+    use :: mpi_c_interface_types, only : c_File
+    implicit none
+    integer(c_File), value, intent(in) :: fh
+    integer(MPI_OFFSET_KIND), value, intent(in) :: size
+    integer(c_int) :: ierror
+end function MPIR_File_preallocate_c
+
+function MPIR_File_seek_c(fh, offset, whence) &
+    bind(C, name="PMPI_File_seek") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_f08_compile_constants, only : MPI_OFFSET_KIND
+    use :: mpi_c_interface_types, only : c_File
+    implicit none
+    integer(c_File), value, intent(in) :: fh
+    integer(MPI_OFFSET_KIND), value, intent(in) :: offset
+    integer(c_int), value, intent(in) :: whence
+    integer(c_int) :: ierror
+end function MPIR_File_seek_c
+
+function MPIR_File_seek_shared_c(fh, offset, whence) &
+    bind(C, name="PMPI_File_seek_shared") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_f08_compile_constants, only : MPI_OFFSET_KIND
+    use :: mpi_c_interface_types, only : c_File
+    implicit none
+    integer(c_File), value, intent(in) :: fh
+    integer(MPI_OFFSET_KIND), value, intent(in) :: offset
+    integer(c_int), value, intent(in) :: whence
+    integer(c_int) :: ierror
+end function MPIR_File_seek_shared_c
+
+function MPIR_File_set_atomicity_c(fh, flag) &
+    bind(C, name="PMPI_File_set_atomicity") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_File
+    implicit none
+    integer(c_File), value, intent(in) :: fh
+    integer(c_int), intent(in) :: flag
+    integer(c_int) :: ierror
+end function MPIR_File_set_atomicity_c
+
+function MPIR_File_set_info_c(fh, info) &
+    bind(C, name="PMPI_File_set_info") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_File, c_Info
+    implicit none
+    integer(c_File), value, intent(in) :: fh
+    integer(c_Info), value, intent(in) :: info
+    integer(c_int) :: ierror
+end function MPIR_File_set_info_c
+
+function MPIR_File_set_size_c(fh, size) &
+    bind(C, name="PMPI_File_set_size") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_f08_compile_constants, only : MPI_OFFSET_KIND
+    use :: mpi_c_interface_types, only : c_File
+    implicit none
+    integer(c_File), value, intent(in) :: fh
+    integer(MPI_OFFSET_KIND), value, intent(in) :: size
+    integer(c_int) :: ierror
+end function MPIR_File_set_size_c
+
+function MPIR_File_set_view_c(fh, disp, etype, filetype, datarep, info) &
+    bind(C, name="PMPI_File_set_view") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_char
+    use :: mpi_f08_compile_constants, only : MPI_OFFSET_KIND
+    use :: mpi_c_interface_types, only : c_File, c_Datatype, c_Info
+    implicit none
+    integer(c_File), value, intent(in) :: fh
+    integer(MPI_OFFSET_KIND), value, intent(in) :: disp
+    integer(c_Datatype), value, intent(in) :: etype
+    integer(c_Datatype), value, intent(in) :: filetype
+    character(kind=c_char), intent(in) :: datarep(*)
+    integer(c_Info), value, intent(in) :: info
+    integer(c_int) :: ierror
+end function MPIR_File_set_view_c
+
+function MPIR_File_sync_c(fh) &
+    bind(C, name="PMPI_File_sync") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_File
+    implicit none
+    integer(c_File), value, intent(in) :: fh
+    integer(c_int) :: ierror
+end function MPIR_File_sync_c
+
+function MPIR_Register_datarep_c(datarep, read_conversion_fn, write_conversion_fn, dtype_file_extent_fn, extra_state) &
+    bind(C, name="PMPI_Register_datarep") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_char, c_funptr
+    use :: mpi_f08_compile_constants, only : MPI_ADDRESS_KIND
+    implicit none
+    character(kind=c_char), intent(in) :: datarep(*)
+    type(c_funptr), value :: read_conversion_fn
+    type(c_funptr), value :: write_conversion_fn
+    type(c_funptr), value :: dtype_file_extent_fn
+    integer(MPI_ADDRESS_KIND), intent(in) :: extra_state ! Why no value
+    integer(c_int) :: ierror
+end function MPIR_Register_datarep_c
+
+function MPIR_Type_create_f90_complex_c(p, r, newtype) &
+    bind(C, name="PMPI_Type_create_f90_complex") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Datatype
+    implicit none
+    integer(c_int), value, intent(in) :: p, r
+    integer(c_Datatype), intent(out) :: newtype
+    integer(c_int) :: ierror
+end function MPIR_Type_create_f90_complex_c
+
+function MPIR_Type_create_f90_integer_c(r, newtype) &
+    bind(C, name="PMPI_Type_create_f90_integer") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Datatype
+    implicit none
+    integer(c_int), value, intent(in) :: r
+    integer(c_Datatype), intent(out) :: newtype
+    integer(c_int) :: ierror
+end function MPIR_Type_create_f90_integer_c
+
+function MPIR_Type_create_f90_real_c(p, r, newtype) &
+    bind(C, name="PMPI_Type_create_f90_real") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Datatype
+    implicit none
+    integer(c_int), value, intent(in) :: p, r
+    integer(c_Datatype), intent(out) :: newtype
+    integer(c_int) :: ierror
+end function MPIR_Type_create_f90_real_c
+
+function MPIR_Type_match_size_c(typeclass, size, datatype) &
+    bind(C, name="PMPI_Type_match_size") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Datatype
+    implicit none
+    integer(c_int), value, intent(in) :: typeclass, size
+    integer(c_Datatype), intent(out) :: datatype
+    integer(c_int) :: ierror
+end function MPIR_Type_match_size_c
+
+function MPIR_Pcontrol_c(level) &
+    bind(C, name="PMPI_Pcontrol") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    implicit none
+    integer(c_int), value, intent(in) :: level
+    integer(c_int) :: ierror
+end function MPIR_Pcontrol_c
+
+function MPIR_Comm_split_type_c(comm, split_type, key, info, newcomm) &
+    bind(C, name="PMPI_Comm_split_type") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Comm, c_Info
+    implicit none
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_int), value, intent(in) :: split_type
+    integer(c_int), value, intent(in) :: key
+    integer(c_Info), value, intent(in) :: info
+    integer(c_Comm), intent(out) :: newcomm
+    integer(c_int) :: ierror
+end function MPIR_Comm_split_type_c
+
+function MPIR_Get_library_version_c(version, resultlen) &
+    bind(C, name="PMPI_Get_library_version") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_char
+    use :: mpi_f08_compile_constants, only : MPI_MAX_LIBRARY_VERSION_STRING
+    implicit none
+    character(kind=c_char), intent(out) :: version(MPI_MAX_LIBRARY_VERSION_STRING+1)
+    integer(c_int), intent(out) :: resultlen
+    integer(c_int) :: ierror
+end function MPIR_Get_library_version_c
+
+function MPIR_Mprobe_c(source, tag, comm, message, status) &
+    bind(C, name="PMPI_Mprobe") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_ptr
+    use :: mpi_c_interface_types, only : c_Comm, c_Message
+    implicit none
+    integer(c_int), value, intent(in) :: source, tag
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_Message), intent(out) :: message
+    type(c_ptr), value, intent(in) :: status
+    integer(c_int) :: ierror
+end function MPIR_Mprobe_c
+
+function MPIR_Improbe_c(source, tag, comm, flag, message, status) &
+    bind(C, name="PMPI_Improbe") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_ptr
+    use :: mpi_c_interface_types, only : c_Comm, c_Message
+    implicit none
+    integer(c_int), value, intent(in) :: source, tag
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_int), intent(out) :: flag
+    integer(c_Message), intent(out) :: message
+    type(c_ptr), value, intent(in) :: status
+    integer(c_int) :: ierror
+end function MPIR_Improbe_c
+
+function MPIR_Iprobe_c(source, tag, comm, flag, status) &
+    bind(C, name="PMPI_Iprobe") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_ptr
+    use :: mpi_c_interface_types, only : c_Comm
+    implicit none
+    integer(c_int), value, intent(in) :: source, tag
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_int), intent(out) :: flag
+    type(c_ptr), value, intent(in) :: status
+    integer(c_int) :: ierror
+end function MPIR_Iprobe_c
+
+function MPIR_Probe_c(source, tag, comm, status) &
+    bind(C, name="PMPI_Probe") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_ptr
+    use :: mpi_c_interface_types, only : c_Comm
+    implicit none
+    integer(c_int), value, intent(in) :: source, tag
+    integer(c_Comm), value, intent(in) :: comm
+    type(c_ptr), value, intent(in) :: status
+    integer(c_int) :: ierror
+end function MPIR_Probe_c
+
+function MPIR_Request_free_c(request) &
+    bind(C, name="PMPI_Request_free") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface_types, only : c_Request
+    implicit none
+    integer(c_Request), intent(inout) :: request
+    integer(c_int) :: ierror
+end function MPIR_Request_free_c
+
+function MPIR_Request_get_status_c(request, flag, status) &
+    bind(C, name="PMPI_Request_get_status") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_ptr
+    use :: mpi_c_interface_types, only : c_Request
+    implicit none
+    integer(c_Request), intent(in) :: request
+    integer(c_int), intent(out) :: flag
+    type(c_ptr), value, intent(in) :: status
+    integer(c_int) :: ierror
+end function MPIR_Request_get_status_c
+
+function MPIR_Comm_spawn_c(command, argv, maxprocs, info, root, comm, intercomm, array_of_errcodes, argv_elem_len) &
+    bind(C, name="MPIR_Comm_spawn_c") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_char, c_ptr
+    use :: mpi_c_interface_types, only : c_Info, c_Comm
+    implicit none
+    character(kind=c_char), dimension(*), intent(in) :: command
+    type(c_ptr), value, intent(in) :: argv
+    integer(c_int), value, intent(in) :: maxprocs, root
+    integer(c_Info), value, intent(in) :: info
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_Comm), intent(out) :: intercomm
+    type(c_ptr), value, intent(in) :: array_of_errcodes
+    integer(c_int), value, intent(in) :: argv_elem_len
+    integer(c_int) :: ierror
+end function MPIR_Comm_spawn_c
+
+function MPIR_Comm_spawn_multiple_c(count, array_of_commands, array_of_argv, array_of_maxprocs, &
+           array_of_info, root, comm, intercomm, array_of_errcodes, commands_elem_len, argv_elem_len) &
+    bind(C, name="MPIR_Comm_spawn_multiple_c") result(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_char, c_ptr
+    use :: mpi_c_interface_types, only : c_Info, c_Comm
+    implicit none
+    integer(c_int), intent(in) :: count
+    type(c_ptr), value, intent(in) :: array_of_commands
+    type(c_ptr), value, intent(in) :: array_of_argv
+    integer(c_int), intent(in) ::  array_of_maxprocs(*)
+    integer(c_Info), intent(in) :: array_of_info(*)
+    integer(c_int), intent(in) ::  root
+    integer(c_Comm), value, intent(in) :: comm
+    integer(c_Comm), intent(out) :: intercomm
+    type(c_ptr), value, intent(in) :: array_of_errcodes
+    integer(c_int), value, intent(in) :: commands_elem_len, argv_elem_len
+    integer(c_int) :: ierror
+end function MPIR_Comm_spawn_multiple_c
+
+end interface
+end module mpi_c_interface_nobuf
diff --git a/src/binding/fortran/use_mpi_f08/mpi_c_interface_nobuf.f90 b/src/binding/fortran/use_mpi_f08/mpi_c_interface_nobuf.f90
deleted file mode 100644
index e5d3c14..0000000
--- a/src/binding/fortran/use_mpi_f08/mpi_c_interface_nobuf.f90
+++ /dev/null
@@ -1,173 +0,0 @@
-! mpi_c_interfaces_nobuf module
-! Provides interfaces for C functions in MPI 3 / mpich3 that do not have
-! a choice formal parameter
-!
-! This module is used by the module mpi_c_interfaces, which is later
-! used in the Fortran wrapper functions defined in the modules mpi and
-! mpi_f08.
-!
-! This module provides only BIND(C) interfaces for MPI_* and PMPI_*
-! routines in the base C library.  Within the interfaces, these
-! modules are used to access constants:
-!
-!  mpi_c_interface_types
-!  iso_c_binding
-!
-
-module mpi_c_interface_nobuf
-
-implicit none
-
-interface
-
-function MPIR_Init_c (argc, argv) &
-           BIND(C, name="MPI_Init") RESULT (res)
-    use,intrinsic :: iso_c_binding, only: c_int, c_ptr
-    type(c_ptr),value,intent(in) :: argc
-    type(c_ptr),value,intent(in) :: argv
-    integer(c_int)               :: res
-end function MPIR_Init_c
-
-function MPIR_Finalize_c() &
-            BIND(C, name="MPI_Finalize") RESULT (res)
-    use,intrinsic :: iso_c_binding, only:  c_int
-    integer(c_int) :: res
-end function MPIR_Finalize_c
-
-function MPIR_Comm_rank_c (comm, rank) &
-            BIND(C, name="MPI_Comm_rank") RESULT (res)
-    use :: mpi_c_interface_types, only:  C_comm
-    use,intrinsic :: iso_c_binding, only: c_int
-    integer(C_comm),value,intent(in) :: comm
-    integer(c_int), intent(out)      :: rank
-    integer(c_int)                   :: res
-end function MPIR_Comm_rank_c
-
-function MPIR_Comm_size_c (comm, size) &
-           BIND(C, name="MPI_Comm_size") RESULT (res)
-    use :: mpi_c_interface_types, only:  C_comm
-    use,intrinsic :: iso_c_binding, only: c_int
-    integer(C_comm),value,intent(in) :: comm
-    integer(c_int),intent(out)       :: size
-    integer(c_int)                   :: res
-end function MPIR_Comm_size_c
-
-function MPIR_Buffer_detach_c (buffer_addr, size) &
-           BIND(C, name="MPI_Buffer_detach") RESULT (res)
-    use,intrinsic :: iso_c_binding, only: c_ptr, c_int
-    type(c_ptr),intent(out)    :: buffer_addr
-    integer(c_int),intent(out) :: size
-    integer(c_int)             :: res
-end function MPIR_Buffer_detach_c
-
-function MPIR_cancel_c (request) &
-            BIND(C, name="MPI_cancel") RESULT (res)
-    use :: mpi_c_interface_types, only: C_Request
-    use,intrinsic :: iso_c_binding, only: c_int
-    integer(C_Request) :: request
-    integer(c_int)     :: res
-end function MPIR_cancel_c
-
-function MPIR_Abort_c (comm, errorcode) &
-           BIND(C, name="MPI_Abort") RESULT (res)
-    use :: mpi_c_interface_types, only: C_comm
-    use,intrinsic :: iso_c_binding, only: c_int
-    integer(C_comm),value,intent(in) :: comm
-    integer(c_int), value,intent(in) :: errorcode
-    integer(c_int)                   :: res
-end function MPIR_Abort_c
-
-function MPIR_Barrier_c (comm) &
-           BIND(C, name="MPI_Barrier") RESULT (res)
-    use :: mpi_c_interface_types, only:  C_comm
-    use,intrinsic :: iso_c_binding, only: c_int
-    integer(C_comm),value,intent(in) :: comm
-    integer(c_int)                  :: res
-end function MPIR_Barrier_c
-
-function MPIR_Error_string_c (errorcode, string, resultlen) &
-          BIND(C, name="MPI_Error_string") RESULT (res)
-    use,intrinsic :: iso_c_binding, only:  c_int, c_char
-    integer(c_int),value,intent(in)    :: errorcode
-    character(kind=c_char),intent(out) :: string(*)
-    integer(c_int),intent(out)         :: resultlen
-    integer(c_int)                     :: res
-end function MPIR_Error_string_c
-
-function MPIR_Test_c( request, flag, status) &
-           BIND(C, name="MPI_Test") RESULT (res)
-    use,intrinsic :: iso_c_binding, only: c_int
-    use :: mpi_c_interface_types, only:  C_request, c_Status
-    integer(C_request) :: request
-    integer(c_int)     :: flag
-    type(c_Status) :: status
-    integer(c_int)     :: res
-end function MPIR_Test_c
-
-function MPIR_Type_create_f90_complex_c (p, r, newtype) &
-           BIND(C, name="MPI_Type_create_f90_complex") RESULT (res)
-    use :: mpi_c_interface_types, only: C_Datatype
-    use,intrinsic :: iso_c_binding, only: c_int
-    integer(c_int),value :: p
-    integer(c_int),value :: r
-    integer(C_Datatype),intent(out) :: newtype
-    integer(c_int)       :: res
-end function MPIR_Type_create_f90_complex_c
-
-function MPIR_Type_create_f90_integer_c (r, newtype) &
-           BIND(C, name="MPI_Type_create_f90_integer") RESULT (res)
-    use :: mpi_c_interface_types, only: C_Datatype
-    use,intrinsic :: iso_c_binding, only: c_int
-    integer(c_int),value :: r
-    integer(C_Datatype),intent(out) :: newtype
-    integer(c_int)       :: res
-end function MPIR_Type_create_f90_integer_c
-
-function MPIR_Type_create_f90_real_c (p, r, newtype) &
-           BIND(C, name="MPI_Type_create_f90_real") RESULT (res)
-    use :: mpi_c_interface_types, only: C_Datatype
-    use,intrinsic :: iso_c_binding, only: c_int
-    integer(c_int),value :: p
-    integer(c_int),value :: r
-    integer(C_Datatype),intent(out) :: newtype
-    integer(c_int)       :: res
-end function MPIR_Type_create_f90_real_c
-
-function MPIR_Type_match_size_c (typeclass, size, datatype) &
-           BIND(C, name="MPI_Type_match_size") RESULT (res)
-    use :: mpi_c_interface_types, only: C_Datatype
-    use,intrinsic :: iso_c_binding, only: c_int
-    integer(c_int),value :: typeclass
-    integer(c_int),value :: size
-    integer(C_Datatype)  :: datatype
-    integer(c_int)       :: res
-end function MPIR_Type_match_size_c
-
-function MPIR_Wait_c (request, status) &
-           BIND(C, name="MPI_Wait") RESULT(res)
-    use :: mpi_c_interface_types, only:  c_Status, C_Request
-    use,intrinsic :: iso_c_binding, only: c_int
-    integer(C_Request)  :: request
-    type(c_Status)  :: status
-    integer(c_int)      :: res
-end function MPIR_Wait_c
-
-function MPIR_Wtick_c () &
-           BIND(C, name="MPI_Wtick") RESULT (res)
-    use,intrinsic :: iso_c_binding, only: c_double
-    real(c_double) :: res
-end function MPIR_Wtick_c
-
-
-function MPIR_Wtime_c () &
-           BIND(C, name="MPI_Wtime") RESULT (res)
-    use,intrinsic :: iso_c_binding, only:  c_double
-    real(c_double) :: res
-end function MPIR_Wtime_c
-
-
-end interface
-
-
-end module mpi_c_interface_nobuf
-
diff --git a/src/binding/fortran/use_mpi_f08/mpi_c_interface_types.f90 b/src/binding/fortran/use_mpi_f08/mpi_c_interface_types.F90
similarity index 69%
rename from src/binding/fortran/use_mpi_f08/mpi_c_interface_types.f90
rename to src/binding/fortran/use_mpi_f08/mpi_c_interface_types.F90
index 5e3cf47..19ecf72 100644
--- a/src/binding/fortran/use_mpi_f08/mpi_c_interface_types.f90
+++ b/src/binding/fortran/use_mpi_f08/mpi_c_interface_types.F90
@@ -1,15 +1,20 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
 ! mpich3 integer sizes for handles and status type
 !
-! Module mpi_c_types is a helper module used by the modules
+! Module mpi_c_interface_types is a helper module used by the modules
 ! specifying c interfaces:
 !
-! mpi_c_interfaces_cdesc - interfaces for MPI functions with a descriptor argument
-! mpi_c_interfaces_nobuf - interfaces for MPI functions with no choice argument
+! mpi_c_interface_cdesc - interfaces for MPI functions with a descriptor argument
+! mpi_c_interface_nobuf - interfaces for MPI functions with no choice argument
 !
 ! It is not defined in the spec and not intended for end users.
 !--------------------------------------------------------------
 
-MODULE mpi_c_interface_types
+module mpi_c_interface_types
 
 !=========================
 ! Kinds for native C types
@@ -17,47 +22,16 @@ MODULE mpi_c_interface_types
  use,intrinsic :: iso_c_binding, only: c_int, c_long, c_long_long, &
                                        c_ptr, c_double, C_NULL_PTR, &
                                        c_char, c_intptr_t , c_sizeof
- IMPLICIT NONE
+implicit none
 
 !=============================================================
 ! Kinds for integer types in C prototypes; should match  mpi.h
 !=============================================================
 
-! C types (with MPI_ => C_ for the internal names here
+! C types (with MPI_ => c_ for the internal names here)
 ! A.1.2 p 676
 
-integer,parameter :: c_Aint       = c_long
-integer,parameter :: c_Fint       = KIND(0)
-integer,parameter :: c_Count      = c_long_long
-integer,parameter :: c_Offset     = c_long_long
-
-integer,parameter :: c_Datatype   = c_int
-integer,parameter :: c_Comm       = c_int
-integer,parameter :: c_Group      = c_int
-integer,parameter :: c_Win        = c_int
-integer,parameter :: c_Op         = c_int
-integer,parameter :: c_Info       = c_int
-integer,parameter :: c_Errhandler = c_int
-integer,parameter :: c_Request    = c_int
-integer,parameter :: c_Message    = c_int
-integer,parameter :: c_file       = c_intptr_t
-
-! Rolf's alternate suggested names
-
-!integer,parameter :: MPI_C_DATATYPE_KIND   = c_int
-!integer,parameter :: MPI_C_COMM_KIND       = c_int
-!integer,parameter :: MPI_C_GROUP_KIND      = c_int
-!integer,parameter :: MPI_C_WIN_KIND        = c_int
-!integer,parameter :: MPI_C_OP_KIND         = c_int
-!integer,parameter :: MPI_C_INFO_KIND       = c_int
-!integer,parameter :: MPI_C_ERRHANDLER_KIND = c_int
-!integer,parameter :: MPI_C_REQUEST_KIND    = c_int
-!integer,parameter :: MPI_C_MESSAGE_KIND    = c_int
-!integer,parameter :: MPI_C_FILE_KIND       = c_intptr_t
-
-
-
-!/* Extracted from 'grep typedef mpi.h'
+!Extracted from 'grep typedef mpi.h'
 !typedef int MPI_Datatype;
 !typedef int MPI_Comm;
 !typedef int MPI_Group;
@@ -72,6 +46,23 @@ integer,parameter :: c_file       = c_intptr_t
 !typedef long long MPI_Count;
 !typedef long long MPI_Offset;
 
+integer,parameter :: c_Fint       = KIND(0)
+
+! TODO: need to automatically set these three parameters as in mpi.h.in
+integer,parameter :: c_Aint       = c_long
+integer,parameter :: c_Count      = c_long_long
+integer,parameter :: c_Offset     = c_long_long
+
+integer,parameter :: c_Datatype   = c_int
+integer,parameter :: c_Comm       = c_int
+integer,parameter :: c_Group      = c_int
+integer,parameter :: c_Win        = c_int
+integer,parameter :: c_Op         = c_int
+integer,parameter :: c_Info       = c_int
+integer,parameter :: c_Errhandler = c_int
+integer,parameter :: c_Request    = c_int
+integer,parameter :: c_Message    = c_int
+integer,parameter :: c_file       = c_intptr_t
 
 !================================================
 ! C struct for STATUS values; should match  mpi.h
@@ -88,4 +79,5 @@ type, bind(c) :: c_Status
    integer(c_int)  :: MPI_ERROR
 end type c_Status
 
-end MODULE mpi_c_interface_types
+end module mpi_c_interface_types
+
diff --git a/src/binding/fortran/use_mpi_f08/mpi_f08.f90 b/src/binding/fortran/use_mpi_f08/mpi_f08.F90
similarity index 77%
rename from src/binding/fortran/use_mpi_f08/mpi_f08.f90
rename to src/binding/fortran/use_mpi_f08/mpi_f08.F90
index 5435d1a..2fef1a4 100644
--- a/src/binding/fortran/use_mpi_f08/mpi_f08.f90
+++ b/src/binding/fortran/use_mpi_f08/mpi_f08.F90
@@ -1,8 +1,16 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
 
 ! MPI-3.0 A.3
 module mpi_f08
+use,intrinsic :: iso_c_binding, only: c_ptr
+use :: pmpi_f08
 use :: mpi_f08_types
-use :: mpi_f08_constants
+use :: mpi_f08_compile_constants
+use :: mpi_f08_link_constants
 use :: mpi_f08_callbacks
 
 implicit none
@@ -19,7 +27,7 @@ interface MPI_Bsend
     end subroutine MPI_Bsend_f08ts
 end interface MPI_Bsend
 
-interface  MPI_Bsend_init
+interface MPI_Bsend_init
     subroutine MPI_Bsend_init_f08ts(buf, count, datatype, dest, tag, comm, request, ierror)
         use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm, MPI_Request
         implicit none
@@ -30,36 +38,37 @@ interface  MPI_Bsend_init
         type(MPI_Request), intent(out) :: request
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Bsend_init_f08ts
-end interface  MPI_Bsend_init
+end interface MPI_Bsend_init
 
-interface  MPI_Buffer_attach
+interface MPI_Buffer_attach
     subroutine MPI_Buffer_attach_f08ts(buffer, size, ierror)
         implicit none
         type(*), dimension(..) :: buffer
         integer, intent(in) :: size
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Buffer_attach_f08ts
-end interface  MPI_Buffer_attach
+end interface MPI_Buffer_attach
 
-interface  MPI_Buffer_detach
-    subroutine MPI_Buffer_detach_f08ts(buffer_addr, size, ierror)
+interface MPI_Buffer_detach
+    subroutine MPI_Buffer_detach_f08(buffer_addr, size, ierror)
+        use, intrinsic :: iso_c_binding, only : c_ptr
         implicit none
-        type(*), dimension(..) :: buffer_addr
+        type(c_ptr) :: buffer_addr
         integer, intent(out) :: size
         integer, optional, intent(out) :: ierror
-    end subroutine MPI_Buffer_detach_f08ts
-end interface  MPI_Buffer_detach
+    end subroutine MPI_Buffer_detach_f08
+end interface MPI_Buffer_detach
 
-interface  MPI_Cancel
+interface MPI_Cancel
     subroutine MPI_Cancel_f08(request, ierror)
         use :: mpi_f08_types, only : MPI_Request
         implicit none
         type(MPI_Request), intent(in) :: request
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Cancel_f08
-end interface  MPI_Cancel
+end interface MPI_Cancel
 
-interface  MPI_Get_count
+interface MPI_Get_count
     subroutine MPI_Get_count_f08(status, datatype, count, ierror)
         use :: mpi_f08_types, only : MPI_Status, MPI_Datatype
         implicit none
@@ -68,97 +77,97 @@ interface  MPI_Get_count
         integer, intent(out) :: count
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Get_count_f08
-end interface  MPI_Get_count
+end interface MPI_Get_count
 
-interface  MPI_Ibsend
+interface MPI_Ibsend
     subroutine MPI_Ibsend_f08ts(buf, count, datatype, dest, tag, comm, request, ierror)
         use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm, MPI_Request
         implicit none
-        type(*), dimension(..), intent(in) :: buf
+        type(*), dimension(..), intent(in), asynchronous :: buf
         integer, intent(in) :: count, dest, tag
         type(MPI_Datatype), intent(in) :: datatype
         type(MPI_Comm), intent(in) :: comm
         type(MPI_Request), intent(out) :: request
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Ibsend_f08ts
-end interface  MPI_Ibsend
+end interface MPI_Ibsend
 
-interface  MPI_Iprobe
+interface MPI_Iprobe
     subroutine MPI_Iprobe_f08(source, tag, comm, flag, status, ierror)
         use :: mpi_f08_types, only : MPI_Comm, MPI_Status
         implicit none
         integer, intent(in) :: source, tag
         type(MPI_Comm), intent(in) :: comm
-        LOGICAL, intent(out) :: flag
-        type(MPI_Status), intent(out) :: status
+        logical, intent(out) :: flag
+        type(MPI_Status) :: status
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Iprobe_f08
-end interface  MPI_Iprobe
+end interface MPI_Iprobe
 
-interface  MPI_Irecv
+interface MPI_Irecv
     subroutine MPI_Irecv_f08ts(buf, count, datatype, source, tag, comm, request, ierror)
         use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm, MPI_Request
         implicit none
-        type(*), dimension(..) :: buf
+        type(*), dimension(..), asynchronous :: buf
         integer, intent(in) :: count, source, tag
         type(MPI_Datatype), intent(in) :: datatype
         type(MPI_Comm), intent(in) :: comm
         type(MPI_Request), intent(out) :: request
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Irecv_f08ts
-end interface  MPI_Irecv
+end interface MPI_Irecv
 
-interface  MPI_Irsend
+interface MPI_Irsend
     subroutine MPI_Irsend_f08ts(buf, count, datatype, dest, tag, comm, request, ierror)
         use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm, MPI_Request
         implicit none
-        type(*), dimension(..), intent(in) :: buf
+        type(*), dimension(..), intent(in), asynchronous :: buf
         integer, intent(in) :: count, dest, tag
         type(MPI_Datatype), intent(in) :: datatype
         type(MPI_Comm), intent(in) :: comm
         type(MPI_Request), intent(out) :: request
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Irsend_f08ts
-end interface  MPI_Irsend
+end interface MPI_Irsend
 
-interface  MPI_Isend
+interface MPI_Isend
     subroutine MPI_Isend_f08ts(buf, count, datatype, dest, tag, comm, request, ierror)
         use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm, MPI_Request
         implicit none
-        type(*), dimension(..), intent(in) :: buf
+        type(*), dimension(..), intent(in), asynchronous :: buf
         integer, intent(in) :: count, dest, tag
         type(MPI_Datatype), intent(in) :: datatype
         type(MPI_Comm), intent(in) :: comm
         type(MPI_Request), intent(out) :: request
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Isend_f08ts
-end interface  MPI_Isend
+end interface MPI_Isend
 
-interface  MPI_Issend
+interface MPI_Issend
     subroutine MPI_Issend_f08ts(buf, count, datatype, dest, tag, comm, request, ierror)
         use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm, MPI_Request
         implicit none
-        type(*), dimension(..), intent(in) :: buf
+        type(*), dimension(..), intent(in), asynchronous :: buf
         integer, intent(in) :: count, dest, tag
         type(MPI_Datatype), intent(in) :: datatype
         type(MPI_Comm), intent(in) :: comm
         type(MPI_Request), intent(out) :: request
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Issend_f08ts
-end interface  MPI_Issend
+end interface MPI_Issend
 
-interface  MPI_Probe
+interface MPI_Probe
     subroutine MPI_Probe_f08(source, tag, comm, status, ierror)
         use :: mpi_f08_types, only : MPI_Comm, MPI_Status
         implicit none
         integer, intent(in) :: source, tag
         type(MPI_Comm), intent(in) :: comm
-        type(MPI_Status), intent(out) :: status
+        type(MPI_Status) :: status
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Probe_f08
-end interface  MPI_Probe
+end interface MPI_Probe
 
-interface  MPI_Recv
+interface MPI_Recv
     subroutine MPI_Recv_f08ts(buf, count, datatype, source, tag, comm, status, ierror)
         use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm, MPI_Status
         implicit none
@@ -169,9 +178,9 @@ interface  MPI_Recv
         type(MPI_Status) :: status
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Recv_f08ts
-end interface  MPI_Recv
+end interface MPI_Recv
 
-interface  MPI_Recv_init
+interface MPI_Recv_init
     subroutine MPI_Recv_init_f08ts(buf, count, datatype, source, tag, comm, request, ierror)
         use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm, MPI_Request
         implicit none
@@ -182,29 +191,29 @@ interface  MPI_Recv_init
         type(MPI_Request), intent(out) :: request
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Recv_init_f08ts
-end interface  MPI_Recv_init
+end interface MPI_Recv_init
 
-interface  MPI_Request_free
+interface MPI_Request_free
     subroutine MPI_Request_free_f08(request, ierror)
         use :: mpi_f08_types, only : MPI_Request
         implicit none
         type(MPI_Request), intent(inout) :: request
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Request_free_f08
-end interface  MPI_Request_free
+end interface MPI_Request_free
 
-interface  MPI_Request_get_status
+interface MPI_Request_get_status
     subroutine MPI_Request_get_status_f08(request, flag, status, ierror)
         use :: mpi_f08_types, only : MPI_Request, MPI_Status
         implicit none
         type(MPI_Request), intent(in) :: request
-        LOGICAL, intent(out) :: flag
+        logical, intent(out) :: flag
         type(MPI_Status) :: status
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Request_get_status_f08
-end interface  MPI_Request_get_status
+end interface MPI_Request_get_status
 
-interface  MPI_Rsend
+interface MPI_Rsend
     subroutine MPI_Rsend_f08ts(buf, count, datatype, dest, tag, comm, ierror)
         use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm
         implicit none
@@ -214,9 +223,9 @@ interface  MPI_Rsend
         type(MPI_Comm), intent(in) :: comm
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Rsend_f08ts
-end interface  MPI_Rsend
+end interface MPI_Rsend
 
-interface  MPI_Rsend_init
+interface MPI_Rsend_init
     subroutine MPI_Rsend_init_f08ts(buf, count, datatype, dest, tag, comm, request, ierror)
         use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm, MPI_Request
         implicit none
@@ -227,9 +236,9 @@ interface  MPI_Rsend_init
         type(MPI_Request), intent(out) :: request
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Rsend_init_f08ts
-end interface  MPI_Rsend_init
+end interface MPI_Rsend_init
 
-interface  MPI_Send
+interface MPI_Send
     subroutine MPI_Send_f08ts(buf, count, datatype, dest, tag, comm, ierror)
         use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm
         implicit none
@@ -239,9 +248,9 @@ interface  MPI_Send
         type(MPI_Comm), intent(in) :: comm
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Send_f08ts
-end interface  MPI_Send
+end interface MPI_Send
 
-interface  MPI_Sendrecv
+interface MPI_Sendrecv
     subroutine MPI_Sendrecv_f08ts(sendbuf, sendcount, sendtype, dest, sendtag, recvbuf, &
                    recvcount, recvtype, source, recvtag, comm, status, ierror)
         use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm, MPI_Status
@@ -254,9 +263,9 @@ interface  MPI_Sendrecv
         type(MPI_Status) :: status
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Sendrecv_f08ts
-end interface  MPI_Sendrecv
+end interface MPI_Sendrecv
 
-interface  MPI_Sendrecv_replace
+interface MPI_Sendrecv_replace
     subroutine MPI_Sendrecv_replace_f08ts(buf, count, datatype, dest, sendtag, source, recvtag, &
                    comm, status, ierror)
         use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm, MPI_Status
@@ -268,9 +277,9 @@ interface  MPI_Sendrecv_replace
         type(MPI_Status) :: status
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Sendrecv_replace_f08ts
-end interface  MPI_Sendrecv_replace
+end interface MPI_Sendrecv_replace
 
-interface  MPI_Send_init
+interface MPI_Send_init
     subroutine MPI_Send_init_f08ts(buf, count, datatype, dest, tag, comm, request, ierror)
         use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm, MPI_Request
         implicit none
@@ -281,9 +290,9 @@ interface  MPI_Send_init
         type(MPI_Request), intent(out) :: request
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Send_init_f08ts
-end interface  MPI_Send_init
+end interface MPI_Send_init
 
-interface  MPI_Ssend
+interface MPI_Ssend
     subroutine MPI_Ssend_f08ts(buf, count, datatype, dest, tag, comm, ierror)
         use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm
         implicit none
@@ -293,9 +302,9 @@ interface  MPI_Ssend
         type(MPI_Comm), intent(in) :: comm
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Ssend_f08ts
-end interface  MPI_Ssend
+end interface MPI_Ssend
 
-interface  MPI_Ssend_init
+interface MPI_Ssend_init
     subroutine MPI_Ssend_init_f08ts(buf, count, datatype, dest, tag, comm, request, ierror)
         use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm, MPI_Request
         implicit none
@@ -306,18 +315,18 @@ interface  MPI_Ssend_init
         type(MPI_Request), intent(out) :: request
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Ssend_init_f08ts
-end interface  MPI_Ssend_init
+end interface MPI_Ssend_init
 
-interface  MPI_Start
+interface MPI_Start
     subroutine MPI_Start_f08(request, ierror)
         use :: mpi_f08_types, only : MPI_Request
         implicit none
         type(MPI_Request), intent(inout) :: request
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Start_f08
-end interface  MPI_Start
+end interface MPI_Start
 
-interface  MPI_Startall
+interface MPI_Startall
     subroutine MPI_Startall_f08(count, array_of_requests, ierror)
         use :: mpi_f08_types, only : MPI_Request
         implicit none
@@ -325,45 +334,45 @@ interface  MPI_Startall
         type(MPI_Request), intent(inout) :: array_of_requests(count)
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Startall_f08
-end interface  MPI_Startall
+end interface MPI_Startall
 
-interface  MPI_Test
+interface MPI_Test
     subroutine MPI_Test_f08(request, flag, status, ierror)
         use :: mpi_f08_types, only : MPI_Request, MPI_Status
         implicit none
         type(MPI_Request), intent(inout) :: request
-        LOGICAL, intent(out) :: flag
+        logical, intent(out) :: flag
         type(MPI_Status) :: status
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Test_f08
-end interface  MPI_Test
+end interface MPI_Test
 
-interface  MPI_Testall
+interface MPI_Testall
     subroutine MPI_Testall_f08(count, array_of_requests, flag, array_of_statuses, ierror)
         use :: mpi_f08_types, only : MPI_Request, MPI_Status
         implicit none
         integer, intent(in) :: count
         type(MPI_Request), intent(inout) :: array_of_requests(count)
-        LOGICAL, intent(out) :: flag
+        logical, intent(out) :: flag
         type(MPI_Status) :: array_of_statuses(*)
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Testall_f08
-end interface  MPI_Testall
+end interface MPI_Testall
 
-interface  MPI_Testany
+interface MPI_Testany
     subroutine MPI_Testany_f08(count, array_of_requests, index, flag, status, ierror)
         use :: mpi_f08_types, only : MPI_Request, MPI_Status
         implicit none
         integer, intent(in) :: count
         type(MPI_Request), intent(inout) :: array_of_requests(count)
         integer, intent(out) :: index
-        LOGICAL, intent(out) :: flag
+        logical, intent(out) :: flag
         type(MPI_Status) :: status
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Testany_f08
-end interface  MPI_Testany
+end interface MPI_Testany
 
-interface  MPI_Testsome
+interface MPI_Testsome
     subroutine MPI_Testsome_f08(incount, array_of_requests, outcount, &
                    array_of_indices, array_of_statuses, ierror)
         use :: mpi_f08_types, only : MPI_Request, MPI_Status
@@ -374,19 +383,19 @@ interface  MPI_Testsome
         type(MPI_Status) :: array_of_statuses(*)
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Testsome_f08
-end interface  MPI_Testsome
+end interface MPI_Testsome
 
-interface  MPI_Test_cancelled
+interface MPI_Test_cancelled
     subroutine MPI_Test_cancelled_f08(status, flag, ierror)
         use :: mpi_f08_types, only : MPI_Status
         implicit none
         type(MPI_Status), intent(in) :: status
-        LOGICAL, intent(out) :: flag
+        logical, intent(out) :: flag
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Test_cancelled_f08
-end interface  MPI_Test_cancelled
+end interface MPI_Test_cancelled
 
-interface  MPI_Wait
+interface MPI_Wait
     subroutine MPI_Wait_f08(request, status, ierror)
         use :: mpi_f08_types, only : MPI_Request, MPI_Status
         implicit none
@@ -394,9 +403,9 @@ interface  MPI_Wait
         type(MPI_Status) :: status
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Wait_f08
-end interface  MPI_Wait
+end interface MPI_Wait
 
-interface  MPI_Waitall
+interface MPI_Waitall
     subroutine MPI_Waitall_f08(count, array_of_requests, array_of_statuses, ierror)
         use :: mpi_f08_types, only : MPI_Request, MPI_Status
         implicit none
@@ -405,9 +414,9 @@ interface  MPI_Waitall
         type(MPI_Status) :: array_of_statuses(*)
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Waitall_f08
-end interface  MPI_Waitall
+end interface MPI_Waitall
 
-interface  MPI_Waitany
+interface MPI_Waitany
     subroutine MPI_Waitany_f08(count, array_of_requests, index, status, ierror)
         use :: mpi_f08_types, only : MPI_Request, MPI_Status
         implicit none
@@ -417,9 +426,9 @@ interface  MPI_Waitany
         type(MPI_Status) :: status
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Waitany_f08
-end interface  MPI_Waitany
+end interface MPI_Waitany
 
-interface  MPI_Waitsome
+interface MPI_Waitsome
     subroutine MPI_Waitsome_f08(incount, array_of_requests, outcount, &
                    array_of_indices, array_of_statuses, ierror)
         use :: mpi_f08_types, only : MPI_Request, MPI_Status
@@ -430,19 +439,19 @@ interface  MPI_Waitsome
         type(MPI_Status) :: array_of_statuses(*)
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Waitsome_f08
-end interface  MPI_Waitsome
+end interface MPI_Waitsome
 
-interface  MPI_Get_address
+interface MPI_Get_address
     subroutine MPI_Get_address_f08ts(location, address, ierror)
-        use :: mpi_f08_constants, only : MPI_ADDRESS_KinD
+        use :: mpi_f08_compile_constants, only : MPI_ADDRESS_KIND
         implicit none
-        type(*), dimension(..) :: location
-        integer(MPI_ADDRESS_KinD), intent(out) :: address
+        type(*), dimension(..), asynchronous :: location
+        integer(MPI_ADDRESS_KIND), intent(out) :: address
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Get_address_f08ts
-end interface  MPI_Get_address
+end interface MPI_Get_address
 
-interface  MPI_Get_elements
+interface MPI_Get_elements
     subroutine MPI_Get_elements_f08(status, datatype, count, ierror)
         use :: mpi_f08_types, only : MPI_Status, MPI_Datatype
         implicit none
@@ -451,21 +460,21 @@ interface  MPI_Get_elements
         integer, intent(out) :: count
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Get_elements_f08
-end interface  MPI_Get_elements
+end interface MPI_Get_elements
 
-interface  MPI_Get_elements_x
+interface MPI_Get_elements_x
     subroutine MPI_Get_elements_x_f08(status, datatype, count, ierror)
         use :: mpi_f08_types, only : MPI_Status, MPI_Datatype
-        use :: mpi_f08_constants, only : MPI_COUNT_KinD
+        use :: mpi_f08_compile_constants, only : MPI_COUNT_KIND
         implicit none
         type(MPI_Status), intent(in) :: status
         type(MPI_Datatype), intent(in) :: datatype
-        integer(MPI_COUNT_KinD), intent(out) :: count
+        integer(MPI_COUNT_KIND), intent(out) :: count
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Get_elements_x_f08
-end interface  MPI_Get_elements_x
+end interface MPI_Get_elements_x
 
-interface  MPI_Pack
+interface MPI_Pack
     subroutine MPI_Pack_f08ts(inbuf, incount, datatype, outbuf, outsize, position, comm, ierror)
         use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm
         implicit none
@@ -477,39 +486,39 @@ interface  MPI_Pack
         type(MPI_Comm), intent(in) :: comm
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Pack_f08ts
-end interface  MPI_Pack
+end interface MPI_Pack
 
-interface  MPI_Pack_external
+interface MPI_Pack_external
     subroutine MPI_Pack_external_f08ts(datarep, inbuf, incount, datatype, outbuf, outsize, &
                                       position, ierror)
         use :: mpi_f08_types, only : MPI_Datatype
-        use :: mpi_f08_constants, only : MPI_ADDRESS_KinD
+        use :: mpi_f08_compile_constants, only : MPI_ADDRESS_KIND
         implicit none
-        CHARACTER(LEN=*), intent(in) :: datarep
+        character(len=*), intent(in) :: datarep
         type(*), dimension(..), intent(in) :: inbuf
         type(*), dimension(..) :: outbuf
         integer, intent(in) :: incount
         type(MPI_Datatype), intent(in) :: datatype
-        integer(MPI_ADDRESS_KinD), intent(in) :: outsize
-        integer(MPI_ADDRESS_KinD), intent(inout) :: position
+        integer(MPI_ADDRESS_KIND), intent(in) :: outsize
+        integer(MPI_ADDRESS_KIND), intent(inout) :: position
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Pack_external_f08ts
-end interface  MPI_Pack_external
+end interface MPI_Pack_external
 
-interface  MPI_Pack_external_size
+interface MPI_Pack_external_size
     subroutine MPI_Pack_external_size_f08(datarep, incount, datatype, size, ierror)
         use :: mpi_f08_types, only : MPI_Datatype
-        use :: mpi_f08_constants, only : MPI_ADDRESS_KinD
+        use :: mpi_f08_compile_constants, only : MPI_ADDRESS_KIND
         implicit none
         type(MPI_Datatype), intent(in) :: datatype
         integer, intent(in) :: incount
-        CHARACTER(LEN=*), intent(in) :: datarep
-        integer(MPI_ADDRESS_KinD), intent(out) :: size
+        character(len=*), intent(in) :: datarep
+        integer(MPI_ADDRESS_KIND), intent(out) :: size
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Pack_external_size_f08
-end interface  MPI_Pack_external_size
+end interface MPI_Pack_external_size
 
-interface  MPI_Pack_size
+interface MPI_Pack_size
     subroutine MPI_Pack_size_f08(incount, datatype, comm, size, ierror)
         use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm
         implicit none
@@ -519,18 +528,18 @@ interface  MPI_Pack_size
         integer, intent(out) :: size
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Pack_size_f08
-end interface  MPI_Pack_size
+end interface MPI_Pack_size
 
-interface  MPI_Type_commit
+interface MPI_Type_commit
     subroutine MPI_Type_commit_f08(datatype, ierror)
         use :: mpi_f08_types, only : MPI_Datatype
         implicit none
         type(MPI_Datatype), intent(inout) :: datatype
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Type_commit_f08
-end interface  MPI_Type_commit
+end interface MPI_Type_commit
 
-interface  MPI_Type_contiguous
+interface MPI_Type_contiguous
     subroutine MPI_Type_contiguous_f08(count, oldtype, newtype, ierror)
         use :: mpi_f08_types, only : MPI_Datatype
         implicit none
@@ -539,9 +548,9 @@ interface  MPI_Type_contiguous
         type(MPI_Datatype), intent(out) :: newtype
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Type_contiguous_f08
-end interface  MPI_Type_contiguous
+end interface MPI_Type_contiguous
 
-interface  MPI_Type_create_darray
+interface MPI_Type_create_darray
     subroutine MPI_Type_create_darray_f08(size, rank, ndims, array_of_gsizes, &
                    array_of_distribs, array_of_dargs, array_of_psizes, order, &
                    oldtype, newtype, ierror)
@@ -554,37 +563,37 @@ interface  MPI_Type_create_darray
         type(MPI_Datatype), intent(out) :: newtype
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Type_create_darray_f08
-end interface  MPI_Type_create_darray
+end interface MPI_Type_create_darray
 
-interface  MPI_Type_create_hindexed
+interface MPI_Type_create_hindexed
     subroutine MPI_Type_create_hindexed_f08(count, array_of_blocklengths, &
                    array_of_displacements, oldtype, newtype, ierror)
         use :: mpi_f08_types, only : MPI_Datatype
-        use :: mpi_f08_constants, only : MPI_ADDRESS_KinD
+        use :: mpi_f08_compile_constants, only : MPI_ADDRESS_KIND
         implicit none
         integer, intent(in) :: count
         integer, intent(in) :: array_of_blocklengths(count)
-        integer(MPI_ADDRESS_KinD), intent(in) :: array_of_displacements(count)
+        integer(MPI_ADDRESS_KIND), intent(in) :: array_of_displacements(count)
         type(MPI_Datatype), intent(in) :: oldtype
         type(MPI_Datatype), intent(out) :: newtype
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Type_create_hindexed_f08
-end interface  MPI_Type_create_hindexed
+end interface MPI_Type_create_hindexed
 
-interface  MPI_Type_create_hvector
+interface MPI_Type_create_hvector
     subroutine MPI_Type_create_hvector_f08(count, blocklength, stride, oldtype, newtype, ierror)
         use :: mpi_f08_types, only : MPI_Datatype
-        use :: mpi_f08_constants, only : MPI_ADDRESS_KinD
+        use :: mpi_f08_compile_constants, only : MPI_ADDRESS_KIND
         implicit none
         integer, intent(in) :: count, blocklength
-        integer(MPI_ADDRESS_KinD), intent(in) :: stride
+        integer(MPI_ADDRESS_KIND), intent(in) :: stride
         type(MPI_Datatype), intent(in) :: oldtype
         type(MPI_Datatype), intent(out) :: newtype
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Type_create_hvector_f08
-end interface  MPI_Type_create_hvector
+end interface MPI_Type_create_hvector
 
-interface  MPI_Type_create_indexed_block
+interface MPI_Type_create_indexed_block
     subroutine MPI_Type_create_indexed_block_f08(count, blocklength, &
                    array_of_displacements, oldtype, newtype, ierror)
         use :: mpi_f08_types, only : MPI_Datatype
@@ -595,50 +604,50 @@ interface  MPI_Type_create_indexed_block
         type(MPI_Datatype), intent(out) :: newtype
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Type_create_indexed_block_f08
-end interface  MPI_Type_create_indexed_block
+end interface MPI_Type_create_indexed_block
 
-interface  MPI_Type_create_hindexed_block
+interface MPI_Type_create_hindexed_block
     subroutine MPI_Type_create_hindexed_block_f08(count, blocklength, &
                                 array_of_displacements, oldtype, newtype, ierror)
         use :: mpi_f08_types, only : MPI_Datatype
-        use :: mpi_f08_constants, only : MPI_ADDRESS_KinD
+        use :: mpi_f08_compile_constants, only : MPI_ADDRESS_KIND
         implicit none
         integer, intent(in) :: count, blocklength
-        integer(MPI_ADDRESS_KinD), intent(in) :: array_of_displacements(count)
+        integer(MPI_ADDRESS_KIND), intent(in) :: array_of_displacements(count)
         type(MPI_Datatype), intent(in) :: oldtype
         type(MPI_Datatype), intent(out) :: newtype
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Type_create_hindexed_block_f08
-end interface  MPI_Type_create_hindexed_block
+end interface MPI_Type_create_hindexed_block
 
-interface  MPI_Type_create_resized
+interface MPI_Type_create_resized
     subroutine MPI_Type_create_resized_f08(oldtype, lb, extent, newtype, ierror)
         use :: mpi_f08_types, only : MPI_Datatype
-        use :: mpi_f08_constants, only : MPI_ADDRESS_KinD
+        use :: mpi_f08_compile_constants, only : MPI_ADDRESS_KIND
         implicit none
-        integer(MPI_ADDRESS_KinD), intent(in) :: lb, extent
+        integer(MPI_ADDRESS_KIND), intent(in) :: lb, extent
         type(MPI_Datatype), intent(in) :: oldtype
         type(MPI_Datatype), intent(out) :: newtype
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Type_create_resized_f08
-end interface  MPI_Type_create_resized
+end interface MPI_Type_create_resized
 
-interface  MPI_Type_create_struct
+interface MPI_Type_create_struct
     subroutine MPI_Type_create_struct_f08(count, array_of_blocklengths, &
                                 array_of_displacements, array_of_types, newtype, ierror)
         use :: mpi_f08_types, only : MPI_Datatype
-        use :: mpi_f08_constants, only : MPI_ADDRESS_KinD
+        use :: mpi_f08_compile_constants, only : MPI_ADDRESS_KIND
         implicit none
         integer, intent(in) :: count
         integer, intent(in) :: array_of_blocklengths(count)
-        integer(MPI_ADDRESS_KinD), intent(in) :: array_of_displacements(count)
+        integer(MPI_ADDRESS_KIND), intent(in) :: array_of_displacements(count)
         type(MPI_Datatype), intent(in) :: array_of_types(count)
         type(MPI_Datatype), intent(out) :: newtype
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Type_create_struct_f08
-end interface  MPI_Type_create_struct
+end interface MPI_Type_create_struct
 
-interface  MPI_Type_create_subarray
+interface MPI_Type_create_subarray
     subroutine MPI_Type_create_subarray_f08(ndims, array_of_sizes, array_of_subsizes, &
                          array_of_starts, order, oldtype, newtype, ierror)
         use :: mpi_f08_types, only : MPI_Datatype
@@ -650,9 +659,9 @@ interface  MPI_Type_create_subarray
         type(MPI_Datatype), intent(out) :: newtype
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Type_create_subarray_f08
-end interface  MPI_Type_create_subarray
+end interface MPI_Type_create_subarray
 
-interface  MPI_Type_dup
+interface MPI_Type_dup
     subroutine MPI_Type_dup_f08(oldtype, newtype, ierror)
         use :: mpi_f08_types, only : MPI_Datatype
         implicit none
@@ -660,34 +669,33 @@ interface  MPI_Type_dup
         type(MPI_Datatype), intent(out) :: newtype
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Type_dup_f08
-end interface  MPI_Type_dup
+end interface MPI_Type_dup
 
-interface  MPI_Type_free
+interface MPI_Type_free
     subroutine MPI_Type_free_f08(datatype, ierror)
         use :: mpi_f08_types, only : MPI_Datatype
         implicit none
         type(MPI_Datatype), intent(inout) :: datatype
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Type_free_f08
-end interface  MPI_Type_free
+end interface MPI_Type_free
 
-interface  MPI_Type_get_contents
+interface MPI_Type_get_contents
     subroutine MPI_Type_get_contents_f08(datatype, max_integers, max_addresses, max_datatypes, &
-                                          array_of_integers, array_of_addresses, array_of_datatypes, &
-                                          ierror)
+                 array_of_integers, array_of_addresses, array_of_datatypes, ierror)
         use :: mpi_f08_types, only : MPI_Datatype
-        use :: mpi_f08_constants, only : MPI_ADDRESS_KinD
+        use :: mpi_f08_compile_constants, only : MPI_ADDRESS_KIND
         implicit none
         type(MPI_Datatype), intent(in) :: datatype
         integer, intent(in) :: max_integers, max_addresses, max_datatypes
         integer, intent(out) :: array_of_integers(max_integers)
-        integer(MPI_ADDRESS_KinD), intent(out) :: array_of_addresses(max_addresses)
+        integer(MPI_ADDRESS_KIND), intent(out) :: array_of_addresses(max_addresses)
         type(MPI_Datatype), intent(out) :: array_of_datatypes(max_datatypes)
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Type_get_contents_f08
-end interface  MPI_Type_get_contents
+end interface MPI_Type_get_contents
 
-interface  MPI_Type_get_envelope
+interface MPI_Type_get_envelope
     subroutine MPI_Type_get_envelope_f08(datatype, num_integers, num_addresses, num_datatypes, &
                                           combiner, ierror)
         use :: mpi_f08_types, only : MPI_Datatype
@@ -696,55 +704,54 @@ interface  MPI_Type_get_envelope
         integer, intent(out) :: num_integers, num_addresses, num_datatypes, combiner
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Type_get_envelope_f08
-end interface  MPI_Type_get_envelope
+end interface MPI_Type_get_envelope
 
-interface  MPI_Type_get_extent
+interface MPI_Type_get_extent
     subroutine MPI_Type_get_extent_f08(datatype, lb, extent, ierror)
         use :: mpi_f08_types, only : MPI_Datatype
-        use :: mpi_f08_constants, only : MPI_ADDRESS_KinD
+        use :: mpi_f08_compile_constants, only : MPI_ADDRESS_KIND
         implicit none
         type(MPI_Datatype), intent(in) :: datatype
-        integer(MPI_ADDRESS_KinD), intent(out) :: lb, extent
+        integer(MPI_ADDRESS_KIND), intent(out) :: lb, extent
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Type_get_extent_f08
-end interface  MPI_Type_get_extent
+end interface MPI_Type_get_extent
 
-interface  MPI_Type_get_extent_x
+interface MPI_Type_get_extent_x
     subroutine MPI_Type_get_extent_x_f08(datatype, lb, extent, ierror)
         use :: mpi_f08_types, only : MPI_Datatype
-        use :: mpi_f08_constants, only : MPI_ADDRESS_KinD
-        use :: mpi_f08_constants, only : MPI_COUNT_KinD
+        use :: mpi_f08_compile_constants, only : MPI_COUNT_KIND
         implicit none
         type(MPI_Datatype), intent(in) :: datatype
-        integer(MPI_COUNT_KinD), intent(out) :: lb, extent
+        integer(MPI_COUNT_KIND), intent(out) :: lb, extent
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Type_get_extent_x_f08
-end interface  MPI_Type_get_extent_x
+end interface MPI_Type_get_extent_x
 
-interface  MPI_Type_get_true_extent
+interface MPI_Type_get_true_extent
     subroutine MPI_Type_get_true_extent_f08(datatype, true_lb, true_extent, ierror)
         use :: mpi_f08_types, only : MPI_Datatype
-        use :: mpi_f08_constants, only : MPI_ADDRESS_KinD
+        use :: mpi_f08_compile_constants, only : MPI_ADDRESS_KIND
         implicit none
         type(MPI_Datatype), intent(in) :: datatype
-        integer(MPI_ADDRESS_KinD), intent(out) :: true_lb, true_extent
+        integer(MPI_ADDRESS_KIND), intent(out) :: true_lb, true_extent
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Type_get_true_extent_f08
-end interface  MPI_Type_get_true_extent
+end interface MPI_Type_get_true_extent
 
-interface  MPI_Type_get_true_extent_x
+interface MPI_Type_get_true_extent_x
     subroutine MPI_Type_get_true_extent_x_f08(datatype, true_lb, true_extent, ierror)
         use :: mpi_f08_types, only : MPI_Datatype
-        use :: mpi_f08_constants, only : MPI_ADDRESS_KinD
-        use :: mpi_f08_constants, only : MPI_COUNT_KinD
+        use :: mpi_f08_compile_constants, only : MPI_ADDRESS_KIND
+        use :: mpi_f08_compile_constants, only : MPI_COUNT_KIND
         implicit none
         type(MPI_Datatype), intent(in) :: datatype
-        integer(MPI_COUNT_KinD), intent(out) :: true_lb, true_extent
+        integer(MPI_COUNT_KIND), intent(out) :: true_lb, true_extent
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Type_get_true_extent_x_f08
-end interface  MPI_Type_get_true_extent_x
+end interface MPI_Type_get_true_extent_x
 
-interface  MPI_Type_indexed
+interface MPI_Type_indexed
     subroutine MPI_Type_indexed_f08(count, array_of_blocklengths, &
                                      array_of_displacements, oldtype, newtype, ierror)
         use :: mpi_f08_types, only : MPI_Datatype
@@ -755,9 +762,9 @@ interface  MPI_Type_indexed
         type(MPI_Datatype), intent(out) :: newtype
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Type_indexed_f08
-end interface  MPI_Type_indexed
+end interface MPI_Type_indexed
 
-interface  MPI_Type_size
+interface MPI_Type_size
     subroutine MPI_Type_size_f08(datatype, size, ierror)
         use :: mpi_f08_types, only : MPI_Datatype
         implicit none
@@ -765,20 +772,20 @@ interface  MPI_Type_size
         integer, intent(out) :: size
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Type_size_f08
-end interface  MPI_Type_size
+end interface MPI_Type_size
 
-interface  MPI_Type_size_x
+interface MPI_Type_size_x
     subroutine MPI_Type_size_x_f08(datatype, size, ierror)
         use :: mpi_f08_types, only : MPI_Datatype
-        use :: mpi_f08_constants, only : MPI_COUNT_KinD
+        use :: mpi_f08_compile_constants, only : MPI_COUNT_KIND
         implicit none
         type(MPI_Datatype), intent(in) :: datatype
-        integer(MPI_COUNT_KinD), intent(out) :: size
+        integer(MPI_COUNT_KIND), intent(out) :: size
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Type_size_x_f08
-end interface  MPI_Type_size_x
+end interface MPI_Type_size_x
 
-interface  MPI_Type_vector
+interface MPI_Type_vector
     subroutine MPI_Type_vector_f08(count, blocklength, stride, oldtype, newtype, ierror)
         use :: mpi_f08_types, only : MPI_Datatype
         implicit none
@@ -787,9 +794,9 @@ interface  MPI_Type_vector
         type(MPI_Datatype), intent(out) :: newtype
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Type_vector_f08
-end interface  MPI_Type_vector
+end interface MPI_Type_vector
 
-interface  MPI_Unpack
+interface MPI_Unpack
     subroutine MPI_Unpack_f08ts(inbuf, insize, position, outbuf, outcount, datatype, comm, &
                                ierror)
         use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm
@@ -802,26 +809,26 @@ interface  MPI_Unpack
         type(MPI_Comm), intent(in) :: comm
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Unpack_f08ts
-end interface  MPI_Unpack
+end interface MPI_Unpack
 
-interface  MPI_Unpack_external
+interface MPI_Unpack_external
     subroutine MPI_Unpack_external_f08ts(datarep, inbuf, insize, position, outbuf, outcount, &
                                         datatype, ierror)
         use :: mpi_f08_types, only : MPI_Datatype
-        use :: mpi_f08_constants, only : MPI_ADDRESS_KinD
+        use :: mpi_f08_compile_constants, only : MPI_ADDRESS_KIND
         implicit none
-        CHARACTER(LEN=*), intent(in) :: datarep
+        character(len=*), intent(in) :: datarep
         type(*), dimension(..), intent(in) :: inbuf
         type(*), dimension(..) :: outbuf
-        integer(MPI_ADDRESS_KinD), intent(in) :: insize
-        integer(MPI_ADDRESS_KinD), intent(inout) :: position
+        integer(MPI_ADDRESS_KIND), intent(in) :: insize
+        integer(MPI_ADDRESS_KIND), intent(inout) :: position
         integer, intent(in) :: outcount
         type(MPI_Datatype), intent(in) :: datatype
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Unpack_external_f08ts
-end interface  MPI_Unpack_external
+end interface MPI_Unpack_external
 
-interface  MPI_Allgather
+interface MPI_Allgather
     subroutine MPI_Allgather_f08ts(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, &
                                   comm, ierror)
         use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm
@@ -833,24 +840,24 @@ interface  MPI_Allgather
         type(MPI_Comm), intent(in) :: comm
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Allgather_f08ts
-end interface  MPI_Allgather
+end interface MPI_Allgather
 
-interface  MPI_Iallgather
+interface MPI_Iallgather
     subroutine MPI_Iallgather_f08ts(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, &
                                   comm, request, ierror)
         use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm, MPI_Request
         implicit none
-        type(*), dimension(..), intent(in) :: sendbuf
-        type(*), dimension(..) :: recvbuf
+        type(*), dimension(..), intent(in), asynchronous :: sendbuf
+        type(*), dimension(..), asynchronous :: recvbuf
         integer, intent(in) :: sendcount, recvcount
         type(MPI_Datatype), intent(in) :: sendtype, recvtype
         type(MPI_Comm), intent(in) :: comm
         type(MPI_Request), intent(out) :: request
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Iallgather_f08ts
-end interface  MPI_Iallgather
+end interface MPI_Iallgather
 
-interface  MPI_Allgatherv
+interface MPI_Allgatherv
     subroutine MPI_Allgatherv_f08ts(sendbuf, sendcount, sendtype, recvbuf, recvcounts, displs, &
                                    recvtype, comm, ierror)
         use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm
@@ -863,15 +870,15 @@ interface  MPI_Allgatherv
         type(MPI_Comm), intent(in) :: comm
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Allgatherv_f08ts
-end interface  MPI_Allgatherv
+end interface MPI_Allgatherv
 
-interface  MPI_Iallgatherv
+interface MPI_Iallgatherv
     subroutine MPI_Iallgatherv_f08ts(sendbuf, sendcount, sendtype, recvbuf, recvcounts, displs, &
                                    recvtype, comm, request, ierror)
         use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm, MPI_Request
         implicit none
-        type(*), dimension(..), intent(in) :: sendbuf
-        type(*), dimension(..) :: recvbuf
+        type(*), dimension(..), intent(in), asynchronous :: sendbuf
+        type(*), dimension(..), asynchronous :: recvbuf
         integer, intent(in) :: sendcount
         integer, intent(in) :: recvcounts(*), displs(*)
         type(MPI_Datatype), intent(in) :: sendtype, recvtype
@@ -879,9 +886,9 @@ interface  MPI_Iallgatherv
         type(MPI_Request), intent(out) :: request
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Iallgatherv_f08ts
-end interface  MPI_Iallgatherv
+end interface MPI_Iallgatherv
 
-interface  MPI_Allreduce
+interface MPI_Allreduce
     subroutine MPI_Allreduce_f08ts(sendbuf, recvbuf, count, datatype, op, comm, ierror)
         use :: mpi_f08_types, only : MPI_Datatype, MPI_Op, MPI_Comm
         implicit none
@@ -893,14 +900,14 @@ interface  MPI_Allreduce
         type(MPI_Comm), intent(in) :: comm
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Allreduce_f08ts
-end interface  MPI_Allreduce
+end interface MPI_Allreduce
 
-interface  MPI_Iallreduce
+interface MPI_Iallreduce
     subroutine MPI_Iallreduce_f08ts(sendbuf, recvbuf, count, datatype, op, comm, request, ierror)
         use :: mpi_f08_types, only : MPI_Datatype, MPI_Op, MPI_Comm, MPI_Request
         implicit none
-        type(*), dimension(..), intent(in) :: sendbuf
-        type(*), dimension(..) :: recvbuf
+        type(*), dimension(..), intent(in), asynchronous :: sendbuf
+        type(*), dimension(..), asynchronous :: recvbuf
         integer, intent(in) :: count
         type(MPI_Datatype), intent(in) :: datatype
         type(MPI_Op), intent(in) :: op
@@ -908,9 +915,9 @@ interface  MPI_Iallreduce
         type(MPI_Request), intent(out) :: request
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Iallreduce_f08ts
-end interface  MPI_Iallreduce
+end interface MPI_Iallreduce
 
-interface  MPI_Alltoall
+interface MPI_Alltoall
     subroutine MPI_Alltoall_f08ts(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, &
                                  comm, ierror)
         use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm
@@ -922,24 +929,24 @@ interface  MPI_Alltoall
         type(MPI_Comm), intent(in) :: comm
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Alltoall_f08ts
-end interface  MPI_Alltoall
+end interface MPI_Alltoall
 
-interface  MPI_Ialltoall
+interface MPI_Ialltoall
     subroutine MPI_Ialltoall_f08ts(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, &
                                  comm, request, ierror)
         use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm, MPI_Request
         implicit none
-        type(*), dimension(..), intent(in) :: sendbuf
-        type(*), dimension(..) :: recvbuf
+        type(*), dimension(..), intent(in), asynchronous :: sendbuf
+        type(*), dimension(..), asynchronous :: recvbuf
         integer, intent(in) :: sendcount, recvcount
         type(MPI_Datatype), intent(in) :: sendtype, recvtype
         type(MPI_Comm), intent(in) :: comm
         type(MPI_Request), intent(out) :: request
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Ialltoall_f08ts
-end interface  MPI_Ialltoall
+end interface MPI_Ialltoall
 
-interface  MPI_Alltoallv
+interface MPI_Alltoallv
     subroutine MPI_Alltoallv_f08ts(sendbuf, sendcounts, sdispls, sendtype, recvbuf, recvcounts, &
                                   rdispls, recvtype, comm, ierror)
         use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm
@@ -951,24 +958,24 @@ interface  MPI_Alltoallv
         type(MPI_Comm), intent(in) :: comm
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Alltoallv_f08ts
-end interface  MPI_Alltoallv
+end interface MPI_Alltoallv
 
-interface  MPI_Ialltoallv
+interface MPI_Ialltoallv
     subroutine MPI_Ialltoallv_f08ts(sendbuf, sendcounts, sdispls, sendtype, recvbuf, recvcounts, &
                                   rdispls, recvtype, comm, request, ierror)
         use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm, MPI_Request
         implicit none
-        type(*), dimension(..), intent(in) :: sendbuf
-        type(*), dimension(..) :: recvbuf
+        type(*), dimension(..), intent(in), asynchronous :: sendbuf
+        type(*), dimension(..), asynchronous :: recvbuf
         integer, intent(in) :: sendcounts(*), sdispls(*), recvcounts(*), rdispls(*)
         type(MPI_Datatype), intent(in) :: sendtype, recvtype
         type(MPI_Comm), intent(in) :: comm
-        type(MPI_Request), intent(in) :: request
+        type(MPI_Request), intent(out) :: request
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Ialltoallv_f08ts
-end interface  MPI_Ialltoallv
+end interface MPI_Ialltoallv
 
-interface  MPI_Alltoallw
+interface MPI_Alltoallw
     subroutine MPI_Alltoallw_f08ts(sendbuf, sendcounts, sdispls, sendtypes, recvbuf, recvcounts, &
                                   rdispls, recvtypes, comm, ierror)
         use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm
@@ -980,33 +987,33 @@ interface  MPI_Alltoallw
         type(MPI_Comm), intent(in) :: comm
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Alltoallw_f08ts
-end interface  MPI_Alltoallw
+end interface MPI_Alltoallw
 
-interface  MPI_Ialltoallw
+interface MPI_Ialltoallw
     subroutine MPI_Ialltoallw_f08ts(sendbuf, sendcounts, sdispls, sendtypes, recvbuf, recvcounts, &
                                   rdispls, recvtypes, comm, request, ierror)
         use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm, MPI_Request
         implicit none
-        type(*), dimension(..), intent(in) :: sendbuf
-        type(*), dimension(..) :: recvbuf
+        type(*), dimension(..), intent(in), asynchronous :: sendbuf
+        type(*), dimension(..), asynchronous :: recvbuf
         integer, intent(in) :: sendcounts(*), sdispls(*), recvcounts(*), rdispls(*)
         type(MPI_Datatype), intent(in) :: sendtypes(*), recvtypes(*)
         type(MPI_Comm), intent(in) :: comm
-        type(MPI_Request), intent(in) :: request
+        type(MPI_Request), intent(out) :: request
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Ialltoallw_f08ts
-end interface  MPI_Ialltoallw
+end interface MPI_Ialltoallw
 
-interface  MPI_Barrier
+interface MPI_Barrier
     subroutine MPI_Barrier_f08(comm, ierror)
         use :: mpi_f08_types, only : MPI_Comm
         implicit none
         type(MPI_Comm), intent(in) :: comm
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Barrier_f08
-end interface  MPI_Barrier
+end interface MPI_Barrier
 
-interface  MPI_Ibarrier
+interface MPI_Ibarrier
     subroutine MPI_Ibarrier_f08(comm, request, ierror)
         use :: mpi_f08_types, only : MPI_Comm, MPI_Request
         implicit none
@@ -1014,9 +1021,9 @@ interface  MPI_Ibarrier
         type(MPI_Request), intent(out) :: request
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Ibarrier_f08
-end interface  MPI_Ibarrier
+end interface MPI_Ibarrier
 
-interface  MPI_Bcast
+interface MPI_Bcast
     subroutine MPI_Bcast_f08ts(buffer, count, datatype, root, comm, ierror)
         use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm
         implicit none
@@ -1026,22 +1033,22 @@ interface  MPI_Bcast
         type(MPI_Comm), intent(in) :: comm
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Bcast_f08ts
-end interface  MPI_Bcast
+end interface MPI_Bcast
 
-interface  MPI_Ibcast
+interface MPI_Ibcast
     subroutine MPI_Ibcast_f08ts(buffer, count, datatype, root, comm, request, ierror)
         use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm, MPI_Request
         implicit none
-        type(*), dimension(..) :: buffer
+        type(*), dimension(..), asynchronous :: buffer
         integer, intent(in) :: count, root
         type(MPI_Datatype), intent(in) :: datatype
         type(MPI_Comm), intent(in) :: comm
         type(MPI_Request), intent(out) :: request
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Ibcast_f08ts
-end interface  MPI_Ibcast
+end interface MPI_Ibcast
 
-interface  MPI_Exscan
+interface MPI_Exscan
     subroutine MPI_Exscan_f08ts(sendbuf, recvbuf, count, datatype, op, comm, ierror)
         use :: mpi_f08_types, only : MPI_Datatype, MPI_Op, MPI_Comm
         implicit none
@@ -1053,14 +1060,14 @@ interface  MPI_Exscan
         type(MPI_Comm), intent(in) :: comm
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Exscan_f08ts
-end interface  MPI_Exscan
+end interface MPI_Exscan
 
-interface  MPI_Iexscan
+interface MPI_Iexscan
     subroutine MPI_Iexscan_f08ts(sendbuf, recvbuf, count, datatype, op, comm, request, ierror)
         use :: mpi_f08_types, only : MPI_Datatype, MPI_Op, MPI_Comm, MPI_Request
         implicit none
-        type(*), dimension(..), intent(in) :: sendbuf
-        type(*), dimension(..) :: recvbuf
+        type(*), dimension(..), intent(in), asynchronous :: sendbuf
+        type(*), dimension(..), asynchronous :: recvbuf
         integer, intent(in) :: count
         type(MPI_Datatype), intent(in) :: datatype
         type(MPI_Op), intent(in) :: op
@@ -1068,9 +1075,9 @@ interface  MPI_Iexscan
         type(MPI_Request), intent(out) :: request
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Iexscan_f08ts
-end interface  MPI_Iexscan
+end interface MPI_Iexscan
 
-interface  MPI_Gather
+interface MPI_Gather
     subroutine MPI_Gather_f08ts(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, &
                                root, comm, ierror)
         use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm
@@ -1082,24 +1089,24 @@ interface  MPI_Gather
         type(MPI_Comm), intent(in) :: comm
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Gather_f08ts
-end interface  MPI_Gather
+end interface MPI_Gather
 
-interface  MPI_Igather
+interface MPI_Igather
     subroutine MPI_Igather_f08ts(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, &
                                root, comm, request, ierror)
         use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm, MPI_Request
         implicit none
-        type(*), dimension(..), intent(in) :: sendbuf
-        type(*), dimension(..) :: recvbuf
+        type(*), dimension(..), intent(in), asynchronous :: sendbuf
+        type(*), dimension(..), asynchronous :: recvbuf
         integer, intent(in) :: sendcount, recvcount, root
         type(MPI_Datatype), intent(in) :: sendtype, recvtype
         type(MPI_Comm), intent(in) :: comm
         type(MPI_Request), intent(out) :: request
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Igather_f08ts
-end interface  MPI_Igather
+end interface MPI_Igather
 
-interface  MPI_Gatherv
+interface MPI_Gatherv
     subroutine MPI_Gatherv_f08ts(sendbuf, sendcount, sendtype, recvbuf, recvcounts, displs, &
                                 recvtype, root, comm, ierror)
         use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm
@@ -1112,15 +1119,15 @@ interface  MPI_Gatherv
         type(MPI_Comm), intent(in) :: comm
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Gatherv_f08ts
-end interface  MPI_Gatherv
+end interface MPI_Gatherv
 
-interface  MPI_Igatherv
+interface MPI_Igatherv
     subroutine MPI_Igatherv_f08ts(sendbuf, sendcount, sendtype, recvbuf, recvcounts, displs, &
                                 recvtype, root, comm, request, ierror)
         use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm, MPI_Request
         implicit none
-        type(*), dimension(..), intent(in) :: sendbuf
-        type(*), dimension(..) :: recvbuf
+        type(*), dimension(..), intent(in), asynchronous :: sendbuf
+        type(*), dimension(..), asynchronous :: recvbuf
         integer, intent(in) :: sendcount, root
         integer, intent(in) :: recvcounts(*), displs(*)
         type(MPI_Datatype), intent(in) :: sendtype, recvtype
@@ -1128,40 +1135,40 @@ interface  MPI_Igatherv
         type(MPI_Request), intent(out) :: request
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Igatherv_f08ts
-end interface  MPI_Igatherv
+end interface MPI_Igatherv
 
-interface  MPI_Op_commutative
+interface MPI_Op_commutative
     subroutine MPI_Op_commutative_f08(op, commute, ierror)
         use :: mpi_f08_types, only : MPI_Op
         implicit none
         type(MPI_Op), intent(in) :: op
-        LOGICAL, intent(out) :: commute
+        logical, intent(out) :: commute
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Op_commutative_f08
-end interface  MPI_Op_commutative
+end interface MPI_Op_commutative
 
-interface  MPI_Op_create
+interface MPI_Op_create
     subroutine MPI_Op_create_f08(user_fn, commute, op, ierror)
         use :: mpi_f08_types, only : MPI_Op
         use :: mpi_f08_callbacks, only : MPI_User_function
         implicit none
-        PROCEDURE(MPI_User_function) :: user_fn
-        LOGICAL, intent(in) :: commute
+        procedure(MPI_User_function) :: user_fn
+        logical, intent(in) :: commute
         type(MPI_Op), intent(out) :: op
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Op_create_f08
-end interface  MPI_Op_create
+end interface MPI_Op_create
 
-interface  MPI_Op_free
+interface MPI_Op_free
     subroutine MPI_Op_free_f08(op, ierror)
         use :: mpi_f08_types, only : MPI_Op
         implicit none
         type(MPI_Op), intent(inout) :: op
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Op_free_f08
-end interface  MPI_Op_free
+end interface MPI_Op_free
 
-interface  MPI_Reduce
+interface MPI_Reduce
     subroutine MPI_Reduce_f08ts(sendbuf, recvbuf, count, datatype, op, root, comm, ierror)
         use :: mpi_f08_types, only : MPI_Datatype, MPI_Op, MPI_Comm
         implicit none
@@ -1173,14 +1180,14 @@ interface  MPI_Reduce
         type(MPI_Comm), intent(in) :: comm
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Reduce_f08ts
-end interface  MPI_Reduce
+end interface MPI_Reduce
 
-interface  MPI_Ireduce
+interface MPI_Ireduce
     subroutine MPI_Ireduce_f08ts(sendbuf, recvbuf, count, datatype, op, root, comm, request, ierror)
         use :: mpi_f08_types, only : MPI_Datatype, MPI_Op, MPI_Comm, MPI_Request
         implicit none
-        type(*), dimension(..), intent(in) :: sendbuf
-        type(*), dimension(..) :: recvbuf
+        type(*), dimension(..), intent(in), asynchronous :: sendbuf
+        type(*), dimension(..), asynchronous :: recvbuf
         integer, intent(in) :: count, root
         type(MPI_Datatype), intent(in) :: datatype
         type(MPI_Op), intent(in) :: op
@@ -1188,9 +1195,9 @@ interface  MPI_Ireduce
         type(MPI_Request), intent(out) :: request
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Ireduce_f08ts
-end interface  MPI_Ireduce
+end interface MPI_Ireduce
 
-interface  MPI_Reduce_local
+interface MPI_Reduce_local
     subroutine MPI_Reduce_local_f08ts(inbuf, inoutbuf, count, datatype, op, ierror)
         use :: mpi_f08_types, only : MPI_Datatype, MPI_Op
         implicit none
@@ -1201,9 +1208,9 @@ interface  MPI_Reduce_local
         type(MPI_Op), intent(in) :: op
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Reduce_local_f08ts
-end interface  MPI_Reduce_local
+end interface MPI_Reduce_local
 
-interface  MPI_Reduce_scatter
+interface MPI_Reduce_scatter
     subroutine MPI_Reduce_scatter_f08ts(sendbuf, recvbuf, recvcounts, datatype, op, comm, &
                                        ierror)
         use :: mpi_f08_types, only : MPI_Datatype, MPI_Op, MPI_Comm
@@ -1216,15 +1223,15 @@ interface  MPI_Reduce_scatter
         type(MPI_Comm), intent(in) :: comm
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Reduce_scatter_f08ts
-end interface  MPI_Reduce_scatter
+end interface MPI_Reduce_scatter
 
-interface  MPI_Ireduce_scatter
+interface MPI_Ireduce_scatter
     subroutine MPI_Ireduce_scatter_f08ts(sendbuf, recvbuf, recvcounts, datatype, op, comm, &
                                        request, ierror)
         use :: mpi_f08_types, only : MPI_Datatype, MPI_Op, MPI_Comm, MPI_Request
         implicit none
-        type(*), dimension(..), intent(in) :: sendbuf
-        type(*), dimension(..) :: recvbuf
+        type(*), dimension(..), intent(in), asynchronous :: sendbuf
+        type(*), dimension(..), asynchronous :: recvbuf
         integer, intent(in) :: recvcounts(*)
         type(MPI_Datatype), intent(in) :: datatype
         type(MPI_Op), intent(in) :: op
@@ -1232,9 +1239,9 @@ interface  MPI_Ireduce_scatter
         type(MPI_Request), intent(out) :: request
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Ireduce_scatter_f08ts
-end interface  MPI_Ireduce_scatter
+end interface MPI_Ireduce_scatter
 
-interface  MPI_Reduce_scatter_block
+interface MPI_Reduce_scatter_block
     subroutine MPI_Reduce_scatter_block_f08ts(sendbuf, recvbuf, recvcount, datatype, op, comm, &
                                              ierror)
         use :: mpi_f08_types, only : MPI_Datatype, MPI_Op, MPI_Comm
@@ -1247,15 +1254,15 @@ interface  MPI_Reduce_scatter_block
         type(MPI_Comm), intent(in) :: comm
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Reduce_scatter_block_f08ts
-end interface  MPI_Reduce_scatter_block
+end interface MPI_Reduce_scatter_block
 
-interface  MPI_Ireduce_scatter_block
+interface MPI_Ireduce_scatter_block
     subroutine MPI_Ireduce_scatter_block_f08ts(sendbuf, recvbuf, recvcount, datatype, op, comm, &
                                              request, ierror)
         use :: mpi_f08_types, only : MPI_Datatype, MPI_Op, MPI_Comm, MPI_Request
         implicit none
-        type(*), dimension(..), intent(in) :: sendbuf
-        type(*), dimension(..) :: recvbuf
+        type(*), dimension(..), intent(in), asynchronous :: sendbuf
+        type(*), dimension(..), asynchronous :: recvbuf
         integer, intent(in) :: recvcount
         type(MPI_Datatype), intent(in) :: datatype
         type(MPI_Op), intent(in) :: op
@@ -1263,9 +1270,9 @@ interface  MPI_Ireduce_scatter_block
         type(MPI_Request), intent(out) :: request
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Ireduce_scatter_block_f08ts
-end interface  MPI_Ireduce_scatter_block
+end interface MPI_Ireduce_scatter_block
 
-interface  MPI_Scan
+interface MPI_Scan
     subroutine MPI_Scan_f08ts(sendbuf, recvbuf, count, datatype, op, comm, ierror)
         use :: mpi_f08_types, only : MPI_Datatype, MPI_Op, MPI_Comm
         implicit none
@@ -1277,14 +1284,14 @@ interface  MPI_Scan
         type(MPI_Comm), intent(in) :: comm
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Scan_f08ts
-end interface  MPI_Scan
+end interface MPI_Scan
 
-interface  MPI_Iscan
+interface MPI_Iscan
     subroutine MPI_Iscan_f08ts(sendbuf, recvbuf, count, datatype, op, comm, request, ierror)
         use :: mpi_f08_types, only : MPI_Datatype, MPI_Op, MPI_Comm, MPI_Request
         implicit none
-        type(*), dimension(..), intent(in) :: sendbuf
-        type(*), dimension(..) :: recvbuf
+        type(*), dimension(..), intent(in), asynchronous :: sendbuf
+        type(*), dimension(..), asynchronous :: recvbuf
         integer, intent(in) :: count
         type(MPI_Datatype), intent(in) :: datatype
         type(MPI_Op), intent(in) :: op
@@ -1292,9 +1299,9 @@ interface  MPI_Iscan
         type(MPI_Request), intent(out) :: request
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Iscan_f08ts
-end interface  MPI_Iscan
+end interface MPI_Iscan
 
-interface  MPI_Scatter
+interface MPI_Scatter
     subroutine MPI_Scatter_f08ts(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, &
                                 root, comm, ierror)
         use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm
@@ -1306,24 +1313,24 @@ interface  MPI_Scatter
         type(MPI_Comm), intent(in) :: comm
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Scatter_f08ts
-end interface  MPI_Scatter
+end interface MPI_Scatter
 
-interface  MPI_Iscatter
+interface MPI_Iscatter
     subroutine MPI_Iscatter_f08ts(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, &
                                 root, comm, request, ierror)
         use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm, MPI_Request
         implicit none
-        type(*), dimension(..), intent(in) :: sendbuf
-        type(*), dimension(..) :: recvbuf
+        type(*), dimension(..), intent(in), asynchronous :: sendbuf
+        type(*), dimension(..), asynchronous :: recvbuf
         integer, intent(in) :: sendcount, recvcount, root
         type(MPI_Datatype), intent(in) :: sendtype, recvtype
         type(MPI_Comm), intent(in) :: comm
         type(MPI_Request), intent(out) :: request
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Iscatter_f08ts
-end interface  MPI_Iscatter
+end interface MPI_Iscatter
 
-interface  MPI_Scatterv
+interface MPI_Scatterv
     subroutine MPI_Scatterv_f08ts(sendbuf, sendcounts, displs, sendtype, recvbuf, recvcount, &
                                  recvtype, root, comm, ierror)
         use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm
@@ -1336,15 +1343,15 @@ interface  MPI_Scatterv
         type(MPI_Comm), intent(in) :: comm
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Scatterv_f08ts
-end interface  MPI_Scatterv
+end interface MPI_Scatterv
 
-interface  MPI_Iscatterv
+interface MPI_Iscatterv
     subroutine MPI_Iscatterv_f08ts(sendbuf, sendcounts, displs, sendtype, recvbuf, recvcount, &
                                  recvtype, root, comm, request, ierror)
         use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm, MPI_Request
         implicit none
-        type(*), dimension(..), intent(in) :: sendbuf
-        type(*), dimension(..) :: recvbuf
+        type(*), dimension(..), intent(in), asynchronous :: sendbuf
+        type(*), dimension(..), asynchronous :: recvbuf
         integer, intent(in) :: recvcount, root
         integer, intent(in) :: sendcounts(*), displs(*)
         type(MPI_Datatype), intent(in) :: sendtype, recvtype
@@ -1352,9 +1359,9 @@ interface  MPI_Iscatterv
         type(MPI_Request), intent(out) :: request
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Iscatterv_f08ts
-end interface  MPI_Iscatterv
+end interface MPI_Iscatterv
 
-interface  MPI_Comm_compare
+interface MPI_Comm_compare
     subroutine MPI_Comm_compare_f08(comm1,comm2,result, ierror)
         use :: mpi_f08_types, only : MPI_Comm
         implicit none
@@ -1363,9 +1370,9 @@ interface  MPI_Comm_compare
         integer, intent(out) :: result
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Comm_compare_f08
-end interface  MPI_Comm_compare
+end interface MPI_Comm_compare
 
-interface  MPI_Comm_create
+interface MPI_Comm_create
     subroutine MPI_Comm_create_f08(comm, group, newcomm, ierror)
         use :: mpi_f08_types, only : MPI_Comm, MPI_Group
         implicit none
@@ -1374,9 +1381,9 @@ interface  MPI_Comm_create
         type(MPI_Comm), intent(out) :: newcomm
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Comm_create_f08
-end interface  MPI_Comm_create
+end interface MPI_Comm_create
 
-interface  MPI_Comm_create_group
+interface MPI_Comm_create_group
     subroutine MPI_Comm_create_group_f08(comm, group, tag, newcomm, ierror)
         use :: mpi_f08_types, only : MPI_Comm, MPI_Group
         implicit none
@@ -1386,24 +1393,24 @@ interface  MPI_Comm_create_group
         type(MPI_Comm), intent(out) :: newcomm
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Comm_create_group_f08
-end interface  MPI_Comm_create_group
+end interface MPI_Comm_create_group
 
-interface  MPI_Comm_create_keyval
+interface MPI_Comm_create_keyval
     subroutine MPI_Comm_create_keyval_f08(comm_copy_attr_fn, comm_delete_attr_fn, comm_keyval, &
                                            extra_state, ierror)
-        use :: mpi_f08_constants, only : MPI_ADDRESS_KinD
+        use :: mpi_f08_compile_constants, only : MPI_ADDRESS_KIND
         use :: mpi_f08_callbacks, only : MPI_Comm_copy_attr_function
         use :: mpi_f08_callbacks, only : MPI_Comm_delete_attr_function
         implicit none
-        PROCEDURE(MPI_Comm_copy_attr_function) :: comm_copy_attr_fn
-        PROCEDURE(MPI_Comm_delete_attr_function) :: comm_delete_attr_fn
+        procedure(MPI_Comm_copy_attr_function) :: comm_copy_attr_fn
+        procedure(MPI_Comm_delete_attr_function) :: comm_delete_attr_fn
         integer, intent(out) :: comm_keyval
-        integer(MPI_ADDRESS_KinD), intent(in) :: extra_state
+        integer(MPI_ADDRESS_KIND), intent(in) :: extra_state
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Comm_create_keyval_f08
-end interface  MPI_Comm_create_keyval
+end interface MPI_Comm_create_keyval
 
-interface  MPI_Comm_delete_attr
+interface MPI_Comm_delete_attr
     subroutine MPI_Comm_delete_attr_f08(comm, comm_keyval, ierror)
         use :: mpi_f08_types, only : MPI_Comm
         implicit none
@@ -1411,9 +1418,9 @@ interface  MPI_Comm_delete_attr
         integer, intent(in) :: comm_keyval
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Comm_delete_attr_f08
-end interface  MPI_Comm_delete_attr
+end interface MPI_Comm_delete_attr
 
-interface  MPI_Comm_dup
+interface MPI_Comm_dup
     subroutine MPI_Comm_dup_f08(comm, newcomm, ierror)
         use :: mpi_f08_types, only : MPI_Comm
         implicit none
@@ -1421,9 +1428,9 @@ interface  MPI_Comm_dup
         type(MPI_Comm), intent(out) :: newcomm
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Comm_dup_f08
-end interface  MPI_Comm_dup
+end interface MPI_Comm_dup
 
-interface  MPI_Comm_dup_with_info
+interface MPI_Comm_dup_with_info
     subroutine MPI_Comm_dup_with_info_f08(comm, info, newcomm, ierror)
         use :: mpi_f08_types, only : MPI_Comm, MPI_Info
         implicit none
@@ -1432,9 +1439,9 @@ interface  MPI_Comm_dup_with_info
         type(MPI_Comm), intent(out) :: newcomm
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Comm_dup_with_info_f08
-end interface  MPI_Comm_dup_with_info
+end interface MPI_Comm_dup_with_info
 
-interface  MPI_Comm_idup
+interface MPI_Comm_idup
     subroutine MPI_Comm_idup_f08(comm, newcomm, request, ierror)
         use :: mpi_f08_types, only : MPI_Comm, MPI_Request
         implicit none
@@ -1443,51 +1450,51 @@ interface  MPI_Comm_idup
         type(MPI_Request), intent(out) :: request
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Comm_idup_f08
-end interface  MPI_Comm_idup
+end interface MPI_Comm_idup
 
-interface  MPI_Comm_free
+interface MPI_Comm_free
     subroutine MPI_Comm_free_f08(comm, ierror)
         use :: mpi_f08_types, only : MPI_Comm
         implicit none
         type(MPI_Comm), intent(inout) :: comm
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Comm_free_f08
-end interface  MPI_Comm_free
+end interface MPI_Comm_free
 
-interface  MPI_Comm_free_keyval
+interface MPI_Comm_free_keyval
     subroutine MPI_Comm_free_keyval_f08(comm_keyval, ierror)
         implicit none
         integer, intent(inout) :: comm_keyval
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Comm_free_keyval_f08
-end interface  MPI_Comm_free_keyval
+end interface MPI_Comm_free_keyval
 
-interface  MPI_Comm_get_attr
+interface MPI_Comm_get_attr
     subroutine MPI_Comm_get_attr_f08(comm, comm_keyval, attribute_val, flag, ierror)
         use :: mpi_f08_types, only : MPI_Comm
-        use :: mpi_f08_constants, only : MPI_ADDRESS_KinD
+        use :: mpi_f08_compile_constants, only : MPI_ADDRESS_KIND
         implicit none
         type(MPI_Comm), intent(in) :: comm
         integer, intent(in) :: comm_keyval
-        integer(MPI_ADDRESS_KinD), intent(out) :: attribute_val
-        LOGICAL, intent(out) :: flag
+        integer(MPI_ADDRESS_KIND), intent(out) :: attribute_val
+        logical, intent(out) :: flag
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Comm_get_attr_f08
-end interface  MPI_Comm_get_attr
+end interface MPI_Comm_get_attr
 
-interface  MPI_Comm_get_name
+interface MPI_Comm_get_name
     subroutine MPI_Comm_get_name_f08(comm, comm_name, resultlen, ierror)
         use :: mpi_f08_types, only : MPI_Comm
-        use :: mpi_f08_constants, only : MPI_MAX_OBJECT_NAME
+        use :: mpi_f08_compile_constants, only : MPI_MAX_OBJECT_NAME
         implicit none
         type(MPI_Comm), intent(in) :: comm
-        CHARACTER(LEN=MPI_MAX_OBJECT_NAME), intent(out) :: comm_name
+        character(len=MPI_MAX_OBJECT_NAME), intent(out) :: comm_name
         integer, intent(out) :: resultlen
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Comm_get_name_f08
-end interface  MPI_Comm_get_name
+end interface MPI_Comm_get_name
 
-interface  MPI_Comm_group
+interface MPI_Comm_group
     subroutine MPI_Comm_group_f08(comm, group, ierror)
         use :: mpi_f08_types, only : MPI_Comm, MPI_Group
         implicit none
@@ -1495,9 +1502,9 @@ interface  MPI_Comm_group
         type(MPI_Group), intent(out) :: group
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Comm_group_f08
-end interface  MPI_Comm_group
+end interface MPI_Comm_group
 
-interface  MPI_Comm_rank
+interface MPI_Comm_rank
     subroutine MPI_Comm_rank_f08(comm, rank, ierror)
         use :: mpi_f08_types, only : MPI_Comm
         implicit none
@@ -1505,9 +1512,9 @@ interface  MPI_Comm_rank
         integer, intent(out) :: rank
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Comm_rank_f08
-end interface  MPI_Comm_rank
+end interface MPI_Comm_rank
 
-interface  MPI_Comm_remote_group
+interface MPI_Comm_remote_group
     subroutine MPI_Comm_remote_group_f08(comm, group, ierror)
         use :: mpi_f08_types, only : MPI_Comm, MPI_Group
         implicit none
@@ -1515,9 +1522,9 @@ interface  MPI_Comm_remote_group
         type(MPI_Group), intent(out) :: group
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Comm_remote_group_f08
-end interface  MPI_Comm_remote_group
+end interface MPI_Comm_remote_group
 
-interface  MPI_Comm_remote_size
+interface MPI_Comm_remote_size
     subroutine MPI_Comm_remote_size_f08(comm, size, ierror)
         use :: mpi_f08_types, only : MPI_Comm
         implicit none
@@ -1525,31 +1532,31 @@ interface  MPI_Comm_remote_size
         integer, intent(out) :: size
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Comm_remote_size_f08
-end interface  MPI_Comm_remote_size
+end interface MPI_Comm_remote_size
 
-interface  MPI_Comm_set_attr
+interface MPI_Comm_set_attr
     subroutine MPI_Comm_set_attr_f08(comm, comm_keyval, attribute_val, ierror)
         use :: mpi_f08_types, only : MPI_Comm
-        use :: mpi_f08_constants, only : MPI_ADDRESS_KinD
+        use :: mpi_f08_compile_constants, only : MPI_ADDRESS_KIND
         implicit none
         type(MPI_Comm), intent(in) :: comm
         integer, intent(in) :: comm_keyval
-        integer(MPI_ADDRESS_KinD), intent(in) :: attribute_val
+        integer(MPI_ADDRESS_KIND), intent(in) :: attribute_val
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Comm_set_attr_f08
-end interface  MPI_Comm_set_attr
+end interface MPI_Comm_set_attr
 
-interface  MPI_Comm_set_name
+interface MPI_Comm_set_name
     subroutine MPI_Comm_set_name_f08(comm, comm_name, ierror)
         use :: mpi_f08_types, only : MPI_Comm
         implicit none
         type(MPI_Comm), intent(in) :: comm
-        CHARACTER(LEN=*), intent(in) :: comm_name
+        character(len=*), intent(in) :: comm_name
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Comm_set_name_f08
-end interface  MPI_Comm_set_name
+end interface MPI_Comm_set_name
 
-interface  MPI_Comm_size
+interface MPI_Comm_size
     subroutine MPI_Comm_size_f08(comm, size, ierror)
         use :: mpi_f08_types, only : MPI_Comm
         implicit none
@@ -1557,9 +1564,9 @@ interface  MPI_Comm_size
         integer, intent(out) :: size
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Comm_size_f08
-end interface  MPI_Comm_size
+end interface MPI_Comm_size
 
-interface  MPI_Comm_split
+interface MPI_Comm_split
     subroutine MPI_Comm_split_f08(comm, color, key, newcomm, ierror)
         use :: mpi_f08_types, only : MPI_Comm
         implicit none
@@ -1568,19 +1575,19 @@ interface  MPI_Comm_split
         type(MPI_Comm), intent(out) :: newcomm
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Comm_split_f08
-end interface  MPI_Comm_split
+end interface MPI_Comm_split
 
-interface  MPI_Comm_test_inter
+interface MPI_Comm_test_inter
     subroutine MPI_Comm_test_inter_f08(comm, flag, ierror)
         use :: mpi_f08_types, only : MPI_Comm
         implicit none
         type(MPI_Comm), intent(in) :: comm
-        LOGICAL, intent(out) :: flag
+        logical, intent(out) :: flag
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Comm_test_inter_f08
-end interface  MPI_Comm_test_inter
+end interface MPI_Comm_test_inter
 
-interface  MPI_Group_compare
+interface MPI_Group_compare
     subroutine MPI_Group_compare_f08(group1,group2,result, ierror)
         use :: mpi_f08_types, only : MPI_Group
         implicit none
@@ -1588,9 +1595,9 @@ interface  MPI_Group_compare
         integer, intent(out) :: result
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Group_compare_f08
-end interface  MPI_Group_compare
+end interface MPI_Group_compare
 
-interface  MPI_Group_difference
+interface MPI_Group_difference
     subroutine MPI_Group_difference_f08(group1,group2,newgroup, ierror)
         use :: mpi_f08_types, only : MPI_Group
         implicit none
@@ -1598,9 +1605,9 @@ interface  MPI_Group_difference
         type(MPI_Group), intent(out) :: newgroup
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Group_difference_f08
-end interface  MPI_Group_difference
+end interface MPI_Group_difference
 
-interface  MPI_Group_excl
+interface MPI_Group_excl
     subroutine MPI_Group_excl_f08(group, n,ranks, newgroup, ierror)
         use :: mpi_f08_types, only : MPI_Group
         implicit none
@@ -1609,18 +1616,18 @@ interface  MPI_Group_excl
         type(MPI_Group), intent(out) :: newgroup
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Group_excl_f08
-end interface  MPI_Group_excl
+end interface MPI_Group_excl
 
-interface  MPI_Group_free
+interface MPI_Group_free
     subroutine MPI_Group_free_f08(group, ierror)
         use :: mpi_f08_types, only : MPI_Group
         implicit none
         type(MPI_Group), intent(inout) :: group
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Group_free_f08
-end interface  MPI_Group_free
+end interface MPI_Group_free
 
-interface  MPI_Group_incl
+interface MPI_Group_incl
     subroutine MPI_Group_incl_f08(group, n,ranks, newgroup, ierror)
         use :: mpi_f08_types, only : MPI_Group
         implicit none
@@ -1629,9 +1636,9 @@ interface  MPI_Group_incl
         type(MPI_Group), intent(out) :: newgroup
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Group_incl_f08
-end interface  MPI_Group_incl
+end interface MPI_Group_incl
 
-interface  MPI_Group_intersection
+interface MPI_Group_intersection
     subroutine MPI_Group_intersection_f08(group1,group2,newgroup, ierror)
         use :: mpi_f08_types, only : MPI_Group
         implicit none
@@ -1639,9 +1646,9 @@ interface  MPI_Group_intersection
         type(MPI_Group), intent(out) :: newgroup
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Group_intersection_f08
-end interface  MPI_Group_intersection
+end interface MPI_Group_intersection
 
-interface  MPI_Group_range_excl
+interface MPI_Group_range_excl
     subroutine MPI_Group_range_excl_f08(group, n,ranges, newgroup, ierror)
         use :: mpi_f08_types, only : MPI_Group
         implicit none
@@ -1650,9 +1657,9 @@ interface  MPI_Group_range_excl
         type(MPI_Group), intent(out) :: newgroup
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Group_range_excl_f08
-end interface  MPI_Group_range_excl
+end interface MPI_Group_range_excl
 
-interface  MPI_Group_range_incl
+interface MPI_Group_range_incl
     subroutine MPI_Group_range_incl_f08(group, n,ranges, newgroup, ierror)
         use :: mpi_f08_types, only : MPI_Group
         implicit none
@@ -1661,9 +1668,9 @@ interface  MPI_Group_range_incl
         type(MPI_Group), intent(out) :: newgroup
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Group_range_incl_f08
-end interface  MPI_Group_range_incl
+end interface MPI_Group_range_incl
 
-interface  MPI_Group_rank
+interface MPI_Group_rank
     subroutine MPI_Group_rank_f08(group, rank, ierror)
         use :: mpi_f08_types, only : MPI_Group
         implicit none
@@ -1671,9 +1678,9 @@ interface  MPI_Group_rank
         integer, intent(out) :: rank
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Group_rank_f08
-end interface  MPI_Group_rank
+end interface MPI_Group_rank
 
-interface  MPI_Group_size
+interface MPI_Group_size
     subroutine MPI_Group_size_f08(group, size, ierror)
         use :: mpi_f08_types, only : MPI_Group
         implicit none
@@ -1681,9 +1688,9 @@ interface  MPI_Group_size
         integer, intent(out) :: size
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Group_size_f08
-end interface  MPI_Group_size
+end interface MPI_Group_size
 
-interface  MPI_Group_translate_ranks
+interface MPI_Group_translate_ranks
     subroutine MPI_Group_translate_ranks_f08(group1,n, ranks1,group2,ranks2,ierror)
         use :: mpi_f08_types, only : MPI_Group
         implicit none
@@ -1693,9 +1700,9 @@ interface  MPI_Group_translate_ranks
         integer, intent(out) :: ranks2(n)
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Group_translate_ranks_f08
-end interface  MPI_Group_translate_ranks
+end interface MPI_Group_translate_ranks
 
-interface  MPI_Group_union
+interface MPI_Group_union
     subroutine MPI_Group_union_f08(group1,group2,newgroup, ierror)
         use :: mpi_f08_types, only : MPI_Group
         implicit none
@@ -1703,9 +1710,9 @@ interface  MPI_Group_union
         type(MPI_Group), intent(out) :: newgroup
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Group_union_f08
-end interface  MPI_Group_union
+end interface MPI_Group_union
 
-interface  MPI_Intercomm_create
+interface MPI_Intercomm_create
     subroutine MPI_Intercomm_create_f08(local_comm, local_leader, peer_comm, remote_leader, &
                                          tag, newintercomm, ierror)
         use :: mpi_f08_types, only : MPI_Comm
@@ -1715,35 +1722,35 @@ interface  MPI_Intercomm_create
         type(MPI_Comm), intent(out) :: newintercomm
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Intercomm_create_f08
-end interface  MPI_Intercomm_create
+end interface MPI_Intercomm_create
 
-interface  MPI_Intercomm_merge
+interface MPI_Intercomm_merge
     subroutine MPI_Intercomm_merge_f08(intercomm, high, newintracomm, ierror)
         use :: mpi_f08_types, only : MPI_Comm
         implicit none
         type(MPI_Comm), intent(in) :: intercomm
-        LOGICAL, intent(in) :: high
+        logical, intent(in) :: high
         type(MPI_Comm), intent(out) :: newintracomm
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Intercomm_merge_f08
-end interface  MPI_Intercomm_merge
+end interface MPI_Intercomm_merge
 
-interface  MPI_Type_create_keyval
+interface MPI_Type_create_keyval
     subroutine MPI_Type_create_keyval_f08(type_copy_attr_fn, type_delete_attr_fn, type_keyval, &
                                            extra_state, ierror)
-        use :: mpi_f08_constants, only : MPI_ADDRESS_KinD
+        use :: mpi_f08_compile_constants, only : MPI_ADDRESS_KIND
         use :: mpi_f08_callbacks, only : MPI_Type_copy_attr_function
         use :: mpi_f08_callbacks, only : MPI_Type_delete_attr_function
         implicit none
-        PROCEDURE(MPI_Type_copy_attr_function) :: type_copy_attr_fn
-        PROCEDURE(MPI_Type_delete_attr_function) :: type_delete_attr_fn
+        procedure(MPI_Type_copy_attr_function) :: type_copy_attr_fn
+        procedure(MPI_Type_delete_attr_function) :: type_delete_attr_fn
         integer, intent(out) :: type_keyval
-        integer(MPI_ADDRESS_KinD), intent(in) :: extra_state
+        integer(MPI_ADDRESS_KIND), intent(in) :: extra_state
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Type_create_keyval_f08
-end interface  MPI_Type_create_keyval
+end interface MPI_Type_create_keyval
 
-interface  MPI_Type_delete_attr
+interface MPI_Type_delete_attr
     subroutine MPI_Type_delete_attr_f08(datatype, type_keyval, ierror)
         use :: mpi_f08_types, only : MPI_Datatype
         implicit none
@@ -1751,79 +1758,79 @@ interface  MPI_Type_delete_attr
         integer, intent(in) :: type_keyval
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Type_delete_attr_f08
-end interface  MPI_Type_delete_attr
+end interface MPI_Type_delete_attr
 
-interface  MPI_Type_free_keyval
+interface MPI_Type_free_keyval
     subroutine MPI_Type_free_keyval_f08(type_keyval, ierror)
         implicit none
         integer, intent(inout) :: type_keyval
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Type_free_keyval_f08
-end interface  MPI_Type_free_keyval
+end interface MPI_Type_free_keyval
 
-interface  MPI_Type_get_attr
+interface MPI_Type_get_attr
     subroutine MPI_Type_get_attr_f08(datatype, type_keyval, attribute_val, flag, ierror)
         use :: mpi_f08_types, only : MPI_Datatype
-        use :: mpi_f08_constants, only : MPI_ADDRESS_KinD
+        use :: mpi_f08_compile_constants, only : MPI_ADDRESS_KIND
         implicit none
         type(MPI_Datatype), intent(in) :: datatype
         integer, intent(in) :: type_keyval
-        integer(MPI_ADDRESS_KinD), intent(out) :: attribute_val
-        LOGICAL, intent(out) :: flag
+        integer(MPI_ADDRESS_KIND), intent(out) :: attribute_val
+        logical, intent(out) :: flag
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Type_get_attr_f08
-end interface  MPI_Type_get_attr
+end interface MPI_Type_get_attr
 
-interface  MPI_Type_get_name
+interface MPI_Type_get_name
     subroutine MPI_Type_get_name_f08(datatype, type_name, resultlen, ierror)
         use :: mpi_f08_types, only : MPI_Datatype
-        use :: mpi_f08_constants, only : MPI_MAX_OBJECT_NAME
+        use :: mpi_f08_compile_constants, only : MPI_MAX_OBJECT_NAME
         implicit none
         type(MPI_Datatype), intent(in) :: datatype
-        CHARACTER(LEN=MPI_MAX_OBJECT_NAME), intent(out) :: type_name
+        character(len=MPI_MAX_OBJECT_NAME), intent(out) :: type_name
         integer, intent(out) :: resultlen
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Type_get_name_f08
-end interface  MPI_Type_get_name
+end interface MPI_Type_get_name
 
-interface  MPI_Type_set_attr
+interface MPI_Type_set_attr
     subroutine MPI_Type_set_attr_f08(datatype, type_keyval, attribute_val, ierror)
         use :: mpi_f08_types, only : MPI_Datatype
-        use :: mpi_f08_constants, only : MPI_ADDRESS_KinD
+        use :: mpi_f08_compile_constants, only : MPI_ADDRESS_KIND
         implicit none
         type(MPI_Datatype), intent(in) :: datatype
         integer, intent(in) :: type_keyval
-        integer(MPI_ADDRESS_KinD), intent(in) :: attribute_val
+        integer(MPI_ADDRESS_KIND), intent(in) :: attribute_val
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Type_set_attr_f08
-end interface  MPI_Type_set_attr
+end interface MPI_Type_set_attr
 
-interface  MPI_Type_set_name
+interface MPI_Type_set_name
     subroutine MPI_Type_set_name_f08(datatype, type_name, ierror)
         use :: mpi_f08_types, only : MPI_Datatype
         implicit none
         type(MPI_Datatype), intent(in) :: datatype
-        CHARACTER(LEN=*), intent(in) :: type_name
+        character(len=*), intent(in) :: type_name
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Type_set_name_f08
-end interface  MPI_Type_set_name
+end interface MPI_Type_set_name
 
-interface  MPI_Win_create_keyval
+interface MPI_Win_create_keyval
     subroutine MPI_Win_create_keyval_f08(win_copy_attr_fn, win_delete_attr_fn, win_keyval, &
                                           extra_state, ierror)
-        use :: mpi_f08_constants, only : MPI_ADDRESS_KinD
+        use :: mpi_f08_compile_constants, only : MPI_ADDRESS_KIND
         use :: mpi_f08_callbacks, only : MPI_Win_copy_attr_function
         use :: mpi_f08_callbacks, only : MPI_Win_delete_attr_function
         implicit none
-        PROCEDURE(MPI_Win_copy_attr_function) :: win_copy_attr_fn
-        PROCEDURE(MPI_Win_delete_attr_function) :: win_delete_attr_fn
+        procedure(MPI_Win_copy_attr_function) :: win_copy_attr_fn
+        procedure(MPI_Win_delete_attr_function) :: win_delete_attr_fn
         integer, intent(out) :: win_keyval
-        integer(MPI_ADDRESS_KinD), intent(in) :: extra_state
+        integer(MPI_ADDRESS_KIND), intent(in) :: extra_state
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Win_create_keyval_f08
-end interface  MPI_Win_create_keyval
+end interface MPI_Win_create_keyval
 
-interface  MPI_Win_delete_attr
+interface MPI_Win_delete_attr
     subroutine MPI_Win_delete_attr_f08(win, win_keyval, ierror)
         use :: mpi_f08_types, only : MPI_Win
         implicit none
@@ -1831,64 +1838,64 @@ interface  MPI_Win_delete_attr
         integer, intent(in) :: win_keyval
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Win_delete_attr_f08
-end interface  MPI_Win_delete_attr
+end interface MPI_Win_delete_attr
 
-interface  MPI_Win_free_keyval
+interface MPI_Win_free_keyval
     subroutine MPI_Win_free_keyval_f08(win_keyval, ierror)
         implicit none
         integer, intent(inout) :: win_keyval
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Win_free_keyval_f08
-end interface  MPI_Win_free_keyval
+end interface MPI_Win_free_keyval
 
-interface  MPI_Win_get_attr
+interface MPI_Win_get_attr
     subroutine MPI_Win_get_attr_f08(win, win_keyval, attribute_val, flag, ierror)
         use :: mpi_f08_types, only : MPI_Win
-        use :: mpi_f08_constants, only : MPI_ADDRESS_KinD
+        use :: mpi_f08_compile_constants, only : MPI_ADDRESS_KIND
         implicit none
         type(MPI_Win), intent(in) :: win
         integer, intent(in) :: win_keyval
-        integer(MPI_ADDRESS_KinD), intent(out) :: attribute_val
-        LOGICAL, intent(out) :: flag
+        integer(MPI_ADDRESS_KIND), intent(out) :: attribute_val
+        logical, intent(out) :: flag
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Win_get_attr_f08
-end interface  MPI_Win_get_attr
+end interface MPI_Win_get_attr
 
-interface  MPI_Win_get_name
+interface MPI_Win_get_name
     subroutine MPI_Win_get_name_f08(win, win_name, resultlen, ierror)
         use :: mpi_f08_types, only : MPI_Win
-        use :: mpi_f08_constants, only : MPI_MAX_OBJECT_NAME
+        use :: mpi_f08_compile_constants, only : MPI_MAX_OBJECT_NAME
         implicit none
         type(MPI_Win), intent(in) :: win
-        CHARACTER(LEN=MPI_MAX_OBJECT_NAME), intent(out) :: win_name
+        character(len=MPI_MAX_OBJECT_NAME), intent(out) :: win_name
         integer, intent(out) :: resultlen
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Win_get_name_f08
-end interface  MPI_Win_get_name
+end interface MPI_Win_get_name
 
-interface  MPI_Win_set_attr
+interface MPI_Win_set_attr
     subroutine MPI_Win_set_attr_f08(win, win_keyval, attribute_val, ierror)
         use :: mpi_f08_types, only : MPI_Win
-        use :: mpi_f08_constants, only : MPI_ADDRESS_KinD
+        use :: mpi_f08_compile_constants, only : MPI_ADDRESS_KIND
         implicit none
         type(MPI_Win), intent(in) :: win
         integer, intent(in) :: win_keyval
-        integer(MPI_ADDRESS_KinD), intent(in) :: attribute_val
+        integer(MPI_ADDRESS_KIND), intent(in) :: attribute_val
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Win_set_attr_f08
-end interface  MPI_Win_set_attr
+end interface MPI_Win_set_attr
 
-interface  MPI_Win_set_name
+interface MPI_Win_set_name
     subroutine MPI_Win_set_name_f08(win, win_name, ierror)
         use :: mpi_f08_types, only : MPI_Win
         implicit none
         type(MPI_Win), intent(in) :: win
-        CHARACTER(LEN=*), intent(in) :: win_name
+        character(len=*), intent(in) :: win_name
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Win_set_name_f08
-end interface  MPI_Win_set_name
+end interface MPI_Win_set_name
 
-interface  MPI_Cartdim_get
+interface MPI_Cartdim_get
     subroutine MPI_Cartdim_get_f08(comm, ndims, ierror)
         use :: mpi_f08_types, only : MPI_Comm
         implicit none
@@ -1896,9 +1903,9 @@ interface  MPI_Cartdim_get
         integer, intent(out) :: ndims
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Cartdim_get_f08
-end interface  MPI_Cartdim_get
+end interface MPI_Cartdim_get
 
-interface  MPI_Cart_coords
+interface MPI_Cart_coords
     subroutine MPI_Cart_coords_f08(comm, rank, maxdims, coords, ierror)
         use :: mpi_f08_types, only : MPI_Comm
         implicit none
@@ -1907,45 +1914,45 @@ interface  MPI_Cart_coords
         integer, intent(out) :: coords(maxdims)
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Cart_coords_f08
-end interface  MPI_Cart_coords
+end interface MPI_Cart_coords
 
-interface  MPI_Cart_create
+interface MPI_Cart_create
     subroutine MPI_Cart_create_f08(comm_old, ndims, dims, periods, reorder, comm_cart, ierror)
         use :: mpi_f08_types, only : MPI_Comm
         implicit none
         type(MPI_Comm), intent(in) :: comm_old
         integer, intent(in) :: ndims, dims(ndims)
-        LOGICAL, intent(in) :: periods(ndims), reorder
+        logical, intent(in) :: periods(ndims), reorder
         type(MPI_Comm), intent(out) :: comm_cart
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Cart_create_f08
-end interface  MPI_Cart_create
+end interface MPI_Cart_create
 
-interface  MPI_Cart_get
+interface MPI_Cart_get
     subroutine MPI_Cart_get_f08(comm, maxdims, dims, periods, coords, ierror)
         use :: mpi_f08_types, only : MPI_Comm
         implicit none
         type(MPI_Comm), intent(in) :: comm
         integer, intent(in) :: maxdims
         integer, intent(out) :: dims(maxdims), coords(maxdims)
-        LOGICAL, intent(out) :: periods(maxdims)
+        logical, intent(out) :: periods(maxdims)
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Cart_get_f08
-end interface  MPI_Cart_get
+end interface MPI_Cart_get
 
-interface  MPI_Cart_map
+interface MPI_Cart_map
     subroutine MPI_Cart_map_f08(comm, ndims, dims, periods, newrank, ierror)
         use :: mpi_f08_types, only : MPI_Comm
         implicit none
         type(MPI_Comm), intent(in) :: comm
         integer, intent(in) :: ndims, dims(ndims)
-        LOGICAL, intent(in) :: periods(ndims)
+        logical, intent(in) :: periods(ndims)
         integer, intent(out) :: newrank
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Cart_map_f08
-end interface  MPI_Cart_map
+end interface MPI_Cart_map
 
-interface  MPI_Cart_rank
+interface MPI_Cart_rank
     subroutine MPI_Cart_rank_f08(comm, coords, rank, ierror)
         use :: mpi_f08_types, only : MPI_Comm
         implicit none
@@ -1954,9 +1961,9 @@ interface  MPI_Cart_rank
         integer, intent(out) :: rank
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Cart_rank_f08
-end interface  MPI_Cart_rank
+end interface MPI_Cart_rank
 
-interface  MPI_Cart_shift
+interface MPI_Cart_shift
     subroutine MPI_Cart_shift_f08(comm, direction, disp, rank_source, rank_dest, ierror)
         use :: mpi_f08_types, only : MPI_Comm
         implicit none
@@ -1965,29 +1972,29 @@ interface  MPI_Cart_shift
         integer, intent(out) :: rank_source, rank_dest
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Cart_shift_f08
-end interface  MPI_Cart_shift
+end interface MPI_Cart_shift
 
-interface  MPI_Cart_sub
+interface MPI_Cart_sub
     subroutine MPI_Cart_sub_f08(comm, remain_dims, newcomm, ierror)
         use :: mpi_f08_types, only : MPI_Comm
         implicit none
         type(MPI_Comm), intent(in) :: comm
-        LOGICAL, intent(in) :: remain_dims(*)
+        logical, intent(in) :: remain_dims(*)
         type(MPI_Comm), intent(out) :: newcomm
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Cart_sub_f08
-end interface  MPI_Cart_sub
+end interface MPI_Cart_sub
 
-interface  MPI_Dims_create
+interface MPI_Dims_create
     subroutine MPI_Dims_create_f08(nnodes, ndims, dims, ierror)
         implicit none
         integer, intent(in) :: nnodes, ndims
         integer, intent(inout) :: dims(ndims)
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Dims_create_f08
-end interface  MPI_Dims_create
+end interface MPI_Dims_create
 
-interface  MPI_Dist_graph_create
+interface MPI_Dist_graph_create
     subroutine MPI_Dist_graph_create_f08(comm_old, n,sources, degrees, destinations, weights, &
                                           info, reorder, comm_dist_graph, ierror)
         use :: mpi_f08_types, only : MPI_Comm, MPI_Info
@@ -1995,29 +2002,33 @@ interface  MPI_Dist_graph_create
         type(MPI_Comm), intent(in) :: comm_old
         integer, intent(in) :: n, sources(n), degrees(n), destinations(*), weights(*)
         type(MPI_Info), intent(in) :: info
-        LOGICAL, intent(in) :: reorder
+        logical, intent(in) :: reorder
         type(MPI_Comm), intent(out) :: comm_dist_graph
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Dist_graph_create_f08
-end interface  MPI_Dist_graph_create
+end interface MPI_Dist_graph_create
 
-interface  MPI_Dist_graph_create_adjacent
+interface MPI_Dist_graph_create_adjacent
     subroutine MPI_Dist_graph_create_adjacent_f08(comm_old, indegree, sources, sourceweights, &
                                                    outdegree, destinations, destweights, info, reorder, &
                                                    comm_dist_graph, ierror)
         use :: mpi_f08_types, only : MPI_Comm, MPI_Info
         implicit none
         type(MPI_Comm), intent(in) :: comm_old
-        integer, intent(in) :: indegree, sources(indegree), outdegree, destinations(outdegree)
-        integer, intent(in) :: sourceweights(indegree), destweights(outdegree)
+        integer, intent(in) :: indegree
+        integer, intent(in) :: sources(indegree)
+        integer, intent(in) :: sourceweights(indegree)
+        integer, intent(in) :: outdegree
+        integer, intent(in) :: destinations(outdegree)
+        integer, intent(in) :: destweights(outdegree)
         type(MPI_Info), intent(in) :: info
-        LOGICAL, intent(in) :: reorder
+        logical, intent(in) :: reorder
         type(MPI_Comm), intent(out) :: comm_dist_graph
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Dist_graph_create_adjacent_f08
-end interface  MPI_Dist_graph_create_adjacent
+end interface MPI_Dist_graph_create_adjacent
 
-interface  MPI_Dist_graph_neighbors
+interface MPI_Dist_graph_neighbors
     subroutine MPI_Dist_graph_neighbors_f08(comm, maxindegree, sources, sourceweights, &
                                              maxoutdegree, destinations, destweights, ierror)
         use :: mpi_f08_types, only : MPI_Comm
@@ -2028,20 +2039,20 @@ interface  MPI_Dist_graph_neighbors
         integer, intent(out) :: sourceweights(maxindegree), destweights(maxoutdegree)
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Dist_graph_neighbors_f08
-end interface  MPI_Dist_graph_neighbors
+end interface MPI_Dist_graph_neighbors
 
-interface  MPI_Dist_graph_neighbors_count
+interface MPI_Dist_graph_neighbors_count
     subroutine MPI_Dist_graph_neighbors_count_f08(comm, indegree, outdegree, weighted, ierror)
         use :: mpi_f08_types, only : MPI_Comm
         implicit none
         type(MPI_Comm), intent(in) :: comm
         integer, intent(out) :: indegree, outdegree
-        LOGICAL, intent(out) :: weighted
+        logical, intent(out) :: weighted
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Dist_graph_neighbors_count_f08
-end interface  MPI_Dist_graph_neighbors_count
+end interface MPI_Dist_graph_neighbors_count
 
-interface  MPI_Graphdims_get
+interface MPI_Graphdims_get
     subroutine MPI_Graphdims_get_f08(comm, nnodes, nedges, ierror)
         use :: mpi_f08_types, only : MPI_Comm
         implicit none
@@ -2049,22 +2060,22 @@ interface  MPI_Graphdims_get
         integer, intent(out) :: nnodes, nedges
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Graphdims_get_f08
-end interface  MPI_Graphdims_get
+end interface MPI_Graphdims_get
 
-interface  MPI_Graph_create
+interface MPI_Graph_create
     subroutine MPI_Graph_create_f08(comm_old, nnodes, index, edges, reorder, comm_graph, &
                                      ierror)
         use :: mpi_f08_types, only : MPI_Comm
         implicit none
         type(MPI_Comm), intent(in) :: comm_old
         integer, intent(in) :: nnodes, index(nnodes), edges(*)
-        LOGICAL, intent(in) :: reorder
+        logical, intent(in) :: reorder
         type(MPI_Comm), intent(out) :: comm_graph
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Graph_create_f08
-end interface  MPI_Graph_create
+end interface MPI_Graph_create
 
-interface  MPI_Graph_get
+interface MPI_Graph_get
     subroutine MPI_Graph_get_f08(comm, maxindex, maxedges, index, edges, ierror)
         use :: mpi_f08_types, only : MPI_Comm
         implicit none
@@ -2073,9 +2084,9 @@ interface  MPI_Graph_get
         integer, intent(out) :: index(maxindex), edges(maxedges)
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Graph_get_f08
-end interface  MPI_Graph_get
+end interface MPI_Graph_get
 
-interface  MPI_Graph_map
+interface MPI_Graph_map
     subroutine MPI_Graph_map_f08(comm, nnodes, index, edges, newrank, ierror)
         use :: mpi_f08_types, only : MPI_Comm
         implicit none
@@ -2084,9 +2095,9 @@ interface  MPI_Graph_map
         integer, intent(out) :: newrank
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Graph_map_f08
-end interface  MPI_Graph_map
+end interface MPI_Graph_map
 
-interface  MPI_Graph_neighbors
+interface MPI_Graph_neighbors
     subroutine MPI_Graph_neighbors_f08(comm, rank, maxneighbors, neighbors, ierror)
         use :: mpi_f08_types, only : MPI_Comm
         implicit none
@@ -2095,9 +2106,9 @@ interface  MPI_Graph_neighbors
         integer, intent(out) :: neighbors(maxneighbors)
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Graph_neighbors_f08
-end interface  MPI_Graph_neighbors
+end interface MPI_Graph_neighbors
 
-interface  MPI_Graph_neighbors_count
+interface MPI_Graph_neighbors_count
     subroutine MPI_Graph_neighbors_count_f08(comm, rank, nneighbors, ierror)
         use :: mpi_f08_types, only : MPI_Comm
         implicit none
@@ -2106,9 +2117,9 @@ interface  MPI_Graph_neighbors_count
         integer, intent(out) :: nneighbors
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Graph_neighbors_count_f08
-end interface  MPI_Graph_neighbors_count
+end interface MPI_Graph_neighbors_count
 
-interface  MPI_Topo_test
+interface MPI_Topo_test
     subroutine MPI_Topo_test_f08(comm, status, ierror)
         use :: mpi_f08_types, only : MPI_Comm, MPI_Status
         implicit none
@@ -2116,25 +2127,9 @@ interface  MPI_Topo_test
         integer, intent(out) :: status
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Topo_test_f08
-end interface  MPI_Topo_test
-
-interface MPI_Wtick
-function  MPI_Wtick_f08( ) BinD(C, name="MPI_Wtick")
-        use, intrinsic :: ISO_C_BinDinG
-        implicit none
-        DOUBLE PRECISION :: MPI_Wtick_f08
-end function MPI_Wtick_f08
-end interface MPI_Wtick
+end interface MPI_Topo_test
 
-interface MPI_Wtime
-function  MPI_Wtime_f08( ) BinD(C, name="MPI_Wtime")
-        use, intrinsic :: ISO_C_BinDinG
-        implicit none
-        DOUBLE PRECISION :: MPI_Wtime_f08
-end function MPI_Wtime_f08
-end interface MPI_Wtime
-
-interface  MPI_Abort
+interface MPI_Abort
     subroutine MPI_Abort_f08(comm, errorcode, ierror)
         use :: mpi_f08_types, only : MPI_Comm
         implicit none
@@ -2142,48 +2137,48 @@ interface  MPI_Abort
         integer, intent(in) :: errorcode
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Abort_f08
-end interface  MPI_Abort
+end interface MPI_Abort
 
-interface  MPI_Add_error_class
+interface MPI_Add_error_class
     subroutine MPI_Add_error_class_f08(errorclass, ierror)
         implicit none
         integer, intent(out) :: errorclass
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Add_error_class_f08
-end interface  MPI_Add_error_class
+end interface MPI_Add_error_class
 
-interface  MPI_Add_error_code
+interface MPI_Add_error_code
     subroutine MPI_Add_error_code_f08(errorclass, errorcode, ierror)
         implicit none
         integer, intent(in) :: errorclass
         integer, intent(out) :: errorcode
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Add_error_code_f08
-end interface  MPI_Add_error_code
+end interface MPI_Add_error_code
 
-interface  MPI_Add_error_string
+interface MPI_Add_error_string
     subroutine MPI_Add_error_string_f08(errorcode, string, ierror)
         implicit none
         integer, intent(in) :: errorcode
         character(len=*), intent(in) :: string
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Add_error_string_f08
-end interface  MPI_Add_error_string
+end interface MPI_Add_error_string
 
-interface  MPI_Alloc_mem
+interface MPI_Alloc_mem
     subroutine MPI_Alloc_mem_f08(size, info, baseptr, ierror)
-        use, intrinsic :: ISO_C_BinDinG, only : C_PTR
+        use, intrinsic :: iso_c_binding, only : c_ptr
         use :: mpi_f08_types, only : MPI_Info
-        use :: mpi_f08_constants, only : MPI_ADDRESS_KinD
+        use :: mpi_f08_compile_constants, only : MPI_ADDRESS_KIND
         implicit none
-        integer(MPI_ADDRESS_KinD), intent(in) :: size
+        integer(MPI_ADDRESS_KIND), intent(in) :: size
         type(MPI_Info), intent(in) :: info
-        type(C_PTR), intent(out) :: baseptr
+        type(c_ptr), intent(out) :: baseptr
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Alloc_mem_f08
-end interface  MPI_Alloc_mem
+end interface MPI_Alloc_mem
 
-interface  MPI_Comm_call_errhandler
+interface MPI_Comm_call_errhandler
     subroutine MPI_Comm_call_errhandler_f08(comm, errorcode, ierror)
         use :: mpi_f08_types, only : MPI_Comm
         implicit none
@@ -2191,20 +2186,20 @@ interface  MPI_Comm_call_errhandler
         integer, intent(in) :: errorcode
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Comm_call_errhandler_f08
-end interface  MPI_Comm_call_errhandler
+end interface MPI_Comm_call_errhandler
 
-interface  MPI_Comm_create_errhandler
+interface MPI_Comm_create_errhandler
     subroutine MPI_Comm_create_errhandler_f08(comm_errhandler_fn, errhandler, ierror)
         use :: mpi_f08_types, only : MPI_Errhandler
         use :: mpi_f08_callbacks, only : MPI_Comm_errhandler_function
         implicit none
-        PROCEDURE(MPI_Comm_errhandler_function) :: comm_errhandler_fn
+        procedure(MPI_Comm_errhandler_function) :: comm_errhandler_fn
         type(MPI_Errhandler), intent(out) :: errhandler
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Comm_create_errhandler_f08
-end interface  MPI_Comm_create_errhandler
+end interface MPI_Comm_create_errhandler
 
-interface  MPI_Comm_get_errhandler
+interface MPI_Comm_get_errhandler
     subroutine MPI_Comm_get_errhandler_f08(comm, errhandler, ierror)
         use :: mpi_f08_types, only : MPI_Comm, MPI_Errhandler
         implicit none
@@ -2212,9 +2207,9 @@ interface  MPI_Comm_get_errhandler
         type(MPI_Errhandler), intent(out) :: errhandler
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Comm_get_errhandler_f08
-end interface  MPI_Comm_get_errhandler
+end interface MPI_Comm_get_errhandler
 
-interface  MPI_Comm_set_errhandler
+interface MPI_Comm_set_errhandler
     subroutine MPI_Comm_set_errhandler_f08(comm, errhandler, ierror)
         use :: mpi_f08_types, only : MPI_Comm, MPI_Errhandler
         implicit none
@@ -2222,38 +2217,38 @@ interface  MPI_Comm_set_errhandler
         type(MPI_Errhandler), intent(in) :: errhandler
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Comm_set_errhandler_f08
-end interface  MPI_Comm_set_errhandler
+end interface MPI_Comm_set_errhandler
 
-interface  MPI_Errhandler_free
+interface MPI_Errhandler_free
     subroutine MPI_Errhandler_free_f08(errhandler, ierror)
         use :: mpi_f08_types, only : MPI_Errhandler
         implicit none
         type(MPI_Errhandler), intent(inout) :: errhandler
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Errhandler_free_f08
-end interface  MPI_Errhandler_free
+end interface MPI_Errhandler_free
 
-interface  MPI_Error_class
+interface MPI_Error_class
     subroutine MPI_Error_class_f08(errorcode, errorclass, ierror)
         implicit none
         integer, intent(in) :: errorcode
         integer, intent(out) :: errorclass
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Error_class_f08
-end interface  MPI_Error_class
+end interface MPI_Error_class
 
-interface  MPI_Error_string
+interface MPI_Error_string
     subroutine MPI_Error_string_f08(errorcode, string, resultlen, ierror)
-        use :: mpi_f08_constants, only : MPI_MAX_ERROR_STRinG
+        use :: mpi_f08_compile_constants, only : MPI_MAX_ERROR_STRING
         implicit none
         integer, intent(in) :: errorcode
-        character(len=MPI_MAX_ERROR_STRinG), intent(out) :: string
+        character(len=MPI_MAX_ERROR_STRING), intent(out) :: string
         integer, intent(out) :: resultlen
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Error_string_f08
-end interface  MPI_Error_string
+end interface MPI_Error_string
 
-interface  MPI_File_call_errhandler
+interface MPI_File_call_errhandler
     subroutine MPI_File_call_errhandler_f08(fh, errorcode, ierror)
         use :: mpi_f08_types, only : MPI_File
         implicit none
@@ -2261,20 +2256,20 @@ interface  MPI_File_call_errhandler
         integer, intent(in) :: errorcode
         integer, optional, intent(out) :: ierror
     end subroutine MPI_File_call_errhandler_f08
-end interface  MPI_File_call_errhandler
+end interface MPI_File_call_errhandler
 
-interface  MPI_File_create_errhandler
+interface MPI_File_create_errhandler
     subroutine MPI_File_create_errhandler_f08(file_errhandler_fn, errhandler, ierror)
         use :: mpi_f08_types, only : MPI_Errhandler
         use :: mpi_f08_callbacks, only : MPI_File_errhandler_function
         implicit none
-        PROCEDURE(MPI_File_errhandler_function) :: file_errhandler_fn
+        procedure(MPI_File_errhandler_function) :: file_errhandler_fn
         type(MPI_Errhandler), intent(out) :: errhandler
         integer, optional, intent(out) :: ierror
     end subroutine MPI_File_create_errhandler_f08
-end interface  MPI_File_create_errhandler
+end interface MPI_File_create_errhandler
 
-interface  MPI_File_get_errhandler
+interface MPI_File_get_errhandler
     subroutine MPI_File_get_errhandler_f08(file, errhandler, ierror)
         use :: mpi_f08_types, only : MPI_File, MPI_Errhandler
         implicit none
@@ -2282,9 +2277,9 @@ interface  MPI_File_get_errhandler
         type(MPI_Errhandler), intent(out) :: errhandler
         integer, optional, intent(out) :: ierror
     end subroutine MPI_File_get_errhandler_f08
-end interface  MPI_File_get_errhandler
+end interface MPI_File_get_errhandler
 
-interface  MPI_File_set_errhandler
+interface MPI_File_set_errhandler
     subroutine MPI_File_set_errhandler_f08(file, errhandler, ierror)
         use :: mpi_f08_types, only : MPI_File, MPI_Errhandler
         implicit none
@@ -2292,66 +2287,65 @@ interface  MPI_File_set_errhandler
         type(MPI_Errhandler), intent(in) :: errhandler
         integer, optional, intent(out) :: ierror
     end subroutine MPI_File_set_errhandler_f08
-end interface  MPI_File_set_errhandler
+end interface MPI_File_set_errhandler
 
-interface  MPI_Finalize
+interface MPI_Finalize
     subroutine MPI_Finalize_f08(ierror)
         implicit none
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Finalize_f08
-end interface  MPI_Finalize
+end interface MPI_Finalize
 
-interface  MPI_Finalized
+interface MPI_Finalized
     subroutine MPI_Finalized_f08(flag, ierror)
         implicit none
-        LOGICAL, intent(out) :: flag
+        logical, intent(out) :: flag
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Finalized_f08
-end interface  MPI_Finalized
+end interface MPI_Finalized
 
-interface  MPI_Free_mem
+interface MPI_Free_mem
     subroutine MPI_Free_mem_f08(base, ierror)
-        use :: mpi_f08_constants, only : MPI_ADDRESS_KinD
         implicit none
-        integer(MPI_ADDRESS_KinD), dimension(*) :: base
+        type(*), dimension(..), intent(in), asynchronous :: base
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Free_mem_f08
-end interface  MPI_Free_mem
+end interface MPI_Free_mem
 
-interface  MPI_Get_processor_name
+interface MPI_Get_processor_name
     subroutine MPI_Get_processor_name_f08(name, resultlen, ierror)
-        use :: mpi_f08_constants, only : MPI_MAX_PROCESSOR_NAME
+        use :: mpi_f08_compile_constants, only : MPI_MAX_PROCESSOR_NAME
         implicit none
         character(len=MPI_MAX_PROCESSOR_NAME), intent(out) :: name
         integer, intent(out) :: resultlen
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Get_processor_name_f08
-end interface  MPI_Get_processor_name
+end interface MPI_Get_processor_name
 
-interface  MPI_Get_version
+interface MPI_Get_version
     subroutine MPI_Get_version_f08(version, subversion, ierror)
         implicit none
         integer, intent(out) :: version, subversion
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Get_version_f08
-end interface  MPI_Get_version
+end interface MPI_Get_version
 
-interface  MPI_Init
+interface MPI_Init
     subroutine MPI_Init_f08(ierror)
         implicit none
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Init_f08
-end interface  MPI_Init
+end interface MPI_Init
 
-interface  MPI_Initialized
+interface MPI_Initialized
     subroutine MPI_Initialized_f08(flag, ierror)
         implicit none
-        LOGICAL, intent(out) :: flag
+        logical, intent(out) :: flag
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Initialized_f08
-end interface  MPI_Initialized
+end interface MPI_Initialized
 
-interface  MPI_Win_call_errhandler
+interface MPI_Win_call_errhandler
     subroutine MPI_Win_call_errhandler_f08(win, errorcode, ierror)
         use :: mpi_f08_types, only : MPI_Win
         implicit none
@@ -2359,20 +2353,20 @@ interface  MPI_Win_call_errhandler
         integer, intent(in) :: errorcode
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Win_call_errhandler_f08
-end interface  MPI_Win_call_errhandler
+end interface MPI_Win_call_errhandler
 
-interface  MPI_Win_create_errhandler
+interface MPI_Win_create_errhandler
     subroutine MPI_Win_create_errhandler_f08(win_errhandler_fn, errhandler, ierror)
         use :: mpi_f08_types, only : MPI_Errhandler
         use :: mpi_f08_callbacks, only : MPI_Win_errhandler_function
         implicit none
-        PROCEDURE(MPI_Win_errhandler_function) :: win_errhandler_fn
+        procedure(MPI_Win_errhandler_function) :: win_errhandler_fn
         type(MPI_Errhandler), intent(out) :: errhandler
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Win_create_errhandler_f08
-end interface  MPI_Win_create_errhandler
+end interface MPI_Win_create_errhandler
 
-interface  MPI_Win_get_errhandler
+interface MPI_Win_get_errhandler
     subroutine MPI_Win_get_errhandler_f08(win, errhandler, ierror)
         use :: mpi_f08_types, only : MPI_Win, MPI_Errhandler
         implicit none
@@ -2380,9 +2374,9 @@ interface  MPI_Win_get_errhandler
         type(MPI_Errhandler), intent(out) :: errhandler
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Win_get_errhandler_f08
-end interface  MPI_Win_get_errhandler
+end interface MPI_Win_get_errhandler
 
-interface  MPI_Win_set_errhandler
+interface MPI_Win_set_errhandler
     subroutine MPI_Win_set_errhandler_f08(win, errhandler, ierror)
         use :: mpi_f08_types, only : MPI_Win, MPI_Errhandler
         implicit none
@@ -2390,28 +2384,28 @@ interface  MPI_Win_set_errhandler
         type(MPI_Errhandler), intent(in) :: errhandler
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Win_set_errhandler_f08
-end interface  MPI_Win_set_errhandler
+end interface MPI_Win_set_errhandler
 
-interface  MPI_Info_create
+interface MPI_Info_create
     subroutine MPI_Info_create_f08(info, ierror)
         use :: mpi_f08_types, only : MPI_Info
         implicit none
         type(MPI_Info), intent(out) :: info
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Info_create_f08
-end interface  MPI_Info_create
+end interface MPI_Info_create
 
-interface  MPI_Info_delete
+interface MPI_Info_delete
     subroutine MPI_Info_delete_f08(info, key, ierror)
         use :: mpi_f08_types, only : MPI_Info
         implicit none
         type(MPI_Info), intent(in) :: info
-        CHARACTER(LEN=*), intent(in) :: key
+        character(len=*), intent(in) :: key
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Info_delete_f08
-end interface  MPI_Info_delete
+end interface MPI_Info_delete
 
-interface  MPI_Info_dup
+interface MPI_Info_dup
     subroutine MPI_Info_dup_f08(info, newinfo, ierror)
         use :: mpi_f08_types, only : MPI_Info
         implicit none
@@ -2419,31 +2413,31 @@ interface  MPI_Info_dup
         type(MPI_Info), intent(out) :: newinfo
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Info_dup_f08
-end interface  MPI_Info_dup
+end interface MPI_Info_dup
 
-interface  MPI_Info_free
+interface MPI_Info_free
     subroutine MPI_Info_free_f08(info, ierror)
         use :: mpi_f08_types, only : MPI_Info
         implicit none
         type(MPI_Info), intent(inout) :: info
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Info_free_f08
-end interface  MPI_Info_free
+end interface MPI_Info_free
 
-interface  MPI_Info_get
+interface MPI_Info_get
     subroutine MPI_Info_get_f08(info, key, valuelen, value, flag, ierror)
         use :: mpi_f08_types, only : MPI_Info
         implicit none
         type(MPI_Info), intent(in) :: info
-        CHARACTER(LEN=*), intent(in) :: key
+        character(len=*), intent(in) :: key
         integer, intent(in) :: valuelen
-        CHARACTER(LEN=valuelen), intent(out) :: value
-        LOGICAL, intent(out) :: flag
+        character(len=valuelen), intent(out) :: value
+        logical, intent(out) :: flag
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Info_get_f08
-end interface  MPI_Info_get
+end interface MPI_Info_get
 
-interface  MPI_Info_get_nkeys
+interface MPI_Info_get_nkeys
     subroutine MPI_Info_get_nkeys_f08(info, nkeys, ierror)
         use :: mpi_f08_types, only : MPI_Info
         implicit none
@@ -2451,94 +2445,94 @@ interface  MPI_Info_get_nkeys
         integer, intent(out) :: nkeys
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Info_get_nkeys_f08
-end interface  MPI_Info_get_nkeys
+end interface MPI_Info_get_nkeys
 
-interface  MPI_Info_get_nthkey
+interface MPI_Info_get_nthkey
     subroutine MPI_Info_get_nthkey_f08(info, n,key, ierror)
         use :: mpi_f08_types, only : MPI_Info
         implicit none
         type(MPI_Info), intent(in) :: info
         integer, intent(in) :: n
-        CHARACTER(lEN=*), intent(out) :: key
+        character(len=*), intent(out) :: key
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Info_get_nthkey_f08
-end interface  MPI_Info_get_nthkey
+end interface MPI_Info_get_nthkey
 
-interface  MPI_Info_get_valuelen
+interface MPI_Info_get_valuelen
     subroutine MPI_Info_get_valuelen_f08(info, key, valuelen, flag, ierror)
         use :: mpi_f08_types, only : MPI_Info
         implicit none
         type(MPI_Info), intent(in) :: info
-        CHARACTER(LEN=*), intent(in) :: key
+        character(len=*), intent(in) :: key
         integer, intent(out) :: valuelen
-        LOGICAL, intent(out) :: flag
+        logical, intent(out) :: flag
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Info_get_valuelen_f08
-end interface  MPI_Info_get_valuelen
+end interface MPI_Info_get_valuelen
 
-interface  MPI_Info_set
+interface MPI_Info_set
     subroutine MPI_Info_set_f08(info, key, value, ierror)
         use :: mpi_f08_types, only : MPI_Info
         implicit none
         type(MPI_Info), intent(in) :: info
-        CHARACTER(LEN=*), intent(in) :: key, value
+        character(len=*), intent(in) :: key, value
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Info_set_f08
-end interface  MPI_Info_set
+end interface MPI_Info_set
 
-interface  MPI_Close_port
+interface MPI_Close_port
     subroutine MPI_Close_port_f08(port_name, ierror)
         implicit none
-        CHARACTER(LEN=*), intent(in) :: port_name
+        character(len=*), intent(in) :: port_name
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Close_port_f08
-end interface  MPI_Close_port
+end interface MPI_Close_port
 
-interface  MPI_Comm_accept
+interface MPI_Comm_accept
     subroutine MPI_Comm_accept_f08(port_name, info, root, comm, newcomm, ierror)
         use :: mpi_f08_types, only : MPI_Info, MPI_Comm
         implicit none
-        CHARACTER(LEN=*), intent(in) :: port_name
+        character(len=*), intent(in) :: port_name
         type(MPI_Info), intent(in) :: info
         integer, intent(in) :: root
         type(MPI_Comm), intent(in) :: comm
         type(MPI_Comm), intent(out) :: newcomm
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Comm_accept_f08
-end interface  MPI_Comm_accept
+end interface MPI_Comm_accept
 
-interface  MPI_Comm_connect
+interface MPI_Comm_connect
     subroutine MPI_Comm_connect_f08(port_name, info, root, comm, newcomm, ierror)
         use :: mpi_f08_types, only : MPI_Info, MPI_Comm
         implicit none
-        CHARACTER(LEN=*), intent(in) :: port_name
+        character(len=*), intent(in) :: port_name
         type(MPI_Info), intent(in) :: info
         integer, intent(in) :: root
         type(MPI_Comm), intent(in) :: comm
         type(MPI_Comm), intent(out) :: newcomm
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Comm_connect_f08
-end interface  MPI_Comm_connect
+end interface MPI_Comm_connect
 
-interface  MPI_Comm_disconnect
+interface MPI_Comm_disconnect
     subroutine MPI_Comm_disconnect_f08(comm, ierror)
         use :: mpi_f08_types, only : MPI_Comm
         implicit none
         type(MPI_Comm), intent(inout) :: comm
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Comm_disconnect_f08
-end interface  MPI_Comm_disconnect
+end interface MPI_Comm_disconnect
 
-interface  MPI_Comm_get_parent
+interface MPI_Comm_get_parent
     subroutine MPI_Comm_get_parent_f08(parent, ierror)
         use :: mpi_f08_types, only : MPI_Comm
         implicit none
         type(MPI_Comm), intent(out) :: parent
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Comm_get_parent_f08
-end interface  MPI_Comm_get_parent
+end interface MPI_Comm_get_parent
 
-interface  MPI_Comm_join
+interface MPI_Comm_join
     subroutine MPI_Comm_join_f08(fd, intercomm, ierror)
         use :: mpi_f08_types, only : MPI_Comm
         implicit none
@@ -2546,14 +2540,14 @@ interface  MPI_Comm_join
         type(MPI_Comm), intent(out) :: intercomm
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Comm_join_f08
-end interface  MPI_Comm_join
+end interface MPI_Comm_join
 
-interface  MPI_Comm_spawn
+interface MPI_Comm_spawn
     subroutine MPI_Comm_spawn_f08(command, argv, maxprocs, info, root, comm, intercomm, &
                                    array_of_errcodes, ierror)
         use :: mpi_f08_types, only : MPI_Info, MPI_Comm
         implicit none
-        CHARACTER(LEN=*), intent(in) :: command, argv(*)
+        character(len=*), intent(in) :: command, argv(*)
         integer, intent(in) :: maxprocs, root
         type(MPI_Info), intent(in) :: info
         type(MPI_Comm), intent(in) :: comm
@@ -2561,142 +2555,142 @@ interface  MPI_Comm_spawn
         integer :: array_of_errcodes(*)
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Comm_spawn_f08
-end interface  MPI_Comm_spawn
+end interface MPI_Comm_spawn
 
-interface  MPI_Comm_spawn_multiple
+interface MPI_Comm_spawn_multiple
     subroutine MPI_Comm_spawn_multiple_f08(count, array_of_commands, array_of_argv, array_of_maxprocs, &
-                                            array_of_info, root, comm, intercomm, &
-                                            array_of_errcodes, ierror)
+                                    array_of_info, root, comm, intercomm, array_of_errcodes, ierror)
         use :: mpi_f08_types, only : MPI_Info, MPI_Comm
         implicit none
-        integer, intent(in) :: count, array_of_maxprocs(*), root
-        CHARACTER(LEN=*), intent(in) :: array_of_commands(*), array_of_argv(count,*)
+        integer, intent(in) :: count
+        character(len=*), intent(in) :: array_of_commands(*), array_of_argv(count,*)
+        integer, intent(in) :: array_of_maxprocs(*)
         type(MPI_Info), intent(in) :: array_of_info(*)
+        integer, intent(in) :: root
         type(MPI_Comm), intent(in) :: comm
         type(MPI_Comm), intent(out) :: intercomm
         integer :: array_of_errcodes(*)
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Comm_spawn_multiple_f08
-end interface  MPI_Comm_spawn_multiple
+end interface MPI_Comm_spawn_multiple
 
-interface  MPI_Lookup_name
+interface MPI_Lookup_name
     subroutine MPI_Lookup_name_f08(service_name, info, port_name, ierror)
         use :: mpi_f08_types, only : MPI_Info
-        use :: mpi_f08_constants, only : MPI_MAX_PORT_NAME
+        use :: mpi_f08_compile_constants, only : MPI_MAX_PORT_NAME
         implicit none
-        CHARACTER(LEN=*), intent(in) :: service_name
+        character(len=*), intent(in) :: service_name
         type(MPI_Info), intent(in) :: info
-        CHARACTER(LEN=MPI_MAX_PORT_NAME), intent(out) :: port_name
+        character(len=MPI_MAX_PORT_NAME), intent(out) :: port_name
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Lookup_name_f08
-end interface  MPI_Lookup_name
+end interface MPI_Lookup_name
 
-interface  MPI_Open_port
+interface MPI_Open_port
     subroutine MPI_Open_port_f08(info, port_name, ierror)
         use :: mpi_f08_types, only : MPI_Info
-        use :: mpi_f08_constants, only : MPI_MAX_PORT_NAME
+        use :: mpi_f08_compile_constants, only : MPI_MAX_PORT_NAME
         implicit none
         type(MPI_Info), intent(in) :: info
-        CHARACTER(LEN=MPI_MAX_PORT_NAME), intent(out) :: port_name
+        character(len=MPI_MAX_PORT_NAME), intent(out) :: port_name
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Open_port_f08
-end interface  MPI_Open_port
+end interface MPI_Open_port
 
-interface  MPI_Publish_name
+interface MPI_Publish_name
     subroutine MPI_Publish_name_f08(service_name, info, port_name, ierror)
         use :: mpi_f08_types, only : MPI_Info
         implicit none
         type(MPI_Info), intent(in) :: info
-        CHARACTER(LEN=*), intent(in) :: service_name, port_name
+        character(len=*), intent(in) :: service_name, port_name
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Publish_name_f08
-end interface  MPI_Publish_name
+end interface MPI_Publish_name
 
-interface  MPI_Unpublish_name
+interface MPI_Unpublish_name
     subroutine MPI_Unpublish_name_f08(service_name, info, port_name, ierror)
         use :: mpi_f08_types, only : MPI_Info
         implicit none
-        CHARACTER(LEN=*), intent(in) :: service_name, port_name
+        character(len=*), intent(in) :: service_name, port_name
         type(MPI_Info), intent(in) :: info
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Unpublish_name_f08
-end interface  MPI_Unpublish_name
+end interface MPI_Unpublish_name
 
-interface  MPI_Accumulate
+interface MPI_Accumulate
     subroutine MPI_Accumulate_f08ts(origin_addr, origin_count, origin_datatype, target_rank, &
                                    target_disp, target_count, target_datatype, op, win, ierror)
         use :: mpi_f08_types, only : MPI_Datatype, MPI_Op, MPI_Win
-        use :: mpi_f08_constants, only : MPI_ADDRESS_KinD
+        use :: mpi_f08_compile_constants, only : MPI_ADDRESS_KIND
         implicit none
-        type(*), dimension(..), intent(in) :: origin_addr
+        type(*), dimension(..), intent(in), asynchronous :: origin_addr
         integer, intent(in) :: origin_count, target_rank, target_count
         type(MPI_Datatype), intent(in) :: origin_datatype
-        integer(MPI_ADDRESS_KinD), intent(in) :: target_disp
+        integer(MPI_ADDRESS_KIND), intent(in) :: target_disp
         type(MPI_Datatype), intent(in) :: target_datatype
         type(MPI_Op), intent(in) :: op
         type(MPI_Win), intent(in) :: win
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Accumulate_f08ts
-end interface  MPI_Accumulate
+end interface MPI_Accumulate
 
-interface  MPI_Get
+interface MPI_Get
     subroutine MPI_Get_f08ts(origin_addr, origin_count, origin_datatype, target_rank, &
                                     target_disp, target_count, target_datatype, win, ierror)
         use :: mpi_f08_types, only : MPI_Datatype, MPI_Win
-        use :: mpi_f08_constants, only : MPI_ADDRESS_KinD
+        use :: mpi_f08_compile_constants, only : MPI_ADDRESS_KIND
         implicit none
-        type(*), dimension(..) :: origin_addr
+        type(*), dimension(..), asynchronous :: origin_addr
         integer, intent(in) :: origin_count, target_rank, target_count
         type(MPI_Datatype), intent(in) :: origin_datatype
-        integer(MPI_ADDRESS_KinD), intent(in) :: target_disp
+        integer(MPI_ADDRESS_KIND), intent(in) :: target_disp
         type(MPI_Datatype), intent(in) :: target_datatype
         type(MPI_Win), intent(in) :: win
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Get_f08ts
-end interface  MPI_Get
+end interface MPI_Get
 
-interface  MPI_Put
+interface MPI_Put
     subroutine MPI_Put_f08ts(origin_addr, origin_count, origin_datatype, target_rank, &
-                                    target_disp, target_count, target_datatype, win, ierror)
+                             target_disp, target_count, target_datatype, win, ierror)
         use :: mpi_f08_types, only : MPI_Datatype, MPI_Win
-        use :: mpi_f08_constants, only : MPI_ADDRESS_KinD
+        use :: mpi_f08_compile_constants, only : MPI_ADDRESS_KIND
         implicit none
-        type(*), dimension(..), intent(in) :: origin_addr
+        type(*), dimension(..), intent(in), asynchronous :: origin_addr
         integer, intent(in) :: origin_count, target_rank, target_count
         type(MPI_Datatype), intent(in) :: origin_datatype
-        integer(MPI_ADDRESS_KinD), intent(in) :: target_disp
+        integer(MPI_ADDRESS_KIND), intent(in) :: target_disp
         type(MPI_Datatype), intent(in) :: target_datatype
         type(MPI_Win), intent(in) :: win
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Put_f08ts
-end interface  MPI_Put
+end interface MPI_Put
 
-interface  MPI_Win_complete
+interface MPI_Win_complete
     subroutine MPI_Win_complete_f08(win, ierror)
-        use :: mpi_f08_types, only : MPI_Info, MPI_Comm, MPI_Win
-        use :: mpi_f08_constants, only : MPI_ADDRESS_KinD
+        use :: mpi_f08_types, only : MPI_Win
         implicit none
         type(MPI_Win), intent(in) :: win
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Win_complete_f08
-end interface  MPI_Win_complete
+end interface MPI_Win_complete
 
-interface  MPI_Win_create
+interface MPI_Win_create
     subroutine MPI_Win_create_f08ts(base, size, disp_unit, info, comm, win, ierror)
         use :: mpi_f08_types, only : MPI_Info, MPI_Comm, MPI_Win
-        use :: mpi_f08_constants, only : MPI_ADDRESS_KinD
+        use :: mpi_f08_compile_constants, only : MPI_ADDRESS_KIND
         implicit none
-        type(*), dimension(..) :: base
-        integer(MPI_ADDRESS_KinD), intent(in) :: size
+        type(*), dimension(..), asynchronous :: base
+        integer(MPI_ADDRESS_KIND), intent(in) :: size
         integer, intent(in) :: disp_unit
         type(MPI_Info), intent(in) :: info
         type(MPI_Comm), intent(in) :: comm
         type(MPI_Win), intent(out) :: win
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Win_create_f08ts
-end interface  MPI_Win_create
+end interface MPI_Win_create
 
-interface  MPI_Win_fence
+interface MPI_Win_fence
     subroutine MPI_Win_fence_f08(assert, win, ierror)
         use :: mpi_f08_types, only : MPI_Win
         implicit none
@@ -2704,18 +2698,18 @@ interface  MPI_Win_fence
         type(MPI_Win), intent(in) :: win
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Win_fence_f08
-end interface  MPI_Win_fence
+end interface MPI_Win_fence
 
-interface  MPI_Win_free
+interface MPI_Win_free
     subroutine MPI_Win_free_f08(win, ierror)
         use :: mpi_f08_types, only : MPI_Win
         implicit none
         type(MPI_Win), intent(inout) :: win
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Win_free_f08
-end interface  MPI_Win_free
+end interface MPI_Win_free
 
-interface  MPI_Win_get_group
+interface MPI_Win_get_group
     subroutine MPI_Win_get_group_f08(win, group, ierror)
         use :: mpi_f08_types, only : MPI_Win, MPI_Group
         implicit none
@@ -2723,9 +2717,9 @@ interface  MPI_Win_get_group
         type(MPI_Group), intent(out) :: group
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Win_get_group_f08
-end interface  MPI_Win_get_group
+end interface MPI_Win_get_group
 
-interface  MPI_Win_lock
+interface MPI_Win_lock
     subroutine MPI_Win_lock_f08(lock_type, rank, assert, win, ierror)
         use :: mpi_f08_types, only : MPI_Win
         implicit none
@@ -2733,9 +2727,9 @@ interface  MPI_Win_lock
         type(MPI_Win), intent(in) :: win
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Win_lock_f08
-end interface  MPI_Win_lock
+end interface MPI_Win_lock
 
-interface  MPI_Win_post
+interface MPI_Win_post
     subroutine MPI_Win_post_f08(group, assert, win, ierror)
         use :: mpi_f08_types, only : MPI_Group, MPI_Win
         implicit none
@@ -2744,9 +2738,9 @@ interface  MPI_Win_post
         type(MPI_Win), intent(in) :: win
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Win_post_f08
-end interface  MPI_Win_post
+end interface MPI_Win_post
 
-interface  MPI_Win_start
+interface MPI_Win_start
     subroutine MPI_Win_start_f08(group, assert, win, ierror)
         use :: mpi_f08_types, only : MPI_Group, MPI_Win
         implicit none
@@ -2755,19 +2749,19 @@ interface  MPI_Win_start
         type(MPI_Win), intent(in) :: win
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Win_start_f08
-end interface  MPI_Win_start
+end interface MPI_Win_start
 
-interface  MPI_Win_test
+interface MPI_Win_test
     subroutine MPI_Win_test_f08(win, flag, ierror)
         use :: mpi_f08_types, only : MPI_Win
         implicit none
-        LOGICAL, intent(out) :: flag
+        logical, intent(out) :: flag
         type(MPI_Win), intent(in) :: win
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Win_test_f08
-end interface  MPI_Win_test
+end interface MPI_Win_test
 
-interface  MPI_Win_unlock
+interface MPI_Win_unlock
     subroutine MPI_Win_unlock_f08(rank, win, ierror)
         use :: mpi_f08_types, only : MPI_Win
         implicit none
@@ -2775,80 +2769,80 @@ interface  MPI_Win_unlock
         type(MPI_Win), intent(in) :: win
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Win_unlock_f08
-end interface  MPI_Win_unlock
+end interface MPI_Win_unlock
 
-interface  MPI_Win_wait
+interface MPI_Win_wait
     subroutine MPI_Win_wait_f08(win, ierror)
         use :: mpi_f08_types, only : MPI_Win
         implicit none
         type(MPI_Win), intent(in) :: win
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Win_wait_f08
-end interface  MPI_Win_wait
+end interface MPI_Win_wait
 
-interface  MPI_Grequest_complete
+interface MPI_Grequest_complete
     subroutine MPI_Grequest_complete_f08(request, ierror)
         use :: mpi_f08_types, only : MPI_Request
         implicit none
         type(MPI_Request), intent(in) :: request
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Grequest_complete_f08
-end interface  MPI_Grequest_complete
+end interface MPI_Grequest_complete
 
-interface  MPI_Grequest_start
+interface MPI_Grequest_start
     subroutine MPI_Grequest_start_f08(query_fn, free_fn, cancel_fn, extra_state, request, &
                                        ierror)
         use :: mpi_f08_types, only : MPI_Request
-        use :: mpi_f08_constants, only : MPI_ADDRESS_KinD
+        use :: mpi_f08_compile_constants, only : MPI_ADDRESS_KIND
         use :: mpi_f08_callbacks, only : MPI_Grequest_query_function
         use :: mpi_f08_callbacks, only : MPI_Grequest_free_function
         use :: mpi_f08_callbacks, only : MPI_Grequest_cancel_function
         implicit none
-        PROCEDURE(MPI_Grequest_query_function) :: query_fn
-        PROCEDURE(MPI_Grequest_free_function) :: free_fn
-        PROCEDURE(MPI_Grequest_cancel_function) :: cancel_fn
-        integer(MPI_ADDRESS_KinD), intent(in) :: extra_state
+        procedure(MPI_Grequest_query_function) :: query_fn
+        procedure(MPI_Grequest_free_function) :: free_fn
+        procedure(MPI_Grequest_cancel_function) :: cancel_fn
+        integer(MPI_ADDRESS_KIND), intent(in) :: extra_state
         type(MPI_Request), intent(out) :: request
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Grequest_start_f08
-end interface  MPI_Grequest_start
+end interface MPI_Grequest_start
 
-interface  MPI_Init_thread
+interface MPI_Init_thread
     subroutine MPI_Init_thread_f08(required, provided, ierror)
         implicit none
         integer, intent(in) :: required
         integer, intent(out) :: provided
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Init_thread_f08
-end interface  MPI_Init_thread
+end interface MPI_Init_thread
 
-interface  MPI_Is_thread_main
+interface MPI_Is_thread_main
     subroutine MPI_Is_thread_main_f08(flag, ierror)
         implicit none
-        LOGICAL, intent(out) :: flag
+        logical, intent(out) :: flag
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Is_thread_main_f08
-end interface  MPI_Is_thread_main
+end interface MPI_Is_thread_main
 
-interface  MPI_Query_thread
+interface MPI_Query_thread
     subroutine MPI_Query_thread_f08(provided, ierror)
         implicit none
         integer, intent(out) :: provided
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Query_thread_f08
-end interface  MPI_Query_thread
+end interface MPI_Query_thread
 
-interface  MPI_Status_set_cancelled
+interface MPI_Status_set_cancelled
     subroutine MPI_Status_set_cancelled_f08(status, flag, ierror)
         use :: mpi_f08_types, only : MPI_Status
         implicit none
         type(MPI_Status), intent(inout) :: status
-        LOGICAL, intent(out) :: flag
+        logical, intent(out) :: flag
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Status_set_cancelled_f08
-end interface  MPI_Status_set_cancelled
+end interface MPI_Status_set_cancelled
 
-interface  MPI_Status_set_elements
+interface MPI_Status_set_elements
     subroutine MPI_Status_set_elements_f08(status, datatype, count, ierror)
         use :: mpi_f08_types, only : MPI_Status, MPI_Datatype
         implicit none
@@ -2857,40 +2851,40 @@ interface  MPI_Status_set_elements
         integer, intent(in) :: count
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Status_set_elements_f08
-end interface  MPI_Status_set_elements
+end interface MPI_Status_set_elements
 
-interface  MPI_Status_set_elements_x
+interface MPI_Status_set_elements_x
     subroutine MPI_Status_set_elements_x_f08(status, datatype, count, ierror)
         use :: mpi_f08_types, only : MPI_Status, MPI_Datatype
-        use :: mpi_f08_constants, only : MPI_COUNT_KinD
+        use :: mpi_f08_compile_constants, only : MPI_COUNT_KIND
         implicit none
         type(MPI_Status), intent(inout) :: status
         type(MPI_Datatype), intent(in) :: datatype
-        integer(MPI_COUNT_KinD), intent(in) :: count
+        integer(MPI_COUNT_KIND), intent(in) :: count
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Status_set_elements_x_f08
-end interface  MPI_Status_set_elements_x
+end interface MPI_Status_set_elements_x
 
-interface  MPI_File_close
+interface MPI_File_close
     subroutine MPI_File_close_f08(fh, ierror)
         use :: mpi_f08_types, only : MPI_File
         implicit none
         type(MPI_File), intent(inout) :: fh
         integer, optional, intent(out) :: ierror
     end subroutine MPI_File_close_f08
-end interface  MPI_File_close
+end interface MPI_File_close
 
-interface  MPI_File_delete
+interface MPI_File_delete
     subroutine MPI_File_delete_f08(filename, info, ierror)
         use :: mpi_f08_types, only : MPI_Info
         implicit none
-        CHARACTER(LEN=*), intent(in) :: filename
+        character(len=*), intent(in) :: filename
         type(MPI_Info), intent(in) :: info
         integer, optional, intent(out) :: ierror
     end subroutine MPI_File_delete_f08
-end interface  MPI_File_delete
+end interface MPI_File_delete
 
-interface  MPI_File_get_amode
+interface MPI_File_get_amode
     subroutine MPI_File_get_amode_f08(fh, amode, ierror)
         use :: mpi_f08_types, only : MPI_File
         implicit none
@@ -2898,31 +2892,31 @@ interface  MPI_File_get_amode
         integer, intent(out) :: amode
         integer, optional, intent(out) :: ierror
     end subroutine MPI_File_get_amode_f08
-end interface  MPI_File_get_amode
+end interface MPI_File_get_amode
 
-interface  MPI_File_get_atomicity
+interface MPI_File_get_atomicity
     subroutine MPI_File_get_atomicity_f08(fh, flag, ierror)
         use :: mpi_f08_types, only : MPI_File
         implicit none
         type(MPI_File), intent(in) :: fh
-        LOGICAL, intent(out) :: flag
+        logical, intent(out) :: flag
         integer, optional, intent(out) :: ierror
     end subroutine MPI_File_get_atomicity_f08
-end interface  MPI_File_get_atomicity
+end interface MPI_File_get_atomicity
 
-interface  MPI_File_get_byte_offset
+interface MPI_File_get_byte_offset
     subroutine MPI_File_get_byte_offset_f08(fh, offset, disp, ierror)
         use :: mpi_f08_types, only : MPI_File
-        use :: mpi_f08_constants, only : MPI_OFFSET_KinD
+        use :: mpi_f08_compile_constants, only : MPI_OFFSET_KIND
         implicit none
         type(MPI_File), intent(in) :: fh
-        integer(MPI_OFFSET_KinD), intent(in) :: offset
-        integer(MPI_OFFSET_KinD), intent(out) :: disp
+        integer(MPI_OFFSET_KIND), intent(in) :: offset
+        integer(MPI_OFFSET_KIND), intent(out) :: disp
         integer, optional, intent(out) :: ierror
     end subroutine MPI_File_get_byte_offset_f08
-end interface  MPI_File_get_byte_offset
+end interface MPI_File_get_byte_offset
 
-interface  MPI_File_get_group
+interface MPI_File_get_group
     subroutine MPI_File_get_group_f08(fh, group, ierror)
         use :: mpi_f08_types, only : MPI_File, MPI_Group
         implicit none
@@ -2930,9 +2924,9 @@ interface  MPI_File_get_group
         type(MPI_Group), intent(out) :: group
         integer, optional, intent(out) :: ierror
     end subroutine MPI_File_get_group_f08
-end interface  MPI_File_get_group
+end interface MPI_File_get_group
 
-interface  MPI_File_get_info
+interface MPI_File_get_info
     subroutine MPI_File_get_info_f08(fh, info_used, ierror)
         use :: mpi_f08_types, only : MPI_File, MPI_Info
         implicit none
@@ -2940,174 +2934,174 @@ interface  MPI_File_get_info
         type(MPI_Info), intent(out) :: info_used
         integer, optional, intent(out) :: ierror
     end subroutine MPI_File_get_info_f08
-end interface  MPI_File_get_info
+end interface MPI_File_get_info
 
-interface  MPI_File_get_position
+interface MPI_File_get_position
     subroutine MPI_File_get_position_f08(fh, offset, ierror)
         use :: mpi_f08_types, only : MPI_File
-        use :: mpi_f08_constants, only : MPI_OFFSET_KinD
+        use :: mpi_f08_compile_constants, only : MPI_OFFSET_KIND
         implicit none
         type(MPI_File), intent(in) :: fh
-        integer(MPI_OFFSET_KinD), intent(out) :: offset
+        integer(MPI_OFFSET_KIND), intent(out) :: offset
         integer, optional, intent(out) :: ierror
     end subroutine MPI_File_get_position_f08
-end interface  MPI_File_get_position
+end interface MPI_File_get_position
 
-interface  MPI_File_get_position_shared
+interface MPI_File_get_position_shared
     subroutine MPI_File_get_position_shared_f08(fh, offset, ierror)
         use :: mpi_f08_types, only : MPI_File
-        use :: mpi_f08_constants, only : MPI_OFFSET_KinD
+        use :: mpi_f08_compile_constants, only : MPI_OFFSET_KIND
         implicit none
         type(MPI_File), intent(in) :: fh
-        integer(MPI_OFFSET_KinD), intent(out) :: offset
+        integer(MPI_OFFSET_KIND), intent(out) :: offset
         integer, optional, intent(out) :: ierror
     end subroutine MPI_File_get_position_shared_f08
-end interface  MPI_File_get_position_shared
+end interface MPI_File_get_position_shared
 
-interface  MPI_File_get_size
+interface MPI_File_get_size
     subroutine MPI_File_get_size_f08(fh, size, ierror)
         use :: mpi_f08_types, only : MPI_File
-        use :: mpi_f08_constants, only : MPI_OFFSET_KinD
+        use :: mpi_f08_compile_constants, only : MPI_OFFSET_KIND
         implicit none
         type(MPI_File), intent(in) :: fh
-        integer(MPI_OFFSET_KinD), intent(out) :: size
+        integer(MPI_OFFSET_KIND), intent(out) :: size
         integer, optional, intent(out) :: ierror
     end subroutine MPI_File_get_size_f08
-end interface  MPI_File_get_size
+end interface MPI_File_get_size
 
-interface  MPI_File_get_type_extent
+interface MPI_File_get_type_extent
     subroutine MPI_File_get_type_extent_f08(fh, datatype, extent, ierror)
         use :: mpi_f08_types, only : MPI_File, MPI_Datatype
-        use :: mpi_f08_constants, only : MPI_ADDRESS_KinD
+        use :: mpi_f08_compile_constants, only : MPI_ADDRESS_KIND
         implicit none
         type(MPI_File), intent(in) :: fh
         type(MPI_Datatype), intent(in) :: datatype
-        integer(MPI_ADDRESS_KinD), intent(out) :: extent
+        integer(MPI_ADDRESS_KIND), intent(out) :: extent
         integer, optional, intent(out) :: ierror
     end subroutine MPI_File_get_type_extent_f08
-end interface  MPI_File_get_type_extent
+end interface MPI_File_get_type_extent
 
-interface  MPI_File_get_view
+interface MPI_File_get_view
     subroutine MPI_File_get_view_f08(fh, disp, etype, filetype, datarep, ierror)
         use :: mpi_f08_types, only : MPI_File, MPI_Datatype
-        use :: mpi_f08_constants, only : MPI_OFFSET_KinD
+        use :: mpi_f08_compile_constants, only : MPI_OFFSET_KIND
         implicit none
         type(MPI_File), intent(in) :: fh
-        integer(MPI_OFFSET_KinD), intent(out) :: disp
+        integer(MPI_OFFSET_KIND), intent(out) :: disp
         type(MPI_Datatype), intent(out) :: etype
         type(MPI_Datatype), intent(out) :: filetype
-        CHARACTER(LEN=*), intent(out) :: datarep
+        character(len=*), intent(out) :: datarep
         integer, optional, intent(out) :: ierror
     end subroutine MPI_File_get_view_f08
-end interface  MPI_File_get_view
+end interface MPI_File_get_view
 
-interface  MPI_File_iread
+interface MPI_File_iread
     subroutine MPI_File_iread_f08ts(fh, buf, count, datatype, request, ierror)
         use :: mpi_f08_types, only : MPI_File, MPI_Datatype, MPI_Request
         implicit none
         type(MPI_File), intent(in) :: fh
-        type(*), dimension(..) :: buf
+        type(*), dimension(..), asynchronous :: buf
         integer, intent(in) :: count
         type(MPI_Datatype), intent(in) :: datatype
         type(MPI_Request), intent(out) :: request
         integer, optional, intent(out) :: ierror
     end subroutine MPI_File_iread_f08ts
-end interface  MPI_File_iread
+end interface MPI_File_iread
 
-interface  MPI_File_iread_at
+interface MPI_File_iread_at
     subroutine MPI_File_iread_at_f08ts(fh, offset, buf, count, datatype, request, ierror)
         use :: mpi_f08_types, only : MPI_File, MPI_Datatype, MPI_Request
-        use :: mpi_f08_constants, only : MPI_OFFSET_KinD
+        use :: mpi_f08_compile_constants, only : MPI_OFFSET_KIND
         implicit none
         type(MPI_File), intent(in) :: fh
-        integer(MPI_OFFSET_KinD), intent(in) :: offset
-        type(*), dimension(..) :: buf
+        integer(MPI_OFFSET_KIND), intent(in) :: offset
+        type(*), dimension(..), asynchronous :: buf
         integer, intent(in) :: count
         type(MPI_Datatype), intent(in) :: datatype
         type(MPI_Request), intent(out) :: request
         integer, optional, intent(out) :: ierror
     end subroutine MPI_File_iread_at_f08ts
-end interface  MPI_File_iread_at
+end interface MPI_File_iread_at
 
-interface  MPI_File_iread_shared
+interface MPI_File_iread_shared
     subroutine MPI_File_iread_shared_f08ts(fh, buf, count, datatype, request, ierror)
         use :: mpi_f08_types, only : MPI_File, MPI_Datatype, MPI_Request
         implicit none
         type(MPI_File), intent(in) :: fh
-        type(*), dimension(..) :: buf
+        type(*), dimension(..), asynchronous :: buf
         integer, intent(in) :: count
         type(MPI_Datatype), intent(in) :: datatype
         type(MPI_Request), intent(out) :: request
         integer, optional, intent(out) :: ierror
     end subroutine MPI_File_iread_shared_f08ts
-end interface  MPI_File_iread_shared
+end interface MPI_File_iread_shared
 
-interface  MPI_File_iwrite
+interface MPI_File_iwrite
     subroutine MPI_File_iwrite_f08ts(fh, buf, count, datatype, request, ierror)
         use :: mpi_f08_types, only : MPI_File, MPI_Datatype, MPI_Request
         implicit none
         type(MPI_File), intent(in) :: fh
-        type(*), dimension(..), intent(in) :: buf
+        type(*), dimension(..), intent(in), asynchronous :: buf
         integer, intent(in) :: count
         type(MPI_Datatype), intent(in) :: datatype
         type(MPI_Request), intent(out) :: request
         integer, optional, intent(out) :: ierror
     end subroutine MPI_File_iwrite_f08ts
-end interface  MPI_File_iwrite
+end interface MPI_File_iwrite
 
-interface  MPI_File_iwrite_at
+interface MPI_File_iwrite_at
     subroutine MPI_File_iwrite_at_f08ts(fh, offset, buf, count, datatype, request, ierror)
         use :: mpi_f08_types, only : MPI_File, MPI_Datatype, MPI_Request
-        use :: mpi_f08_constants, only : MPI_OFFSET_KinD
+        use :: mpi_f08_compile_constants, only : MPI_OFFSET_KIND
         implicit none
         type(MPI_File), intent(in) :: fh
-        integer(MPI_OFFSET_KinD), intent(in) :: offset
-        type(*), dimension(..), intent(in) :: buf
+        integer(MPI_OFFSET_KIND), intent(in) :: offset
+        type(*), dimension(..), intent(in), asynchronous :: buf
         integer, intent(in) :: count
         type(MPI_Datatype), intent(in) :: datatype
         type(MPI_Request), intent(out) :: request
         integer, optional, intent(out) :: ierror
     end subroutine MPI_File_iwrite_at_f08ts
-end interface  MPI_File_iwrite_at
+end interface MPI_File_iwrite_at
 
-interface  MPI_File_iwrite_shared
+interface MPI_File_iwrite_shared
     subroutine MPI_File_iwrite_shared_f08ts(fh, buf, count, datatype, request, ierror)
         use :: mpi_f08_types, only : MPI_File, MPI_Datatype, MPI_Request
         implicit none
-        type(*), dimension(..), intent(in) :: buf
+        type(*), dimension(..), intent(in), asynchronous :: buf
         type(MPI_File), intent(in) :: fh
         integer, intent(in) :: count
         type(MPI_Datatype), intent(in) :: datatype
         type(MPI_Request), intent(out) :: request
         integer, optional, intent(out) :: ierror
     end subroutine MPI_File_iwrite_shared_f08ts
-end interface  MPI_File_iwrite_shared
+end interface MPI_File_iwrite_shared
 
-interface  MPI_File_open
+interface MPI_File_open
     subroutine MPI_File_open_f08(comm, filename, amode, info, fh, ierror)
         use :: mpi_f08_types, only : MPI_Comm, MPI_Info, MPI_File
         implicit none
         type(MPI_Comm), intent(in) :: comm
-        CHARACTER(LEN=*), intent(in) :: filename
+        character(len=*), intent(in) :: filename
         integer, intent(in) :: amode
         type(MPI_Info), intent(in) :: info
         type(MPI_File), intent(out) :: fh
         integer, optional, intent(out) :: ierror
     end subroutine MPI_File_open_f08
-end interface  MPI_File_open
+end interface MPI_File_open
 
-interface  MPI_File_preallocate
+interface MPI_File_preallocate
     subroutine MPI_File_preallocate_f08(fh, size, ierror)
         use :: mpi_f08_types, only : MPI_File
-        use :: mpi_f08_constants, only : MPI_OFFSET_KinD
+        use :: mpi_f08_compile_constants, only : MPI_OFFSET_KIND
         implicit none
         type(MPI_File), intent(in) :: fh
-        integer(MPI_OFFSET_KinD), intent(in) :: size
+        integer(MPI_OFFSET_KIND), intent(in) :: size
         integer, optional, intent(out) :: ierror
     end subroutine MPI_File_preallocate_f08
-end interface  MPI_File_preallocate
+end interface MPI_File_preallocate
 
-interface  MPI_File_read
+interface MPI_File_read
     subroutine MPI_File_read_f08ts(fh, buf, count, datatype, status, ierror)
         use :: mpi_f08_types, only : MPI_File, MPI_Datatype, MPI_Status
         implicit none
@@ -3118,9 +3112,9 @@ interface  MPI_File_read
         type(MPI_Status) :: status
         integer, optional, intent(out) :: ierror
     end subroutine MPI_File_read_f08ts
-end interface  MPI_File_read
+end interface MPI_File_read
 
-interface  MPI_File_read_all
+interface MPI_File_read_all
     subroutine MPI_File_read_all_f08ts(fh, buf, count, datatype, status, ierror)
         use :: mpi_f08_types, only : MPI_File, MPI_Datatype, MPI_Status
         implicit none
@@ -3131,9 +3125,9 @@ interface  MPI_File_read_all
         type(MPI_Status) :: status
         integer, optional, intent(out) :: ierror
     end subroutine MPI_File_read_all_f08ts
-end interface  MPI_File_read_all
+end interface MPI_File_read_all
 
-interface  MPI_File_read_all_begin
+interface MPI_File_read_all_begin
     subroutine MPI_File_read_all_begin_f08ts(fh, buf, count, datatype, ierror)
         use :: mpi_f08_types, only : MPI_File, MPI_Datatype
         implicit none
@@ -3143,9 +3137,9 @@ interface  MPI_File_read_all_begin
         type(MPI_Datatype), intent(in) :: datatype
         integer, optional, intent(out) :: ierror
     end subroutine MPI_File_read_all_begin_f08ts
-end interface  MPI_File_read_all_begin
+end interface MPI_File_read_all_begin
 
-interface  MPI_File_read_all_end
+interface MPI_File_read_all_end
     subroutine MPI_File_read_all_end_f08ts(fh, buf, status, ierror)
         use :: mpi_f08_types, only : MPI_File, MPI_Status
         implicit none
@@ -3154,53 +3148,53 @@ interface  MPI_File_read_all_end
         type(MPI_Status) :: status
         integer, optional, intent(out) :: ierror
     end subroutine MPI_File_read_all_end_f08ts
-end interface  MPI_File_read_all_end
+end interface MPI_File_read_all_end
 
-interface  MPI_File_read_at
+interface MPI_File_read_at
     subroutine MPI_File_read_at_f08ts(fh, offset, buf, count, datatype, status, ierror)
         use :: mpi_f08_types, only : MPI_File, MPI_Datatype, MPI_Status
-        use :: mpi_f08_constants, only : MPI_OFFSET_KinD
+        use :: mpi_f08_compile_constants, only : MPI_OFFSET_KIND
         implicit none
         type(MPI_File), intent(in) :: fh
-        integer(MPI_OFFSET_KinD), intent(in) :: offset
+        integer(MPI_OFFSET_KIND), intent(in) :: offset
         type(*), dimension(..) :: buf
         integer, intent(in) :: count
         type(MPI_Datatype), intent(in) :: datatype
         type(MPI_Status) :: status
         integer, optional, intent(out) :: ierror
     end subroutine MPI_File_read_at_f08ts
-end interface  MPI_File_read_at
+end interface MPI_File_read_at
 
-interface  MPI_File_read_at_all
+interface MPI_File_read_at_all
     subroutine MPI_File_read_at_all_f08ts(fh, offset, buf, count, datatype, status, ierror)
         use :: mpi_f08_types, only : MPI_File, MPI_Datatype, MPI_Status
-        use :: mpi_f08_constants, only : MPI_OFFSET_KinD
+        use :: mpi_f08_compile_constants, only : MPI_OFFSET_KIND
         implicit none
         type(MPI_File), intent(in) :: fh
-        integer(MPI_OFFSET_KinD), intent(in) :: offset
+        integer(MPI_OFFSET_KIND), intent(in) :: offset
         type(*), dimension(..) :: buf
         integer, intent(in) :: count
         type(MPI_Datatype), intent(in) :: datatype
         type(MPI_Status) :: status
         integer, optional, intent(out) :: ierror
     end subroutine MPI_File_read_at_all_f08ts
-end interface  MPI_File_read_at_all
+end interface MPI_File_read_at_all
 
-interface  MPI_File_read_at_all_begin
+interface MPI_File_read_at_all_begin
     subroutine MPI_File_read_at_all_begin_f08ts(fh, offset, buf, count, datatype, ierror)
         use :: mpi_f08_types, only : MPI_File, MPI_Datatype
-        use :: mpi_f08_constants, only : MPI_OFFSET_KinD
+        use :: mpi_f08_compile_constants, only : MPI_OFFSET_KIND
         implicit none
         type(MPI_File), intent(in) :: fh
-        integer(MPI_OFFSET_KinD), intent(in) :: offset
+        integer(MPI_OFFSET_KIND), intent(in) :: offset
         type(*), dimension(..) :: buf
         integer, intent(in) :: count
         type(MPI_Datatype), intent(in) :: datatype
         integer, optional, intent(out) :: ierror
     end subroutine MPI_File_read_at_all_begin_f08ts
-end interface  MPI_File_read_at_all_begin
+end interface MPI_File_read_at_all_begin
 
-interface  MPI_File_read_at_all_end
+interface MPI_File_read_at_all_end
     subroutine MPI_File_read_at_all_end_f08ts(fh, buf, status, ierror)
         use :: mpi_f08_types, only : MPI_File, MPI_Status
         implicit none
@@ -3209,9 +3203,9 @@ interface  MPI_File_read_at_all_end
         type(MPI_Status) :: status
         integer, optional, intent(out) :: ierror
     end subroutine MPI_File_read_at_all_end_f08ts
-end interface  MPI_File_read_at_all_end
+end interface MPI_File_read_at_all_end
 
-interface  MPI_File_read_ordered
+interface MPI_File_read_ordered
     subroutine MPI_File_read_ordered_f08ts(fh, buf, count, datatype, status, ierror)
         use :: mpi_f08_types, only : MPI_File, MPI_Datatype, MPI_Status
         implicit none
@@ -3222,9 +3216,9 @@ interface  MPI_File_read_ordered
         type(MPI_Status) :: status
         integer, optional, intent(out) :: ierror
     end subroutine MPI_File_read_ordered_f08ts
-end interface  MPI_File_read_ordered
+end interface MPI_File_read_ordered
 
-interface  MPI_File_read_ordered_begin
+interface MPI_File_read_ordered_begin
     subroutine MPI_File_read_ordered_begin_f08ts(fh, buf, count, datatype, ierror)
         use :: mpi_f08_types, only : MPI_File, MPI_Datatype
         implicit none
@@ -3234,9 +3228,9 @@ interface  MPI_File_read_ordered_begin
         type(MPI_Datatype), intent(in) :: datatype
         integer, optional, intent(out) :: ierror
     end subroutine MPI_File_read_ordered_begin_f08ts
-end interface  MPI_File_read_ordered_begin
+end interface MPI_File_read_ordered_begin
 
-interface  MPI_File_read_ordered_end
+interface MPI_File_read_ordered_end
     subroutine MPI_File_read_ordered_end_f08ts(fh, buf, status, ierror)
         use :: mpi_f08_types, only : MPI_File, MPI_Status
         implicit none
@@ -3245,9 +3239,9 @@ interface  MPI_File_read_ordered_end
         type(MPI_Status) :: status
         integer, optional, intent(out) :: ierror
     end subroutine MPI_File_read_ordered_end_f08ts
-end interface  MPI_File_read_ordered_end
+end interface MPI_File_read_ordered_end
 
-interface  MPI_File_read_shared
+interface MPI_File_read_shared
     subroutine MPI_File_read_shared_f08ts(fh, buf, count, datatype, status, ierror)
         use :: mpi_f08_types, only : MPI_File, MPI_Datatype, MPI_Status
         implicit none
@@ -3258,43 +3252,43 @@ interface  MPI_File_read_shared
         type(MPI_Status) :: status
         integer, optional, intent(out) :: ierror
     end subroutine MPI_File_read_shared_f08ts
-end interface  MPI_File_read_shared
+end interface MPI_File_read_shared
 
-interface  MPI_File_seek
+interface MPI_File_seek
     subroutine MPI_File_seek_f08(fh, offset, whence, ierror)
         use :: mpi_f08_types, only : MPI_File
-        use :: mpi_f08_constants, only : MPI_OFFSET_KinD
+        use :: mpi_f08_compile_constants, only : MPI_OFFSET_KIND
         implicit none
         type(MPI_File), intent(in) :: fh
-        integer(MPI_OFFSET_KinD), intent(in) :: offset
+        integer(MPI_OFFSET_KIND), intent(in) :: offset
         integer, intent(in) :: whence
         integer, optional, intent(out) :: ierror
     end subroutine MPI_File_seek_f08
-end interface  MPI_File_seek
+end interface MPI_File_seek
 
-interface  MPI_File_seek_shared
+interface MPI_File_seek_shared
     subroutine MPI_File_seek_shared_f08(fh, offset, whence, ierror)
         use :: mpi_f08_types, only : MPI_File
-        use :: mpi_f08_constants, only : MPI_OFFSET_KinD
+        use :: mpi_f08_compile_constants, only : MPI_OFFSET_KIND
         implicit none
         type(MPI_File), intent(in) :: fh
-        integer(MPI_OFFSET_KinD), intent(in) :: offset
+        integer(MPI_OFFSET_KIND), intent(in) :: offset
         integer, intent(in) :: whence
         integer, optional, intent(out) :: ierror
     end subroutine MPI_File_seek_shared_f08
-end interface  MPI_File_seek_shared
+end interface MPI_File_seek_shared
 
-interface  MPI_File_set_atomicity
+interface MPI_File_set_atomicity
     subroutine MPI_File_set_atomicity_f08(fh, flag, ierror)
         use :: mpi_f08_types, only : MPI_File
         implicit none
         type(MPI_File), intent(in) :: fh
-        LOGICAL, intent(in) :: flag
+        logical, intent(in) :: flag
         integer, optional, intent(out) :: ierror
     end subroutine MPI_File_set_atomicity_f08
-end interface  MPI_File_set_atomicity
+end interface MPI_File_set_atomicity
 
-interface  MPI_File_set_info
+interface MPI_File_set_info
     subroutine MPI_File_set_info_f08(fh, info, ierror)
         use :: mpi_f08_types, only : MPI_File, MPI_Info
         implicit none
@@ -3302,44 +3296,44 @@ interface  MPI_File_set_info
         type(MPI_Info), intent(in) :: info
         integer, optional, intent(out) :: ierror
     end subroutine MPI_File_set_info_f08
-end interface  MPI_File_set_info
+end interface MPI_File_set_info
 
-interface  MPI_File_set_size
+interface MPI_File_set_size
     subroutine MPI_File_set_size_f08(fh, size, ierror)
         use :: mpi_f08_types, only : MPI_File
-        use :: mpi_f08_constants, only : MPI_OFFSET_KinD
+        use :: mpi_f08_compile_constants, only : MPI_OFFSET_KIND
         implicit none
         type(MPI_File), intent(in) :: fh
-        integer(MPI_OFFSET_KinD), intent(in) :: size
+        integer(MPI_OFFSET_KIND), intent(in) :: size
         integer, optional, intent(out) :: ierror
     end subroutine MPI_File_set_size_f08
-end interface  MPI_File_set_size
+end interface MPI_File_set_size
 
-interface  MPI_File_set_view
+interface MPI_File_set_view
     subroutine MPI_File_set_view_f08(fh, disp, etype, filetype, datarep, info, ierror)
         use :: mpi_f08_types, only : MPI_File, MPI_Datatype, MPI_Info
-        use :: mpi_f08_constants, only : MPI_OFFSET_KinD
+        use :: mpi_f08_compile_constants, only : MPI_OFFSET_KIND
         implicit none
         type(MPI_File), intent(in) :: fh
-        integer(MPI_OFFSET_KinD), intent(in) :: disp
+        integer(MPI_OFFSET_KIND), intent(in) :: disp
         type(MPI_Datatype), intent(in) :: etype
         type(MPI_Datatype), intent(in) :: filetype
-        CHARACTER(LEN=*), intent(in) :: datarep
+        character(len=*), intent(in) :: datarep
         type(MPI_Info), intent(in) :: info
         integer, optional, intent(out) :: ierror
     end subroutine MPI_File_set_view_f08
-end interface  MPI_File_set_view
+end interface MPI_File_set_view
 
-interface  MPI_File_sync
+interface MPI_File_sync
     subroutine MPI_File_sync_f08(fh, ierror)
         use :: mpi_f08_types, only : MPI_File
         implicit none
         type(MPI_File), intent(in) :: fh
         integer, optional, intent(out) :: ierror
     end subroutine MPI_File_sync_f08
-end interface  MPI_File_sync
+end interface MPI_File_sync
 
-interface  MPI_File_write
+interface MPI_File_write
     subroutine MPI_File_write_f08ts(fh, buf, count, datatype, status, ierror)
         use :: mpi_f08_types, only : MPI_File, MPI_Datatype, MPI_Status
         implicit none
@@ -3350,9 +3344,9 @@ interface  MPI_File_write
         type(MPI_Status) :: status
         integer, optional, intent(out) :: ierror
     end subroutine MPI_File_write_f08ts
-end interface  MPI_File_write
+end interface MPI_File_write
 
-interface  MPI_File_write_all
+interface MPI_File_write_all
     subroutine MPI_File_write_all_f08ts(fh, buf, count, datatype, status, ierror)
         use :: mpi_f08_types, only : MPI_File, MPI_Datatype, MPI_Status
         implicit none
@@ -3363,9 +3357,9 @@ interface  MPI_File_write_all
         type(MPI_Status) :: status
         integer, optional, intent(out) :: ierror
     end subroutine MPI_File_write_all_f08ts
-end interface  MPI_File_write_all
+end interface MPI_File_write_all
 
-interface  MPI_File_write_all_begin
+interface MPI_File_write_all_begin
     subroutine MPI_File_write_all_begin_f08ts(fh, buf, count, datatype, ierror)
         use :: mpi_f08_types, only : MPI_File, MPI_Datatype
         implicit none
@@ -3375,9 +3369,9 @@ interface  MPI_File_write_all_begin
         type(MPI_Datatype), intent(in) :: datatype
         integer, optional, intent(out) :: ierror
     end subroutine MPI_File_write_all_begin_f08ts
-end interface  MPI_File_write_all_begin
+end interface MPI_File_write_all_begin
 
-interface  MPI_File_write_all_end
+interface MPI_File_write_all_end
     subroutine MPI_File_write_all_end_f08ts(fh, buf, status, ierror)
         use :: mpi_f08_types, only : MPI_File, MPI_Status
         implicit none
@@ -3386,53 +3380,53 @@ interface  MPI_File_write_all_end
         type(MPI_Status) :: status
         integer, optional, intent(out) :: ierror
     end subroutine MPI_File_write_all_end_f08ts
-end interface  MPI_File_write_all_end
+end interface MPI_File_write_all_end
 
-interface  MPI_File_write_at
+interface MPI_File_write_at
     subroutine MPI_File_write_at_f08ts(fh, offset, buf, count, datatype, status, ierror)
         use :: mpi_f08_types, only : MPI_File, MPI_Datatype, MPI_Status
-        use :: mpi_f08_constants, only : MPI_OFFSET_KinD
+        use :: mpi_f08_compile_constants, only : MPI_OFFSET_KIND
         implicit none
         type(MPI_File), intent(in) :: fh
-        integer(MPI_OFFSET_KinD), intent(in) :: offset
+        integer(MPI_OFFSET_KIND), intent(in) :: offset
         type(*), dimension(..), intent(in) :: buf
         integer, intent(in) :: count
         type(MPI_Datatype), intent(in) :: datatype
         type(MPI_Status) :: status
         integer, optional, intent(out) :: ierror
     end subroutine MPI_File_write_at_f08ts
-end interface  MPI_File_write_at
+end interface MPI_File_write_at
 
-interface  MPI_File_write_at_all
+interface MPI_File_write_at_all
     subroutine MPI_File_write_at_all_f08ts(fh, offset, buf, count, datatype, status, ierror)
         use :: mpi_f08_types, only : MPI_File, MPI_Datatype, MPI_Status
-        use :: mpi_f08_constants, only : MPI_OFFSET_KinD
+        use :: mpi_f08_compile_constants, only : MPI_OFFSET_KIND
         implicit none
         type(MPI_File), intent(in) :: fh
-        integer(MPI_OFFSET_KinD), intent(in) :: offset
+        integer(MPI_OFFSET_KIND), intent(in) :: offset
         type(*), dimension(..) :: buf
         integer, intent(in) :: count
         type(MPI_Datatype), intent(in) :: datatype
         type(MPI_Status) :: status
         integer, optional, intent(out) :: ierror
     end subroutine MPI_File_write_at_all_f08ts
-end interface  MPI_File_write_at_all
+end interface MPI_File_write_at_all
 
-interface  MPI_File_write_at_all_begin
+interface MPI_File_write_at_all_begin
     subroutine MPI_File_write_at_all_begin_f08ts(fh, offset, buf, count, datatype, ierror)
         use :: mpi_f08_types, only : MPI_File, MPI_Datatype
-        use :: mpi_f08_constants, only : MPI_OFFSET_KinD
+        use :: mpi_f08_compile_constants, only : MPI_OFFSET_KIND
         implicit none
         type(MPI_File), intent(in) :: fh
-        integer(MPI_OFFSET_KinD), intent(in) :: offset
+        integer(MPI_OFFSET_KIND), intent(in) :: offset
         type(*), dimension(..), intent(in) :: buf
         integer, intent(in) :: count
         type(MPI_Datatype), intent(in) :: datatype
         integer, optional, intent(out) :: ierror
     end subroutine MPI_File_write_at_all_begin_f08ts
-end interface  MPI_File_write_at_all_begin
+end interface MPI_File_write_at_all_begin
 
-interface  MPI_File_write_at_all_end
+interface MPI_File_write_at_all_end
     subroutine MPI_File_write_at_all_end_f08ts(fh, buf, status, ierror)
         use :: mpi_f08_types, only : MPI_File, MPI_Status
         implicit none
@@ -3441,9 +3435,9 @@ interface  MPI_File_write_at_all_end
         type(MPI_Status) :: status
         integer, optional, intent(out) :: ierror
     end subroutine MPI_File_write_at_all_end_f08ts
-end interface  MPI_File_write_at_all_end
+end interface MPI_File_write_at_all_end
 
-interface  MPI_File_write_ordered
+interface MPI_File_write_ordered
     subroutine MPI_File_write_ordered_f08ts(fh, buf, count, datatype, status, ierror)
         use :: mpi_f08_types, only : MPI_File, MPI_Datatype, MPI_Status
         implicit none
@@ -3454,9 +3448,9 @@ interface  MPI_File_write_ordered
         type(MPI_Status) :: status
         integer, optional, intent(out) :: ierror
     end subroutine MPI_File_write_ordered_f08ts
-end interface  MPI_File_write_ordered
+end interface MPI_File_write_ordered
 
-interface  MPI_File_write_ordered_begin
+interface MPI_File_write_ordered_begin
     subroutine MPI_File_write_ordered_begin_f08ts(fh, buf, count, datatype, ierror)
         use :: mpi_f08_types, only : MPI_File, MPI_Datatype
         implicit none
@@ -3466,9 +3460,9 @@ interface  MPI_File_write_ordered_begin
         type(MPI_Datatype), intent(in) :: datatype
         integer, optional, intent(out) :: ierror
     end subroutine MPI_File_write_ordered_begin_f08ts
-end interface  MPI_File_write_ordered_begin
+end interface MPI_File_write_ordered_begin
 
-interface  MPI_File_write_ordered_end
+interface MPI_File_write_ordered_end
     subroutine MPI_File_write_ordered_end_f08ts(fh, buf, status, ierror)
         use :: mpi_f08_types, only : MPI_File, MPI_Status
         implicit none
@@ -3477,9 +3471,9 @@ interface  MPI_File_write_ordered_end
         type(MPI_Status) :: status
         integer, optional, intent(out) :: ierror
     end subroutine MPI_File_write_ordered_end_f08ts
-end interface  MPI_File_write_ordered_end
+end interface MPI_File_write_ordered_end
 
-interface  MPI_File_write_shared
+interface MPI_File_write_shared
     subroutine MPI_File_write_shared_f08ts(fh, buf, count, datatype, status, ierror)
         use :: mpi_f08_types, only : MPI_File, MPI_Datatype, MPI_Status
         implicit none
@@ -3490,26 +3484,26 @@ interface  MPI_File_write_shared
         type(MPI_Status) :: status
         integer, optional, intent(out) :: ierror
     end subroutine MPI_File_write_shared_f08ts
-end interface  MPI_File_write_shared
+end interface MPI_File_write_shared
 
-interface  MPI_Register_datarep
+interface MPI_Register_datarep
     subroutine MPI_Register_datarep_f08(datarep, read_conversion_fn, write_conversion_fn, &
                                                  dtype_file_extent_fn, extra_state, ierror)
-        use :: mpi_f08_constants, only : MPI_ADDRESS_KinD
+        use :: mpi_f08_compile_constants, only : MPI_ADDRESS_KIND
         use :: mpi_f08_callbacks, only : MPI_Datarep_conversion_function
         use :: mpi_f08_callbacks, only : MPI_Datarep_extent_function
         implicit none
-        CHARACTER(LEN=*), intent(in) :: datarep
-        PROCEDURE(MPI_Datarep_conversion_function) :: read_conversion_fn
-        PROCEDURE(MPI_Datarep_conversion_function) :: write_conversion_fn
-        PROCEDURE(MPI_Datarep_extent_function) :: dtype_file_extent_fn
-        integer(MPI_ADDRESS_KinD), intent(in) :: extra_state
+        character(len=*), intent(in) :: datarep
+        procedure(MPI_Datarep_conversion_function) :: read_conversion_fn
+        procedure(MPI_Datarep_conversion_function) :: write_conversion_fn
+        procedure(MPI_Datarep_extent_function) :: dtype_file_extent_fn
+        integer(MPI_ADDRESS_KIND), intent(in) :: extra_state
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Register_datarep_f08
-end interface  MPI_Register_datarep
+end interface MPI_Register_datarep
 
 
-interface  MPI_Type_create_f90_complex
+interface MPI_Type_create_f90_complex
     subroutine MPI_Type_create_f90_complex_f08(p, r, newtype, ierror)
         use :: mpi_f08_types, only : MPI_Datatype
         implicit none
@@ -3517,9 +3511,9 @@ interface  MPI_Type_create_f90_complex
         type(MPI_Datatype), intent(out) :: newtype
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Type_create_f90_complex_f08
-end interface  MPI_Type_create_f90_complex
+end interface MPI_Type_create_f90_complex
 
-interface  MPI_Type_create_f90_integer
+interface MPI_Type_create_f90_integer
     subroutine MPI_Type_create_f90_integer_f08(r, newtype, ierror)
         use :: mpi_f08_types, only : MPI_Datatype
         implicit none
@@ -3527,9 +3521,9 @@ interface  MPI_Type_create_f90_integer
         type(MPI_Datatype), intent(out) :: newtype
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Type_create_f90_integer_f08
-end interface  MPI_Type_create_f90_integer
+end interface MPI_Type_create_f90_integer
 
-interface  MPI_Type_create_f90_real
+interface MPI_Type_create_f90_real
     subroutine MPI_Type_create_f90_real_f08(p, r, newtype, ierror)
         use :: mpi_f08_types, only : MPI_Datatype
         implicit none
@@ -3537,9 +3531,9 @@ interface  MPI_Type_create_f90_real
         type(MPI_Datatype), intent(out) :: newtype
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Type_create_f90_real_f08
-end interface  MPI_Type_create_f90_real
+end interface MPI_Type_create_f90_real
 
-interface  MPI_Type_match_size
+interface MPI_Type_match_size
     subroutine MPI_Type_match_size_f08(typeclass, size, datatype, ierror)
         use :: mpi_f08_types, only : MPI_Datatype
         implicit none
@@ -3547,16 +3541,16 @@ interface  MPI_Type_match_size
         type(MPI_Datatype), intent(out) :: datatype
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Type_match_size_f08
-end interface  MPI_Type_match_size
+end interface MPI_Type_match_size
 
-interface  MPI_Pcontrol
+interface MPI_Pcontrol
     subroutine MPI_Pcontrol_f08(level)
         implicit none
         integer, intent(in) :: level
     end subroutine MPI_Pcontrol_f08
-end interface  MPI_Pcontrol
+end interface MPI_Pcontrol
 
-interface  MPI_Comm_split_type
+interface MPI_Comm_split_type
     subroutine MPI_Comm_split_type_f08(comm, split_type, key, info, newcomm, ierror)
         use :: mpi_f08_types, only : MPI_Comm, MPI_Info
         implicit none
@@ -3567,64 +3561,64 @@ interface  MPI_Comm_split_type
         type(MPI_Comm), intent(out) :: newcomm
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Comm_split_type_f08
-end interface  MPI_Comm_split_type
+end interface MPI_Comm_split_type
 
-interface  MPI_F_sync_reg
+interface MPI_F_sync_reg
     subroutine MPI_F_sync_reg_f08ts(buf)
         implicit none
         type(*), dimension(..) :: buf
     end subroutine MPI_F_sync_reg_f08ts
-end interface  MPI_F_sync_reg
+end interface MPI_F_sync_reg
 
-interface  MPI_Get_library_version
-    subroutine MPI_Get_library_version_f08(name, resultlen, ierror)
-        use :: mpi_f08_constants, only : MPI_MAX_PROCESSOR_NAME
+interface MPI_Get_library_version
+    subroutine MPI_Get_library_version_f08(version, resultlen, ierror)
+        use :: mpi_f08_compile_constants, only : MPI_MAX_LIBRARY_VERSION_STRING
         implicit none
-        character(len=MPI_MAX_PROCESSOR_NAME), intent(out) :: name
+        character(len=MPI_MAX_LIBRARY_VERSION_STRING), intent(out) :: version
         integer, intent(out) :: resultlen
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Get_library_version_f08
-end interface  MPI_Get_library_version
+end interface MPI_Get_library_version
 
-interface  MPI_Mprobe
+interface MPI_Mprobe
     subroutine MPI_Mprobe_f08(source, tag, comm, message, status, ierror)
         use :: mpi_f08_types, only : MPI_Comm, MPI_Message, MPI_Status
         implicit none
         integer, intent(in) :: source, tag
         type(MPI_Comm), intent(in) :: comm
         type(MPI_Message), intent(out) :: message
-        type(MPI_Status), intent(out) :: status
+        type(MPI_Status) :: status
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Mprobe_f08
-end interface  MPI_Mprobe
+end interface MPI_Mprobe
 
-interface  MPI_Improbe
+interface MPI_Improbe
     subroutine MPI_Improbe_f08(source, tag, comm, flag, message, status, ierror)
         use :: mpi_f08_types, only : MPI_Comm, MPI_Message, MPI_Status
         implicit none
         integer, intent(in) :: source, tag
         type(MPI_Comm), intent(in) :: comm
-        LOGICAL, intent(out) :: flag
+        logical, intent(out) :: flag
         type(MPI_Message), intent(out) :: message
-        type(MPI_Status), intent(out) :: status
+        type(MPI_Status) :: status
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Improbe_f08
-end interface  MPI_Improbe
+end interface MPI_Improbe
 
-interface  MPI_Imrecv
+interface MPI_Imrecv
     subroutine MPI_Imrecv_f08ts(buf, count, datatype, message, request, ierror)
         use :: mpi_f08_types, only : MPI_Datatype, MPI_Message, MPI_Request
         implicit none
-        type(*), dimension(..) :: buf
+        type(*), dimension(..), asynchronous :: buf
         integer, intent(in) :: count
         type(MPI_Datatype), intent(in) :: datatype
         type(MPI_Message), intent(inout) :: message
         type(MPI_Request), intent(out) :: request
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Imrecv_f08ts
-end interface  MPI_Imrecv
+end interface MPI_Imrecv
 
-interface  MPI_Mrecv
+interface MPI_Mrecv
     subroutine MPI_Mrecv_f08ts(buf, count, datatype, message, status, ierror)
         use :: mpi_f08_types, only : MPI_Datatype, MPI_Message, MPI_Status
         implicit none
@@ -3635,11 +3629,11 @@ interface  MPI_Mrecv
         type(MPI_Status) :: status
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Mrecv_f08ts
-end interface  MPI_Mrecv
+end interface MPI_Mrecv
 
-interface  MPI_Neighbor_allgather
+interface MPI_Neighbor_allgather
     subroutine MPI_Neighbor_allgather_f08ts(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, &
-                                  comm, ierror)
+                 comm, ierror)
         use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm
         implicit none
         type(*), dimension(..), intent(in) :: sendbuf
@@ -3649,26 +3643,26 @@ interface  MPI_Neighbor_allgather
         type(MPI_Comm), intent(in) :: comm
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Neighbor_allgather_f08ts
-end interface  MPI_Neighbor_allgather
+end interface MPI_Neighbor_allgather
 
-interface  MPI_Ineighbor_allgather
+interface MPI_Ineighbor_allgather
     subroutine MPI_Ineighbor_allgather_f08ts(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, &
-                                  comm, request, ierror)
+                 comm, request, ierror)
         use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm, MPI_Request
         implicit none
-        type(*), dimension(..), intent(in) :: sendbuf
-        type(*), dimension(..) :: recvbuf
+        type(*), dimension(..), intent(in), asynchronous :: sendbuf
+        type(*), dimension(..), asynchronous :: recvbuf
         integer, intent(in) :: sendcount, recvcount
         type(MPI_Datatype), intent(in) :: sendtype, recvtype
         type(MPI_Comm), intent(in) :: comm
         type(MPI_Request), intent(out) :: request
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Ineighbor_allgather_f08ts
-end interface  MPI_Ineighbor_allgather
+end interface MPI_Ineighbor_allgather
 
-interface  MPI_Neighbor_allgatherv
+interface MPI_Neighbor_allgatherv
     subroutine MPI_Neighbor_allgatherv_f08ts(sendbuf, sendcount, sendtype, recvbuf, recvcounts, displs, &
-                                   recvtype, comm, ierror)
+                 recvtype, comm, ierror)
         use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm
         implicit none
         type(*), dimension(..), intent(in) :: sendbuf
@@ -3679,15 +3673,15 @@ interface  MPI_Neighbor_allgatherv
         type(MPI_Comm), intent(in) :: comm
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Neighbor_allgatherv_f08ts
-end interface  MPI_Neighbor_allgatherv
+end interface MPI_Neighbor_allgatherv
 
-interface  MPI_Ineighbor_allgatherv
+interface MPI_Ineighbor_allgatherv
     subroutine MPI_Ineighbor_allgatherv_f08ts(sendbuf, sendcount, sendtype, recvbuf, recvcounts, displs, &
-                                   recvtype, comm, request, ierror)
+                 recvtype, comm, request, ierror)
         use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm, MPI_Request
         implicit none
-        type(*), dimension(..), intent(in) :: sendbuf
-        type(*), dimension(..) :: recvbuf
+        type(*), dimension(..), intent(in), asynchronous :: sendbuf
+        type(*), dimension(..), asynchronous :: recvbuf
         integer, intent(in) :: sendcount
         integer, intent(in) :: recvcounts(*), displs(*)
         type(MPI_Datatype), intent(in) :: sendtype, recvtype
@@ -3695,11 +3689,11 @@ interface  MPI_Ineighbor_allgatherv
         type(MPI_Request), intent(out) :: request
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Ineighbor_allgatherv_f08ts
-end interface  MPI_Ineighbor_allgatherv
+end interface MPI_Ineighbor_allgatherv
 
-interface  MPI_Neighbor_alltoall
+interface MPI_Neighbor_alltoall
     subroutine MPI_Neighbor_alltoall_f08ts(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, &
-                                 comm, ierror)
+                 comm, ierror)
         use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm
         implicit none
         type(*), dimension(..), intent(in) :: sendbuf
@@ -3709,26 +3703,26 @@ interface  MPI_Neighbor_alltoall
         type(MPI_Comm), intent(in) :: comm
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Neighbor_alltoall_f08ts
-end interface  MPI_Neighbor_alltoall
+end interface MPI_Neighbor_alltoall
 
-interface  MPI_Ineighbor_alltoall
+interface MPI_Ineighbor_alltoall
     subroutine MPI_Ineighbor_alltoall_f08ts(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, &
-                                 comm, request, ierror)
+                 comm, request, ierror)
         use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm, MPI_Request
         implicit none
-        type(*), dimension(..), intent(in) :: sendbuf
-        type(*), dimension(..) :: recvbuf
+        type(*), dimension(..), intent(in), asynchronous :: sendbuf
+        type(*), dimension(..), asynchronous :: recvbuf
         integer, intent(in) :: sendcount, recvcount
         type(MPI_Datatype), intent(in) :: sendtype, recvtype
         type(MPI_Comm), intent(in) :: comm
         type(MPI_Request), intent(out) :: request
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Ineighbor_alltoall_f08ts
-end interface  MPI_Ineighbor_alltoall
+end interface MPI_Ineighbor_alltoall
 
-interface  MPI_Neighbor_alltoallv
+interface MPI_Neighbor_alltoallv
     subroutine MPI_Neighbor_alltoallv_f08ts(sendbuf, sendcounts, sdispls, sendtype, recvbuf, recvcounts, &
-                                  rdispls, recvtype, comm, ierror)
+                 rdispls, recvtype, comm, ierror)
         use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm
         implicit none
         type(*), dimension(..), intent(in) :: sendbuf
@@ -3738,55 +3732,68 @@ interface  MPI_Neighbor_alltoallv
         type(MPI_Comm), intent(in) :: comm
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Neighbor_alltoallv_f08ts
-end interface  MPI_Neighbor_alltoallv
+end interface MPI_Neighbor_alltoallv
 
-interface  MPI_Ineighbor_alltoallv
+interface MPI_Ineighbor_alltoallv
     subroutine MPI_Ineighbor_alltoallv_f08ts(sendbuf, sendcounts, sdispls, sendtype, recvbuf, recvcounts, &
-                                  rdispls, recvtype, comm, request, ierror)
+                 rdispls, recvtype, comm, request, ierror)
         use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm, MPI_Request
         implicit none
-        type(*), dimension(..), intent(in) :: sendbuf
-        type(*), dimension(..) :: recvbuf
+        type(*), dimension(..), intent(in), asynchronous :: sendbuf
+        type(*), dimension(..), asynchronous :: recvbuf
         integer, intent(in) :: sendcounts(*), sdispls(*), recvcounts(*), rdispls(*)
         type(MPI_Datatype), intent(in) :: sendtype, recvtype
         type(MPI_Comm), intent(in) :: comm
         type(MPI_Request), intent(in) :: request
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Ineighbor_alltoallv_f08ts
-end interface  MPI_Ineighbor_alltoallv
+end interface MPI_Ineighbor_alltoallv
 
-interface  MPI_Neighbor_alltoallw
+interface MPI_Neighbor_alltoallw
     subroutine MPI_Neighbor_alltoallw_f08ts(sendbuf, sendcounts, sdispls, sendtypes, recvbuf, recvcounts, &
-                                  rdispls, recvtypes, comm, ierror)
+                 rdispls, recvtypes, comm, ierror)
         use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm
-        use :: mpi_f08_constants, only : MPI_ADDRESS_KinD
+        use :: mpi_f08_compile_constants, only : MPI_ADDRESS_KIND
         implicit none
         type(*), dimension(..), intent(in) :: sendbuf
         type(*), dimension(..) :: recvbuf
         integer, intent(in) :: sendcounts(*), recvcounts(*)
-        integer(MPI_ADDRESS_KinD), intent(in) :: sdispls(*), rdispls(*)
+        integer(MPI_ADDRESS_KIND), intent(in) :: sdispls(*), rdispls(*)
         type(MPI_Datatype), intent(in) :: sendtypes(*), recvtypes(*)
         type(MPI_Comm), intent(in) :: comm
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Neighbor_alltoallw_f08ts
-end interface  MPI_Neighbor_alltoallw
+end interface MPI_Neighbor_alltoallw
 
-interface  MPI_Ineighbor_alltoallw
+interface MPI_Ineighbor_alltoallw
     subroutine MPI_Ineighbor_alltoallw_f08ts(sendbuf, sendcounts, sdispls, sendtypes, recvbuf, recvcounts, &
-                                  rdispls, recvtypes, comm, request, ierror)
+                 rdispls, recvtypes, comm, request, ierror)
         use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm, MPI_Request
-        use :: mpi_f08_constants, only : MPI_ADDRESS_KinD
+        use :: mpi_f08_compile_constants, only : MPI_ADDRESS_KIND
         implicit none
-        type(*), dimension(..), intent(in) :: sendbuf
-        type(*), dimension(..) :: recvbuf
+        type(*), dimension(..), intent(in), asynchronous :: sendbuf
+        type(*), dimension(..), asynchronous :: recvbuf
         integer, intent(in) :: sendcounts(*), recvcounts(*)
-        integer(MPI_ADDRESS_KinD), intent(in) :: sdispls(*), rdispls(*)
+        integer(MPI_ADDRESS_KIND), intent(in) :: sdispls(*), rdispls(*)
         type(MPI_Datatype), intent(in) :: sendtypes(*), recvtypes(*)
         type(MPI_Comm), intent(in) :: comm
         type(MPI_Request), intent(in) :: request
         integer, optional, intent(out) :: ierror
     end subroutine MPI_Ineighbor_alltoallw_f08ts
-end interface  MPI_Ineighbor_alltoallw
+end interface MPI_Ineighbor_alltoallw
 
+interface MPI_Wtick
+    function  MPI_Wtick_f08()
+        implicit none
+        double precision :: MPI_Wtick_f08
+    end function MPI_Wtick_f08
+end interface MPI_Wtick
+
+interface MPI_Wtime
+    function MPI_Wtime_f08()
+        implicit none
+        double precision :: MPI_Wtime_f08
+    end function MPI_Wtime_f08
+end interface MPI_Wtime
 
 end module mpi_f08
diff --git a/src/binding/fortran/use_mpi_f08/mpi_f08_callbacks.F90 b/src/binding/fortran/use_mpi_f08/mpi_f08_callbacks.F90
new file mode 100644
index 0000000..e891b0f
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/mpi_f08_callbacks.F90
@@ -0,0 +1,307 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+module mpi_f08_callbacks
+
+! MPI3.0, A.1.3,  p. 678
+
+public :: MPI_COMM_DUP_FN
+public :: MPI_COMM_NULL_COPY_FN
+public :: MPI_COMM_NULL_DELETE_FN
+public :: MPI_TYPE_DUP_FN
+public :: MPI_TYPE_NULL_COPY_FN
+public :: MPI_TYPE_NULL_DELETE_FN
+public :: MPI_WIN_DUP_FN
+public :: MPI_WIN_NULL_COPY_FN
+public :: MPI_WIN_NULL_DELETE_FN
+public :: MPI_CONVERSION_FN_NULL
+
+abstract interface
+
+subroutine MPI_User_function(invec, inoutvec, len, datatype) BIND(C)
+    use, intrinsic :: iso_c_binding, only : c_ptr
+    use mpi_f08_types, only : MPI_Datatype
+    implicit none
+    type(c_ptr), value :: invec, inoutvec
+    integer :: len
+    type(MPI_Datatype) :: datatype
+end subroutine
+
+subroutine MPI_Comm_copy_attr_function(oldcomm,comm_keyval,extra_state, &
+       attribute_val_in,attribute_val_out,flag,ierror) BIND(C)
+    use mpi_f08_types, only : MPI_Comm
+    use mpi_f08_compile_constants, only : MPI_ADDRESS_KIND
+    implicit none
+    type(MPI_Comm) :: oldcomm
+    integer :: comm_keyval, ierror
+    integer(kind=MPI_ADDRESS_KIND) :: extra_state, attribute_val_in, attribute_val_out
+    logical :: flag
+end subroutine
+
+subroutine MPI_Comm_delete_attr_function(comm,comm_keyval, &
+       attribute_val, extra_state, ierror) BIND(C)
+    use mpi_f08_types, only : MPI_Comm
+    use mpi_f08_compile_constants, only : MPI_ADDRESS_KIND
+    implicit none
+    type(MPI_Comm) :: comm
+    integer :: comm_keyval, ierror
+    integer(kind=MPI_ADDRESS_KIND) :: attribute_val, extra_state
+end subroutine
+
+subroutine MPI_Win_copy_attr_function(oldwin,win_keyval,extra_state, &
+       attribute_val_in,attribute_val_out,flag,ierror) BIND(C)
+    use mpi_f08_types, only : MPI_Win
+    use mpi_f08_compile_constants, only : MPI_ADDRESS_KIND
+    implicit none
+    type(MPI_Win) :: oldwin
+    integer :: win_keyval, ierror
+    integer(kind=MPI_ADDRESS_KIND) :: extra_state, attribute_val_in, attribute_val_out
+    logical :: flag
+end subroutine
+
+subroutine MPI_Win_delete_attr_function(win,win_keyval,attribute_val, &
+       extra_state,ierror) BIND(C)
+    use mpi_f08_types, only : MPI_Win
+    use mpi_f08_compile_constants, only : MPI_ADDRESS_KIND
+    implicit none
+    type(MPI_Win) :: win
+    integer :: win_keyval, ierror
+    integer(kind=MPI_ADDRESS_KIND) :: attribute_val, extra_state
+end subroutine
+
+subroutine MPI_Type_copy_attr_function(oldtype,type_keyval,extra_state, &
+       attribute_val_in,attribute_val_out,flag,ierror) BIND(C)
+    use mpi_f08_types, only : MPI_Datatype
+    use mpi_f08_compile_constants, only : MPI_ADDRESS_KIND
+    implicit none
+    type(MPI_Datatype) :: oldtype
+    integer :: type_keyval, ierror
+    integer(kind=MPI_ADDRESS_KIND) :: extra_state, attribute_val_in, attribute_val_out
+    logical :: flag
+end subroutine
+
+subroutine MPI_Type_delete_attr_function(datatype,type_keyval, &
+       attribute_val,extra_state,ierror) BIND(C)
+    use mpi_f08_types, only : MPI_Datatype
+    use mpi_f08_compile_constants, only : MPI_ADDRESS_KIND
+    implicit none
+    type(MPI_Datatype) :: datatype
+    integer :: type_keyval, ierror
+    integer(kind=MPI_ADDRESS_KIND) :: attribute_val, extra_state
+end subroutine
+
+subroutine MPI_Comm_errhandler_function(comm,error_code) BIND(C)
+    use mpi_f08_types, only : MPI_Comm
+    use mpi_f08_compile_constants, only : MPI_ADDRESS_KIND
+    implicit none
+    type(MPI_Comm) :: comm
+    integer :: error_code
+end subroutine
+
+subroutine MPI_Win_errhandler_function(win, error_code) BIND(C)
+    use mpi_f08_types, only : MPI_Win
+    use mpi_f08_compile_constants, only : MPI_ADDRESS_KIND
+    implicit none
+    type(MPI_Win) :: win
+    integer :: error_code
+end subroutine
+
+subroutine MPI_File_errhandler_function(file, error_code) BIND(C)
+    use mpi_f08_types, only : MPI_File
+    use mpi_f08_compile_constants, only : MPI_ADDRESS_KIND
+    implicit none
+    type(MPI_File) :: file
+    integer :: error_code
+end subroutine
+
+subroutine MPI_Grequest_query_function(extra_state,status,ierror) BIND(C)
+    use mpi_f08_types, only : MPI_Status
+    use mpi_f08_compile_constants, only : MPI_ADDRESS_KIND
+    implicit none
+    type(MPI_Status) :: status
+    integer :: ierror
+    integer(kind=MPI_ADDRESS_KIND) :: extra_state
+end subroutine
+
+subroutine MPI_Grequest_free_function(extra_state,ierror) BIND(C)
+    use mpi_f08_compile_constants, only : MPI_ADDRESS_KIND
+    implicit none
+    integer :: ierror
+    integer(kind=MPI_ADDRESS_KIND) :: extra_state
+end subroutine
+
+subroutine MPI_Grequest_cancel_function(extra_state,complete,ierror) BIND(C)
+    use mpi_f08_compile_constants, only : MPI_ADDRESS_KIND
+    implicit none
+    integer(kind=MPI_ADDRESS_KIND) :: extra_state
+    logical :: complete
+    integer :: ierror
+end subroutine
+
+subroutine MPI_Datarep_extent_function(datatype, extent, extra_state, ierror) BIND(C)
+    use mpi_f08_types, only : MPI_Datatype
+    use mpi_f08_compile_constants, only : MPI_ADDRESS_KIND
+    implicit none
+    type(MPI_Datatype) :: datatype
+    integer :: ierror
+    integer(kind=MPI_ADDRESS_KIND) :: extent, extra_state
+end subroutine
+
+subroutine MPI_Datarep_conversion_function(userbuf, datatype, count, &
+       filebuf, position, extra_state, ierror) BIND(C)
+    use, intrinsic :: iso_c_binding, only : c_ptr
+    use mpi_f08_types, only : MPI_Datatype
+    use mpi_f08_compile_constants, only : MPI_OFFSET_KIND, MPI_ADDRESS_KIND
+    implicit none
+    type(c_ptr), value :: userbuf, filebuf
+    type(MPI_Datatype) :: datatype
+    integer :: count, ierror
+    integer(kind=MPI_OFFSET_KIND) :: position
+    integer(kind=MPI_ADDRESS_KIND) :: extra_state
+end subroutine
+
+end interface
+
+contains
+
+! See p.269, MPI 3.0
+subroutine MPI_COMM_DUP_FN(oldcomm,comm_keyval,extra_state, &
+       attribute_val_in,attribute_val_out,flag,ierror)
+    use mpi_f08_types, only : MPI_Comm
+    use mpi_f08_compile_constants, only : MPI_ADDRESS_KIND, MPI_SUCCESS
+    implicit none
+    type(MPI_Comm) :: oldcomm
+    integer :: comm_keyval, ierror
+    integer(kind=MPI_ADDRESS_KIND) :: extra_state, attribute_val_in, attribute_val_out
+    logical :: flag
+
+    flag = .true.
+    attribute_val_out = attribute_val_in
+    ierror = MPI_SUCCESS
+end subroutine
+
+subroutine MPI_COMM_NULL_COPY_FN(oldcomm,comm_keyval,extra_state, &
+       attribute_val_in,attribute_val_out,flag,ierror)
+    use mpi_f08_types, only : MPI_Comm
+    use mpi_f08_compile_constants, only : MPI_ADDRESS_KIND, MPI_SUCCESS
+    implicit none
+    type(MPI_Comm) :: oldcomm
+    integer :: comm_keyval, ierror
+    integer(kind=MPI_ADDRESS_KIND) :: extra_state, attribute_val_in, attribute_val_out
+    logical :: flag
+
+    flag = .false.
+    ierror = MPI_SUCCESS
+end subroutine
+
+subroutine MPI_COMM_NULL_DELETE_FN(comm,comm_keyval, &
+       attribute_val, extra_state, ierror)
+    use mpi_f08_types, only : MPI_Comm
+    use mpi_f08_compile_constants, only : MPI_ADDRESS_KIND, MPI_SUCCESS
+    implicit none
+    type(MPI_Comm) :: comm
+    integer :: comm_keyval, ierror
+    integer(kind=MPI_ADDRESS_KIND) :: attribute_val, extra_state
+
+    ierror = MPI_SUCCESS
+end subroutine
+
+subroutine MPI_TYPE_DUP_FN(oldtype,type_keyval,extra_state, &
+       attribute_val_in,attribute_val_out,flag,ierror)
+    use mpi_f08_types, only : MPI_Datatype
+    use mpi_f08_compile_constants, only : MPI_ADDRESS_KIND, MPI_SUCCESS
+    implicit none
+    type(MPI_Datatype) :: oldtype
+    integer :: type_keyval, ierror
+    integer(kind=MPI_ADDRESS_KIND) :: extra_state, attribute_val_in, attribute_val_out
+    logical :: flag
+
+    flag = .true.
+    attribute_val_out = attribute_val_in
+    ierror = MPI_SUCCESS
+end subroutine
+
+subroutine MPI_TYPE_NULL_COPY_FN(oldtype,type_keyval,extra_state, &
+       attribute_val_in,attribute_val_out,flag,ierror)
+    use mpi_f08_types, only : MPI_Datatype
+    use mpi_f08_compile_constants, only : MPI_ADDRESS_KIND, MPI_SUCCESS
+    implicit none
+    type(MPI_Datatype) :: oldtype
+    integer :: type_keyval, ierror
+    integer(kind=MPI_ADDRESS_KIND) :: extra_state, attribute_val_in, attribute_val_out
+    logical :: flag
+
+    flag = .false.
+    ierror = MPI_SUCCESS
+end subroutine
+
+subroutine MPI_TYPE_NULL_DELETE_FN(type,type_keyval, &
+       attribute_val, extra_state, ierror)
+    use mpi_f08_types, only : MPI_Datatype
+    use mpi_f08_compile_constants, only : MPI_ADDRESS_KIND, MPI_SUCCESS
+    implicit none
+    type(MPI_Datatype) :: type
+    integer :: type_keyval, ierror
+    integer(kind=MPI_ADDRESS_KIND) :: attribute_val, extra_state
+
+    ierror = MPI_SUCCESS
+end subroutine
+
+subroutine MPI_WIN_DUP_FN(oldwin,win_keyval,extra_state, &
+       attribute_val_in,attribute_val_out,flag,ierror)
+    use mpi_f08_types, only : MPI_Win
+    use mpi_f08_compile_constants, only : MPI_ADDRESS_KIND, MPI_SUCCESS
+    implicit none
+    type(MPI_Win) :: oldwin
+    integer :: win_keyval, ierror
+    integer(kind=MPI_ADDRESS_KIND) :: extra_state, attribute_val_in, attribute_val_out
+    logical :: flag
+
+    flag = .true.
+    attribute_val_out = attribute_val_in
+    ierror = MPI_SUCCESS
+end subroutine
+
+subroutine MPI_WIN_NULL_COPY_FN(oldwin,win_keyval,extra_state, &
+       attribute_val_in,attribute_val_out,flag,ierror)
+    use mpi_f08_types, only : MPI_Win
+    use mpi_f08_compile_constants, only : MPI_ADDRESS_KIND, MPI_SUCCESS
+    implicit none
+    type(MPI_Win) :: oldwin
+    integer :: win_keyval, ierror
+    integer(kind=MPI_ADDRESS_KIND) :: extra_state, attribute_val_in, attribute_val_out
+    logical :: flag
+
+    flag = .false.
+    ierror = MPI_SUCCESS
+end subroutine
+
+subroutine MPI_WIN_NULL_DELETE_FN(win,win_keyval, &
+       attribute_val, extra_state, ierror)
+    use mpi_f08_types, only : MPI_Win
+    use mpi_f08_compile_constants, only : MPI_ADDRESS_KIND, MPI_SUCCESS
+    implicit none
+    type(MPI_Win) :: win
+    integer :: win_keyval, ierror
+    integer(kind=MPI_ADDRESS_KIND) :: attribute_val, extra_state
+
+    ierror = MPI_SUCCESS
+end subroutine
+
+subroutine MPI_CONVERSION_FN_NULL(userbuf, datatype, count, &
+       filebuf, position, extra_state, ierror) BIND(C)
+    use, intrinsic :: iso_c_binding, only : c_ptr
+    use mpi_f08_types, only : MPI_Datatype
+    use mpi_f08_compile_constants, only : MPI_OFFSET_KIND, MPI_ADDRESS_KIND
+    implicit none
+    type(c_ptr), value :: userbuf, filebuf
+    type(MPI_Datatype) :: datatype
+    integer :: count, ierror
+    integer(kind=MPI_OFFSET_KIND) :: position
+    integer(kind=MPI_ADDRESS_KIND) :: extra_state
+    ! Do nothing
+end subroutine
+
+end module mpi_f08_callbacks
diff --git a/src/binding/fortran/use_mpi_f08/mpi_f08_callbacks.f90 b/src/binding/fortran/use_mpi_f08/mpi_f08_callbacks.f90
deleted file mode 100644
index 97aadd0..0000000
--- a/src/binding/fortran/use_mpi_f08/mpi_f08_callbacks.f90
+++ /dev/null
@@ -1,151 +0,0 @@
-module mpi_f08_callbacks
-
-! MPI3.0, A.1.3,  p. 678
-
-abstract interface
-
-subroutine MPI_User_function(invec, inoutvec, len, datatype)
-    USE, intrinsic :: ISO_C_BINDING, only : C_PTR
-    USE mpi_f08_types, only : MPI_Datatype
-    implicit none
-    type(C_PTR), value :: invec, inoutvec
-    integer :: len
-    type(MPI_Datatype) :: datatype
-end subroutine
-
-subroutine MPI_Comm_copy_attr_function(oldcomm,comm_keyval,extra_state, &
-       attribute_val_in,attribute_val_out,flag,ierror)
-    USE mpi_f08_types, only : MPI_Comm
-    USE mpi_f08_constants, only : MPI_ADDRESS_KIND
-    implicit none
-    type(MPI_Comm) :: oldcomm
-    integer :: comm_keyval, ierror
-    integer(KIND=MPI_ADDRESS_KIND) :: extra_state, attribute_val_in, attribute_val_out
-    logical :: flag
-end subroutine
-
-subroutine MPI_Comm_delete_attr_function(comm,comm_keyval, &
-       attribute_val, extra_state, ierror)
-    USE mpi_f08_types, only : MPI_Comm
-    USE mpi_f08_constants, only : MPI_ADDRESS_KIND
-    implicit none
-    type(MPI_Comm) :: comm
-    integer :: comm_keyval, ierror
-    integer(KIND=MPI_ADDRESS_KIND) :: attribute_val, extra_state
-end subroutine
-
-subroutine MPI_Win_copy_attr_function(oldwin,win_keyval,extra_state, &
-       attribute_val_in,attribute_val_out,flag,ierror)
-    USE mpi_f08_types, only : MPI_Win
-    USE mpi_f08_constants, only : MPI_ADDRESS_KIND
-    implicit none
-    type(MPI_Win) :: oldwin
-    integer :: win_keyval, ierror
-    integer(KIND=MPI_ADDRESS_KIND) :: extra_state, attribute_val_in, attribute_val_out
-    logical :: flag
-end subroutine
-
-subroutine MPI_Win_delete_attr_function(win,win_keyval,attribute_val, &
-       extra_state,ierror)
-    USE mpi_f08_types, only : MPI_Win
-    USE mpi_f08_constants, only : MPI_ADDRESS_KIND
-    implicit none
-    type(MPI_Win) :: win
-    integer :: win_keyval, ierror
-    integer(KIND=MPI_ADDRESS_KIND) :: attribute_val, extra_state
-end subroutine
-
-subroutine MPI_Type_copy_attr_function(oldtype,type_keyval,extra_state, &
-       attribute_val_in,attribute_val_out,flag,ierror)
-    USE mpi_f08_types, only : MPI_Datatype
-    USE mpi_f08_constants, only : MPI_ADDRESS_KIND
-    implicit none
-    type(MPI_Datatype) :: oldtype
-    integer :: type_keyval, ierror
-    integer(KIND=MPI_ADDRESS_KIND) :: extra_state, attribute_val_in, attribute_val_out
-    logical :: flag
-end subroutine
-
-subroutine MPI_Type_delete_attr_function(datatype,type_keyval, &
-       attribute_val,extra_state,ierror)
-    USE mpi_f08_types, only : MPI_Datatype
-    USE mpi_f08_constants, only : MPI_ADDRESS_KIND
-    implicit none
-    type(MPI_Datatype) :: datatype
-    integer :: type_keyval, ierror
-    integer(KIND=MPI_ADDRESS_KIND) :: attribute_val, extra_state
-end subroutine
-
-subroutine MPI_Comm_errhandler_function(comm,error_code)
-    USE mpi_f08_types, only : MPI_Comm
-    USE mpi_f08_constants, only : MPI_ADDRESS_KIND
-    implicit none
-    type(MPI_Comm) :: comm
-    integer :: error_code
-end subroutine
-
-subroutine MPI_Win_errhandler_function(win, error_code)
-    USE mpi_f08_types, only : MPI_Win
-    USE mpi_f08_constants, only : MPI_ADDRESS_KIND
-    implicit none
-    type(MPI_Win) :: win
-    integer :: error_code
-end subroutine
-
-subroutine MPI_File_errhandler_function(file, error_code)
-    USE mpi_f08_types, only : MPI_File
-    USE mpi_f08_constants, only : MPI_ADDRESS_KIND
-    implicit none
-    type(MPI_File) :: file
-    integer :: error_code
-end subroutine
-
-    subroutine MPI_Grequest_query_function(extra_state,status,ierror)
-    USE mpi_f08_types, only : MPI_Status
-    USE mpi_f08_constants, only : MPI_ADDRESS_KIND
-    implicit none
-    type(MPI_Status) :: status
-    integer :: ierror
-    integer(KIND=MPI_ADDRESS_KIND) :: extra_state
-end subroutine
-
-subroutine MPI_Grequest_free_function(extra_state,ierror)
-    USE mpi_f08_constants, only : MPI_ADDRESS_KIND
-    implicit none
-    integer :: ierror
-    integer(KIND=MPI_ADDRESS_KIND) :: extra_state
-end subroutine
-
-subroutine MPI_Grequest_cancel_function(extra_state,complete,ierror)
-    USE mpi_f08_constants, only : MPI_ADDRESS_KIND
-    implicit none
-    integer(KIND=MPI_ADDRESS_KIND) :: extra_state
-    logical :: complete
-    integer :: ierror
-end subroutine
-
-subroutine MPI_Datarep_extent_function(datatype, extent, extra_state, ierror)
-    USE mpi_f08_types, only : MPI_Datatype
-    USE mpi_f08_constants, only : MPI_ADDRESS_KIND
-    implicit none
-    type(MPI_Datatype) :: datatype
-    integer :: ierror
-    integer(KIND=MPI_ADDRESS_KIND) :: extent, extra_state
-end subroutine
-
-subroutine MPI_Datarep_conversion_function(userbuf, datatype, count, &
-       filebuf, position, extra_state, ierror)
-    USE mpi_f08_types, only : MPI_Datatype
-    USE mpi_f08_constants, only : MPI_OFFSET_KIND, MPI_ADDRESS_KIND
-    USE, intrinsic :: ISO_C_BINDING, only : C_PTR
-    implicit none
-    type(C_PTR), value :: userbuf, filebuf
-    type(MPI_Datatype) :: datatype
-    integer :: count, ierror
-    integer(KIND=MPI_OFFSET_KIND) :: position
-    integer(KIND=MPI_ADDRESS_KIND) :: extra_state
-end subroutine
-
-end interface
-
-end module mpi_f08_callbacks
diff --git a/src/binding/fortran/use_mpi_f08/mpi_f08_constants.f90 b/src/binding/fortran/use_mpi_f08/mpi_f08_compile_constants.F90
similarity index 90%
rename from src/binding/fortran/use_mpi_f08/mpi_f08_constants.f90
rename to src/binding/fortran/use_mpi_f08/mpi_f08_compile_constants.F90
index c646915..ff086f0 100644
--- a/src/binding/fortran/use_mpi_f08/mpi_f08_constants.f90
+++ b/src/binding/fortran/use_mpi_f08/mpi_f08_compile_constants.F90
@@ -2,16 +2,16 @@
 ! From A.1.1
 ! The module also contains the conversion routines for mpi_status
 !
-! Module mpi_f08_constants is a helper module used by  mpi_f08
+! Module mpi_f08_compile_constants is a helper module used by  mpi_f08
 ! It is not defined in the spec and not intended for end users.
 !--------------------------------------------------------------
 
-module mpi_f08_constants
+module mpi_f08_compile_constants
 
-use,intrinsic :: iso_c_binding, only: c_int
+use,intrinsic :: iso_c_binding, only: c_int, c_ptr
 use,intrinsic :: iso_fortran_env, only: int32, int64, real32, real64
 use :: mpi_f08_types
-use :: mpi_c_interface_types, only: C_Aint, C_Count, C_Offset
+use :: mpi_c_interface_types, only: C_Aint, C_Count, C_Offset, c_Status
 
 !====================================================================
 ! Make names brought in from other modules private if they should not
@@ -133,21 +133,6 @@ integer,parameter ::  MPI_ERR_WIN          = 45
 !integer,parameter ::  MPI_T_ERR_PVAR_NO_STARTUP  = 999917  ! **** NEED VALUE
 integer,parameter ::  MPI_ERR_LASTCODE     = 1073741823
 
-! Buffer Address Constants
-! A.1.1 p. 663
-integer,protected,bind(c,name="MPI_BOTTOM")   :: MPI_BOTTOM
-integer,protected,bind(c,name="MPI_IN_PLACE") :: MPI_IN_PLACE
-
-! Similar Global variables
-! 2.5.4 pp 15-16
-integer,protected,bind(c,name="MPI_STATUS_IGNORE")   :: MPI_STATUS_IGNORE
-integer,protected,bind(c,name="MPI_STATUSES_IGNORE") :: MPI_STATUSES_IGNORE
-integer,protected,bind(c,name="MPI_ERRCODES_IGNORE") :: MPI_ERRCODES_IGNORE
-integer,protected,bind(c,name="MPI_ARGV_NULL")       :: MPI_ARGV_NULL
-integer,protected,bind(c,name="MPI_ARGVS_NULL")      :: MPI_ARGVS_NULL
-integer,protected,bind(c,name="MPI_UNWEIGHTED")      :: MPI_UNWEIGHTED
-integer,protected,bind(c,name="MPI_WEIGHTS_EMPTY")   :: MPI_WEIGHTS_EMPTY
-
 ! Assorted Constants
 ! A.1.1 p. 663
 integer,parameter ::  MPI_PROC_NULL      = -1
@@ -180,7 +165,7 @@ logical,parameter :: MPI_ASYNC_PROTECTS_NONBLOCKING = .true.  ! Value differs fr
 ! A.1.1 p. 664
 integer,parameter :: MPI_ADDRESS_KIND = C_Aint     ! Defined in mpi_C_types
 integer,parameter :: MPI_COUNT_KIND   = C_Count    ! Defined in mpi_C_types
-integer,parameter :: MPI_integer_KIND = KIND(0)
+integer,parameter :: MPI_INTEGER_KIND = KIND(0)
 integer,parameter :: MPI_OFFSET_KIND  = C_Offset   ! Defined in mpi_C_types
 
 ! Error Handling Specifiers
@@ -258,7 +243,7 @@ type(MPI_Datatype),parameter,private :: MPIx_I4       = MPI_Datatype( 1275069467
 type(MPI_Datatype),parameter,private :: MPIx_I8       = MPI_Datatype( 1275070491) ! 0x4c00081b
 type(MPI_Datatype),parameter,private :: MPIx_2I4      = MPI_Datatype( 1275070496) ! 0x4c000820
 type(MPI_Datatype),parameter,private :: MPIx_2I8      = MPI_Datatype( 1275072544) ! 0x4c001020
-type(MPI_Datatype),parameter :: MPI_integer           = merge(MPIx_I4, MPIx_I8,  dik==int32)
+type(MPI_Datatype),parameter :: MPI_INTEGER           = merge(MPIx_I4, MPIx_I8,  dik==int32)
 type(MPI_Datatype),parameter :: MPI_REAL              = merge(MPIx_R4, MPIx_R8,  drk==real32)
 type(MPI_Datatype),parameter :: MPI_DOUBLE_PRECISION  = merge(MPIx_R8, MPIx_R16, ddk==real64)
 type(MPI_Datatype),parameter :: MPI_COMPLEX           = merge(MPIx_C8, MPIx_C16, drk==real32)
@@ -275,11 +260,11 @@ type(MPI_Datatype),parameter :: MPI_CXX_LONG_DOUBLE_COMPLEX = MPI_Datatype( 1275
 ! Optional datatypes (Fortran)
 ! A.1.1 p. 666
 type(MPI_Datatype),parameter :: MPI_DOUBLE_COMPLEX    = merge(MPIx_C16,MPIx_C32, ddk==real64)
-type(MPI_Datatype),parameter :: MPI_integer1          = MPI_Datatype( 1275068717) ! 0x4c00012d
-type(MPI_Datatype),parameter :: MPI_integer2          = MPI_Datatype( 1275068975) ! 0x4c00022f
-type(MPI_Datatype),parameter :: MPI_integer4          = MPI_Datatype( 1275069488) ! 0x4c000430
-type(MPI_Datatype),parameter :: MPI_integer8          = MPI_Datatype( 1275070513) ! 0x4c000831
-type(MPI_Datatype),parameter :: MPI_integer16         = MPI_DATATYPE_NULL
+type(MPI_Datatype),parameter :: MPI_INTEGER1          = MPI_Datatype( 1275068717) ! 0x4c00012d
+type(MPI_Datatype),parameter :: MPI_INTEGER2          = MPI_Datatype( 1275068975) ! 0x4c00022f
+type(MPI_Datatype),parameter :: MPI_INTEGER4          = MPI_Datatype( 1275069488) ! 0x4c000430
+type(MPI_Datatype),parameter :: MPI_INTEGER8          = MPI_Datatype( 1275070513) ! 0x4c000831
+type(MPI_Datatype),parameter :: MPI_INTEGER16         = MPI_DATATYPE_NULL
 type(MPI_Datatype),parameter :: MPI_REAL2             = MPI_DATATYPE_NULL
 type(MPI_Datatype),parameter :: MPI_REAL4             = MPI_Datatype( 1275069479) ! 0x4c000427
 type(MPI_Datatype),parameter :: MPI_REAL8             = MPI_Datatype( 1275070505) ! 0x4c000829
@@ -402,30 +387,32 @@ integer,parameter :: MPI_MODE_WRONLY          = 4
 
 ! Datatype Decoding Constants
 ! A.1.1 p 672
-integer,parameter :: MPI_COMBINER_CONTIGUOUS     = 3
-integer,parameter :: MPI_COMBINER_DARRAY         = 15
-integer,parameter :: MPI_COMBINER_DUP            = 2
-integer,parameter :: MPI_COMBINER_F90_COMPLEX    = 17
-integer,parameter :: MPI_COMBINER_F90_integer    = 18
-integer,parameter :: MPI_COMBINER_F90_REAL       = 16
-integer,parameter :: MPI_COMBINER_HINDEXED       = 9
-integer,parameter :: MPI_COMBINER_HVECTOR        = 6
-integer,parameter :: MPI_COMBINER_INDEXED_BLOCK  = 10
-integer,parameter :: MPI_COMBINER_HINDEXED_BLOCK = 11
-integer,parameter :: MPI_COMBINER_INDEXED        = 7
-integer,parameter :: MPI_COMBINER_NAMED          = 1
-integer,parameter :: MPI_COMBINER_RESIZED        = 19
-integer,parameter :: MPI_COMBINER_STRUCT         = 13
-integer,parameter :: MPI_COMBINER_SUBARRAY       = 14
-integer,parameter :: MPI_COMBINER_VECTOR         = 4
-
+integer,parameter :: MPI_COMBINER_NAMED             = 1
+integer,parameter :: MPI_COMBINER_DUP               = 2
+integer,parameter :: MPI_COMBINER_CONTIGUOUS        = 3
+integer,parameter :: MPI_COMBINER_VECTOR            = 4
+integer,parameter :: MPI_COMBINER_HVECTOR_INTEGER   = 5
+integer,parameter :: MPI_COMBINER_HVECTOR           = 6
+integer,parameter :: MPI_COMBINER_INDEXED           = 7
+integer,parameter :: MPI_COMBINER_HINDEXED_INTEGER  = 8
+integer,parameter :: MPI_COMBINER_HINDEXED          = 9
+integer,parameter :: MPI_COMBINER_INDEXED_BLOCK     = 10
+integer,parameter :: MPI_COMBINER_STRUCT_INTEGER    = 11
+integer,parameter :: MPI_COMBINER_STRUCT            = 12
+integer,parameter :: MPI_COMBINER_SUBARRAY          = 13
+integer,parameter :: MPI_COMBINER_DARRAY            = 14
+integer,parameter :: MPI_COMBINER_F90_REAL          = 15
+integer,parameter :: MPI_COMBINER_F90_COMPLEX       = 16
+integer,parameter :: MPI_COMBINER_F90_INTEGER       = 17
+integer,parameter :: MPI_COMBINER_RESIZED           = 18
+integer,parameter :: MPI_COMBINER_HINDEXED_BLOCK    = 19
 
 ! Threads Constants
 ! A.1.1 p 672
+integer,parameter :: MPI_THREAD_SINGLE     = 0
 integer,parameter :: MPI_THREAD_FUNNELED   = 1
-integer,parameter :: MPI_THREAD_MULTIPLE   = 3
 integer,parameter :: MPI_THREAD_SERIALIZED = 2
-integer,parameter :: MPI_THREAD_SINGLE     = 0
+integer,parameter :: MPI_THREAD_MULTIPLE   = 3
 
 ! File Operation Constants, Part 1
 ! A.1.1 p 673
@@ -459,9 +446,6 @@ integer,parameter :: MPI_TYPECLASS_REAL    = 1
 ! Added constants defined in mpich 3 mpif.h file
 ! These are removed - See table 2.1, page 18 in the spec.
 ! but kept here for backward compatibility
-integer,parameter :: MPI_COMBINER_HVECTOR_integer  = 5
-integer,parameter :: MPI_COMBINER_HINDEXED_integer = 8
-integer,parameter :: MPI_COMBINER_STRUCT_integer  = 12
 type(MPI_Datatype),parameter :: MPI_LB                     = MPI_Datatype( 1275068432) ! 0x4c000010
 type(MPI_Datatype),parameter :: MPI_UB                     = MPI_Datatype( 1275068433) ! 0x4c000011
 
@@ -471,5 +455,5 @@ type(MPI_Datatype),parameter :: MPI_2DOUBLE_COMPLEX = MPI_Datatype( 1275076645)
 !!!!!! Similar mishandling here for -r8 case.
 
 
-END MODULE mpi_f08_constants
+END MODULE mpi_f08_compile_constants
 
diff --git a/src/binding/fortran/use_mpi_f08/mpi_f08_link_constants.F90 b/src/binding/fortran/use_mpi_f08/mpi_f08_link_constants.F90
new file mode 100644
index 0000000..ea3cb13
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/mpi_f08_link_constants.F90
@@ -0,0 +1,87 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+module mpi_f08_link_constants
+use, intrinsic :: iso_c_binding, only: c_ptr, c_int, c_char, c_loc
+use :: mpi_f08_types, only : MPI_Status
+use :: mpi_c_interface_types, only : c_Status
+
+implicit none
+
+! Named link time constants
+
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!
+! MPI_STATUS_IGNORE, MPI_STATUSES_IGNORE
+!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+! In MPICH C code, MPI_STATUS_IGNORE, MPI_STATUSES_IGNORE are pointers of bad address
+
+! Fortran programmers use these MPI_Status variables for INOUT status arguments
+type(MPI_Status), bind(C, name="MPIR_F08_MPI_STATUS_IGNORE_OBJ"), target :: MPI_STATUS_IGNORE
+type(MPI_Status), dimension(1), bind(C, name="MPIR_F08_MPI_STATUSES_IGNORE_OBJ"), target :: MPI_STATUSES_IGNORE
+
+type(c_ptr), bind(C, name="MPIR_C_MPI_STATUS_IGNORE") :: MPIR_C_MPI_STATUS_IGNORE
+type(c_ptr), bind(C, name="MPIR_C_MPI_STATUSES_IGNORE") :: MPIR_C_MPI_STATUSES_IGNORE
+
+! Though these two variables are required by MPI-3 Standard, they are not used in MPICH
+type(c_ptr), bind(C, name="MPI_F08_STATUS_IGNORE")   :: MPI_F08_STATUS_IGNORE   ! Point to MPI_STATUS_IGNORE
+type(c_ptr), bind(C, name="MPI_F08_STATUSES_IGNORE") :: MPI_F08_STATUSES_IGNORE ! Point to MPI_STATUSES_IGNORE
+
+
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!
+!  MPI_ARGV_NULL, MPI_ARGVS_NULL
+!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! In MPICH C code, MPI_ARGV_NULL and MPI_ARGVS_NULL are NULL pointers
+character(len=1), dimension(1), target :: MPI_ARGV_NULL
+character(len=1), dimension(1,1), target :: MPI_ARGVS_NULL
+
+type(c_ptr), bind(C, name="MPIR_C_MPI_ARGV_NULL") :: MPIR_C_MPI_ARGV_NULL
+type(c_ptr), bind(C, name="MPIR_C_MPI_ARGVS_NULL") :: MPIR_C_MPI_ARGVS_NULL
+
+
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!
+!  MPI_ERRCODES_IGNORE
+!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+integer, dimension(1), target :: MPI_ERRCODES_IGNORE
+type(c_ptr), bind(C, name="MPIR_C_MPI_ERRCODES_IGNORE") :: MPIR_C_MPI_ERRCODES_IGNORE
+
+
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!
+!  MPI_UNWEIGHTED, MPI_WEIGHTS_EMPTY
+!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! Type of MPI_UNWEIGHTED and MPI_WEIGHTS_EMPTY is not integer(c_int) since we only care their address
+
+integer, dimension(1), target :: MPI_UNWEIGHTED
+integer, dimension(1), target :: MPI_WEIGHTS_EMPTY
+
+type(c_ptr), protected, bind(C, name="MPIR_C_MPI_UNWEIGHTED")    :: MPIR_C_MPI_UNWEIGHTED
+type(c_ptr), protected, bind(C, name="MPIR_C_MPI_WEIGHTS_EMPTY") :: MPIR_C_MPI_WEIGHTS_EMPTY
+
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!
+!  MPI_IN_PLACE
+!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+integer, bind(C, name="MPIR_F08_MPI_IN_PLACE_OBJ"), target :: MPI_IN_PLACE
+type(c_ptr), bind(C, name="MPIR_F08_MPI_IN_PLACE") :: MPIR_F08_MPI_IN_PLACE ! Point to MPI_IN_PLACE
+
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!
+!  MPI_BOTTOM
+!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! Buffer Address Constants
+! A.1.1 p. 663
+integer, pointer :: MPI_BOTTOM => NULL()
+
+end module mpi_f08_link_constants
diff --git a/src/binding/fortran/use_mpi_f08/mpi_f08_types.F90 b/src/binding/fortran/use_mpi_f08/mpi_f08_types.F90
new file mode 100644
index 0000000..fe27fe8
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/mpi_f08_types.F90
@@ -0,0 +1,1262 @@
+! MPI 3 Data types for Fortran.
+! From A.1.2, pp 676-677
+! Note added MPI_Message type not in the spec by mistake
+!
+!--------------------------------------------------------------
+
+module mpi_f08_types
+use, intrinsic :: iso_c_binding, only: c_int
+use :: mpi_c_interface_types, only: c_Count, c_Status
+
+implicit none
+
+private :: c_int, c_Count, c_Status
+
+! F08 derived types
+! A.1.2  p 677
+
+type, bind(C) :: MPI_Comm
+    integer :: MPI_VAL
+end type MPI_Comm
+
+type, bind(C) :: MPI_Datatype
+    integer :: MPI_VAL
+end type MPI_Datatype
+
+type, bind(C) :: MPI_Errhandler
+    integer :: MPI_VAL
+end type MPI_Errhandler
+
+type, bind(C) :: MPI_File
+    integer :: MPI_VAL
+end type MPI_File
+
+type, bind(C) :: MPI_Group
+    integer :: MPI_VAL
+end type MPI_Group
+
+type, bind(C) :: MPI_Info
+    integer :: MPI_VAL
+end type MPI_Info
+
+type, bind(C) :: MPI_Op
+    integer :: MPI_VAL
+end type MPI_Op
+
+type, bind(C) :: MPI_Request
+    integer :: MPI_VAL
+end type MPI_Request
+
+type, bind(C) :: MPI_Win
+    integer :: MPI_VAL
+end type MPI_Win
+
+type, bind(C) :: MPI_Message
+    integer :: MPI_VAL
+end type MPI_Message
+
+! Fortran 2008 struct for status. Must be consistent with mpi.h, mpif.h
+type, bind(C) :: MPI_Status
+    integer(c_int) :: count_lo;
+    integer(c_int) :: count_hi_and_cancelled;
+    integer :: MPI_SOURCE ! Not conform to MPI_Status in C if integer kind is not c_int
+    integer :: MPI_TAG
+    integer :: MPI_ERROR
+end type MPI_Status
+
+! Fortran subscript constants
+! 3.2.5  p 30, and A.1.1 p 664
+integer,parameter :: MPI_SOURCE = 3
+integer,parameter :: MPI_TAG    = 4
+integer,parameter :: MPI_ERROR  = 5
+integer,parameter :: MPI_STATUS_SIZE = 5
+
+interface assignment(=)
+    module procedure mpi_status_f08_assgn_c
+    module procedure mpi_status_c_assgn_f08
+end interface
+
+private :: mpi_status_f08_assgn_c
+private :: mpi_status_c_assgn_f08
+private :: mpi_status_f_assgn_c
+private :: mpi_status_c_assgn_f
+
+! Required operator overloads for == and /= for opaque handles
+! 2.5.1 pp 12-13
+
+interface operator(==)
+    module procedure mpi_comm_eq
+    module procedure mpi_datatype_eq
+    module procedure mpi_errhandler_eq
+    module procedure mpi_file_eq
+    module procedure mpi_group_eq
+    module procedure mpi_info_eq
+    module procedure mpi_op_eq
+    module procedure mpi_request_eq
+    module procedure mpi_win_eq
+    module procedure mpi_message_eq
+
+    module procedure mpi_comm_f08_eq_f
+    module procedure mpi_comm_f_eq_f08
+    module procedure mpi_datatype_f08_eq_f
+    module procedure mpi_datatype_f_eq_f08
+    module procedure mpi_errhandler_f08_eq_f
+    module procedure mpi_errhandler_f_eq_f08
+    module procedure mpi_file_f08_eq_f
+    module procedure mpi_file_f_eq_f08
+    module procedure mpi_group_f08_eq_f
+    module procedure mpi_group_f_eq_f08
+    module procedure mpi_info_f08_eq_f
+    module procedure mpi_info_f_eq_f08
+    module procedure mpi_op_f08_eq_f
+    module procedure mpi_op_f_eq_f08
+    module procedure mpi_request_f08_eq_f
+    module procedure mpi_request_f_eq_f08
+    module procedure mpi_win_f08_eq_f
+    module procedure mpi_win_f_eq_f08
+    module procedure mpi_message_f08_eq_f
+    module procedure mpi_message_f_eq_f08
+end interface
+
+private :: mpi_comm_eq
+private :: mpi_datatype_eq
+private :: mpi_errhandler_eq
+private :: mpi_file_eq
+private :: mpi_group_eq
+private :: mpi_info_eq
+private :: mpi_op_eq
+private :: mpi_request_eq
+private :: mpi_win_eq
+private :: mpi_message_eq
+
+private :: mpi_comm_f08_eq_f
+private :: mpi_comm_f_eq_f08
+private :: mpi_datatype_f08_eq_f
+private :: mpi_datatype_f_eq_f08
+private :: mpi_errhandler_f08_eq_f
+private :: mpi_errhandler_f_eq_f08
+private :: mpi_file_f08_eq_f
+private :: mpi_file_f_eq_f08
+private :: mpi_group_f08_eq_f
+private :: mpi_group_f_eq_f08
+private :: mpi_info_f08_eq_f
+private :: mpi_info_f_eq_f08
+private :: mpi_op_f08_eq_f
+private :: mpi_op_f_eq_f08
+private :: mpi_request_f08_eq_f
+private :: mpi_request_f_eq_f08
+private :: mpi_win_f08_eq_f
+private :: mpi_win_f_eq_f08
+private :: mpi_message_f08_eq_f
+private :: mpi_message_f_eq_f08
+
+interface operator(/=)
+    module procedure mpi_comm_neq
+    module procedure mpi_datatype_neq
+    module procedure mpi_errhandler_neq
+    module procedure mpi_file_neq
+    module procedure mpi_group_neq
+    module procedure mpi_info_neq
+    module procedure mpi_op_neq
+    module procedure mpi_request_neq
+    module procedure mpi_win_neq
+    module procedure mpi_message_neq
+
+    module procedure mpi_comm_f08_ne_f
+    module procedure mpi_comm_f_ne_f08
+    module procedure mpi_datatype_f08_ne_f
+    module procedure mpi_datatype_f_ne_f08
+    module procedure mpi_errhandler_f08_ne_f
+    module procedure mpi_errhandler_f_ne_f08
+    module procedure mpi_file_f08_ne_f
+    module procedure mpi_file_f_ne_f08
+    module procedure mpi_group_f08_ne_f
+    module procedure mpi_group_f_ne_f08
+    module procedure mpi_info_f08_ne_f
+    module procedure mpi_info_f_ne_f08
+    module procedure mpi_op_f08_ne_f
+    module procedure mpi_op_f_ne_f08
+    module procedure mpi_request_f08_ne_f
+    module procedure mpi_request_f_ne_f08
+    module procedure mpi_win_f08_ne_f
+    module procedure mpi_win_f_ne_f08
+    module procedure mpi_message_f08_ne_f
+    module procedure mpi_message_f_ne_f08
+end interface
+
+private :: mpi_comm_neq
+private :: mpi_datatype_neq
+private :: mpi_errhandler_neq
+private :: mpi_file_neq
+private :: mpi_group_neq
+private :: mpi_info_neq
+private :: mpi_op_neq
+private :: mpi_request_neq
+private :: mpi_win_neq
+private :: mpi_message_neq
+
+private :: mpi_comm_f08_ne_f
+private :: mpi_comm_f_ne_f08
+private :: mpi_datatype_f08_ne_f
+private :: mpi_datatype_f_ne_f08
+private :: mpi_errhandler_f08_ne_f
+private :: mpi_errhandler_f_ne_f08
+private :: mpi_file_f08_ne_f
+private :: mpi_file_f_ne_f08
+private :: mpi_group_f08_ne_f
+private :: mpi_group_f_ne_f08
+private :: mpi_info_f08_ne_f
+private :: mpi_info_f_ne_f08
+private :: mpi_op_f08_ne_f
+private :: mpi_op_f_ne_f08
+private :: mpi_request_f08_ne_f
+private :: mpi_request_f_ne_f08
+private :: mpi_win_f08_ne_f
+private :: mpi_win_f_ne_f08
+private :: mpi_message_f08_ne_f
+private :: mpi_message_f_ne_f08
+
+
+! MPI_Sizeof in 17.1.9
+
+interface MPI_Sizeof
+    module procedure MPI_Sizeof_character
+    module procedure MPI_Sizeof_logical
+
+    module procedure MPI_Sizeof_xint8
+    module procedure MPI_Sizeof_xint16
+    module procedure MPI_Sizeof_xint32
+    module procedure MPI_Sizeof_xint64
+    module procedure MPI_Sizeof_xreal32
+    module procedure MPI_Sizeof_xreal64
+    module procedure MPI_Sizeof_xreal128
+    module procedure MPI_Sizeof_xcomplex32
+    module procedure MPI_Sizeof_xcomplex64
+    module procedure MPI_Sizeof_xcomplex128
+end interface
+
+private :: MPI_Sizeof_character
+private :: MPI_Sizeof_logical
+
+private :: MPI_Sizeof_xint8
+private :: MPI_Sizeof_xint16
+private :: MPI_Sizeof_xint32
+private :: MPI_Sizeof_xint64
+private :: MPI_Sizeof_xreal32
+private :: MPI_Sizeof_xreal64
+private :: MPI_Sizeof_xreal128
+private :: MPI_Sizeof_xcomplex32
+private :: MPI_Sizeof_xcomplex64
+private :: MPI_Sizeof_xcomplex128
+
+contains
+
+!--> MPI_Sizeof in 17.1.9,  specifics
+
+subroutine MPI_Sizeof_character (x, size, ierror)
+    character, dimension(..) :: x
+    integer, intent(out) :: size
+    integer, optional,  intent(out) :: ierror
+
+    size = storage_size(x)/8
+    if (present(ierror)) ierror = 0
+end subroutine MPI_Sizeof_character
+
+subroutine MPI_Sizeof_logical (x, size, ierror)
+    logical, dimension(..) :: x
+    integer, intent(out) :: size
+    integer, optional,  intent(out) :: ierror
+
+    size = storage_size(x)/8
+    if (present(ierror)) ierror = 0
+end subroutine MPI_Sizeof_logical
+
+subroutine MPI_Sizeof_xint8 (x, size, ierror)
+    use,intrinsic :: iso_fortran_env, only: int8
+    integer(int8),dimension(..) :: x
+    integer, intent(out) :: size
+    integer, optional,  intent(out) :: ierror
+
+    size = storage_size(x)/8
+    if (present(ierror)) ierror = 0
+end subroutine MPI_Sizeof_xint8
+
+subroutine MPI_Sizeof_xint16 (x, size, ierror)
+    use,intrinsic :: iso_fortran_env, only: int16
+    integer(int16),dimension(..) :: x
+    integer, intent(out) :: size
+    integer, optional,  intent(out) :: ierror
+
+    size = storage_size(x)/8
+    if (present(ierror)) ierror = 0
+end subroutine MPI_Sizeof_xint16
+
+subroutine MPI_Sizeof_xint32 (x, size, ierror)
+    use,intrinsic :: iso_fortran_env, only: int32
+    integer(int32),dimension(..) :: x
+    integer, intent(out) :: size
+    integer, optional,  intent(out) :: ierror
+
+    size = storage_size(x)/8
+    if (present(ierror)) ierror = 0
+end subroutine MPI_Sizeof_xint32
+
+subroutine MPI_Sizeof_xint64 (x, size, ierror)
+    use,intrinsic :: iso_fortran_env, only: int64
+    integer(int64),dimension(..) :: x
+    integer, intent(out) :: size
+    integer, optional,  intent(out) :: ierror
+
+    size = storage_size(x)/8
+    if (present(ierror)) ierror = 0
+end subroutine MPI_Sizeof_xint64
+
+subroutine MPI_Sizeof_xreal32 (x, size, ierror)
+    use,intrinsic :: iso_fortran_env, only: real32, int32
+    real(real32),dimension(..) :: x
+    integer, intent(out) :: size
+    integer, optional,  intent(out) :: ierror
+
+    size = storage_size(x)/8
+    ierror = 0
+end subroutine MPI_Sizeof_xreal32
+
+subroutine MPI_Sizeof_xreal64 (x, size, ierror)
+    use,intrinsic :: iso_fortran_env, only: real64
+    real(real64),dimension(..) :: x
+    integer, intent(out) :: size
+    integer, optional,  intent(out) :: ierror
+
+    size = storage_size(x)/8
+    ierror = 0
+end subroutine MPI_Sizeof_xreal64
+
+subroutine MPI_Sizeof_xreal128 (x, size, ierror)
+    use,intrinsic :: iso_fortran_env, only: real128
+    real(real128),dimension(..) :: x
+    integer, intent(out) :: size
+    integer, optional,  intent(out) :: ierror
+
+    size = storage_size(x)/8
+    ierror = 0
+end subroutine MPI_Sizeof_xreal128
+
+subroutine MPI_Sizeof_xcomplex32 (x, size, ierror)
+    use,intrinsic :: iso_fortran_env, only: real32
+    complex(real32),dimension(..) :: x
+    integer, intent(out) :: size
+    integer, optional,  intent(out) :: ierror
+
+    size = storage_size(x)/8
+    ierror = 0
+end subroutine MPI_Sizeof_xcomplex32
+
+subroutine MPI_Sizeof_xcomplex64 (x, size, ierror)
+    use,intrinsic :: iso_fortran_env, only: real64
+    complex(real64),dimension(..) :: x
+    integer, intent(out) :: size
+    integer, optional,  intent(out) :: ierror
+
+    size = storage_size(x)/8
+    ierror = 0
+end subroutine MPI_Sizeof_xcomplex64
+
+subroutine MPI_Sizeof_xcomplex128 (x, size, ierror)
+    use,intrinsic :: iso_fortran_env, only: real128
+    complex(real128),dimension(..) :: x
+    integer, intent(out) :: size
+    integer, optional,  intent(out) :: ierror
+
+    size = storage_size(x)/8
+    ierror = 0
+end subroutine MPI_Sizeof_xcomplex128
+
+elemental subroutine mpi_status_f08_assgn_c (status_f08, status_c)
+    ! Defined status_f08 = status_c
+    type(MPI_Status),intent(out) :: status_f08
+    type(c_Status),intent(in)    :: status_c
+
+    status_f08%count_lo   = status_c%count_lo
+    status_f08%count_hi_and_cancelled  = status_c%count_hi_and_cancelled
+    status_f08%mpi_source = status_c%mpi_source
+    status_f08%mpi_tag    = status_c%mpi_tag
+    status_f08%mpi_error  = status_c%mpi_error
+end subroutine mpi_status_f08_assgn_c
+
+elemental subroutine mpi_status_c_assgn_f08 (status_c, status_f08)
+    ! Defined status_c = status_f08
+    type(c_Status),intent(out) :: status_c
+    type(MPI_Status),intent(in) :: status_f08
+
+    status_c%count_lo   = status_f08%count_lo
+    status_c%count_hi_and_cancelled  = status_f08%count_hi_and_cancelled
+    status_c%mpi_source = status_f08%mpi_source
+    status_c%mpi_tag    = status_f08%mpi_tag
+    status_c%mpi_error  = status_f08%mpi_error
+end subroutine mpi_status_c_assgn_f08
+
+subroutine mpi_status_f_assgn_c (status_f, status_c)
+    ! Defined status_f = status_c
+    use,intrinsic :: iso_fortran_env, only: int32
+    integer,intent(out) :: status_f(MPI_STATUS_SIZE)
+    type (c_Status),intent(in) :: status_c
+
+    status_f(1) = status_c%count_lo
+    status_f(2) = status_c%count_hi_and_cancelled
+    status_f(MPI_SOURCE) = status_c%mpi_source
+    status_f(MPI_TAG)    = status_c%mpi_tag
+    status_f(MPI_ERROR)  = status_c%mpi_error
+end subroutine mpi_status_f_assgn_c
+
+subroutine mpi_status_c_assgn_f (status_c, status_f)
+    ! Defined status_c = status_f
+    use,intrinsic :: iso_fortran_env, only: int32
+    integer,intent(in) :: status_f(MPI_STATUS_SIZE)
+    integer(C_count) :: cnt
+    type(c_Status),intent(out) :: status_c
+
+    status_c%count_lo   = status_f(1);
+    status_c%count_hi_and_cancelled  = status_f(2);
+    status_c%mpi_source = status_f(MPI_SOURCE)
+    status_c%mpi_tag    = status_f(MPI_TAG)
+    status_c%mpi_error  = status_f(MPI_ERROR)
+end subroutine mpi_status_c_assgn_f
+
+! int MPI_Status_f082c(const MPI_F08_status *status_f08, MPI_Status *status_c)
+
+function MPI_Status_f082c (status_f08, status_c) &
+          bind(C, name="MPI_Status_f082c") result (res)
+    use,intrinsic :: iso_c_binding, only: c_int
+    type(MPI_Status),intent(in):: status_f08
+    type(c_Status),intent(out) :: status_c
+    integer(c_int)             :: res
+
+    status_c = status_f08
+    res = 0
+end function MPI_Status_f082c
+
+function PMPI_Status_f082c (status_f08, status_c) &
+            bind(C, name="PMPI_Status_f082c") result (res)
+    use,intrinsic :: iso_c_binding, only: c_int
+    type(MPI_Status),intent(in):: status_f08
+    type(c_Status),intent(out) :: status_c
+    integer(c_int)             :: res
+
+    status_c = status_f08
+    res = 0
+end function PMPI_Status_f082c
+
+! int MPI_Status_c2f08(const MPI_Status *status_c, MPI_F08_status *status_f08)
+
+function MPI_Status_c2f08 (status_c, status_f08) &
+              bind(C, name="MPI_Status_c2f08") result (res)
+    use,intrinsic :: iso_c_binding, only: c_int
+    type(MPI_Status),intent(in):: status_c
+    type(c_Status),intent(out) :: status_f08
+    integer(c_int)             :: res
+
+    status_f08 = status_c
+    res = 0
+end function MPI_Status_c2f08
+
+function PMPI_Status_c2f08 (status_c, status_f08) &
+              bind(C, name="PMPI_Status_c2f08") result (res)
+    use,intrinsic :: iso_c_binding, only: c_int
+    type(MPI_Status),intent(in):: status_c
+    type(c_Status),intent(out) :: status_f08
+    integer(c_int)             :: res
+
+    status_f08 = status_c
+    res = 0
+end function PMPI_Status_c2f08
+
+function mpi_comm_eq (x, y) result(res)
+    type(MPI_Comm), intent(in) :: x, y
+    logical :: res
+    res = (x%MPI_VAL == y%MPI_VAL)
+end function mpi_comm_eq
+
+function mpi_datatype_eq (x, y) result(res)
+    type(MPI_Datatype), intent(in) :: x, y
+    logical :: res
+    res = (x%MPI_VAL == y%MPI_VAL)
+end function mpi_datatype_eq
+
+function mpi_errhandler_eq (x, y) result(res)
+    type(MPI_Errhandler), intent(in) :: x, y
+    logical :: res
+    res = (x%MPI_VAL == y%MPI_VAL)
+end function mpi_errhandler_eq
+
+function mpi_file_eq (x, y) result(res)
+    type(MPI_File), intent(in) :: x, y
+    logical :: res
+    res = (x%MPI_VAL == y%MPI_VAL)
+end function mpi_File_eq
+
+function mpi_group_eq (x, y) result(res)
+    type(MPI_Group), intent(in) :: x, y
+    logical :: res
+    res = (x%MPI_VAL == y%MPI_VAL)
+end function mpi_group_eq
+
+function mpi_info_eq (x, y) result(res)
+    type(MPI_Info), intent(in) :: x, y
+    logical :: res
+    res = (x%MPI_VAL == y%MPI_VAL)
+end function mpi_info_eq
+
+function mpi_op_eq (x, y) result(res)
+    type(MPI_Op), intent(in) :: x, y
+    logical :: res
+    res = (x%MPI_VAL == y%MPI_VAL)
+end function mpi_op_eq
+
+function mpi_request_eq (x, y) result(res)
+    type(MPI_Request), intent(in) :: x, y
+    logical :: res
+    res = (x%MPI_VAL == y%MPI_VAL)
+end function mpi_request_eq
+
+function mpi_win_eq (x, y) result(res)
+    type(MPI_Win), intent(in) :: x, y
+    logical :: res
+    res = (x%MPI_VAL == y%MPI_VAL)
+end function mpi_win_eq
+
+function mpi_message_eq (x, y) result(res)
+    type(MPI_Message), intent(in) :: x, y
+    logical :: res
+    res = (x%MPI_VAL == y%MPI_VAL)
+end function mpi_message_eq
+
+function mpi_comm_f08_eq_f (f08, f) result(res)
+    ! Defined comparison for MPI_Comm and integer handles
+    type(MPI_Comm),intent(in) :: f08
+    integer,intent(in)        :: f
+    logical                   :: res
+    res = f08%MPI_VAL == f
+end function mpi_comm_f08_eq_f
+
+function mpi_comm_f_eq_f08 (f, f08) result(res)
+    ! Defined comparison for MPI_Comm and integer handles
+    type(MPI_Comm),intent(in) :: f08
+    integer,intent(in)        :: f
+    logical                   :: res
+    res = f08%MPI_VAL == f
+end function mpi_comm_f_eq_f08
+
+function mpi_datatype_f08_eq_f (f08, f) result(res)
+    ! Defined comparison for MPI_Datatype and integer handles
+    type(MPI_Datatype),intent(in) :: f08
+    integer,intent(in)        :: f
+    logical                   :: res
+    res = f08%MPI_VAL == f
+end function mpi_datatype_f08_eq_f
+
+function mpi_datatype_f_eq_f08 (f, f08) result(res)
+    ! Defined comparison for MPI_Datatype and integer handles
+    type(MPI_Datatype),intent(in) :: f08
+    integer,intent(in)        :: f
+    logical                   :: res
+    res = f08%MPI_VAL == f
+end function mpi_datatype_f_eq_f08
+
+function mpi_errhandler_f08_eq_f (f08, f) result(res)
+    ! Defined comparison for MPI_Errhandler and integer handles
+    type(MPI_Errhandler),intent(in) :: f08
+    integer,intent(in)        :: f
+    logical                   :: res
+    res = f08%MPI_VAL == f
+end function mpi_errhandler_f08_eq_f
+
+function mpi_errhandler_f_eq_f08 (f, f08) result(res)
+    ! Defined comparison for MPI_Errhandler and integer handles
+    type(MPI_Errhandler),intent(in) :: f08
+    integer,intent(in)        :: f
+    logical                   :: res
+    res = f08%MPI_VAL == f
+end function mpi_errhandler_f_eq_f08
+
+function mpi_file_f_eq_f08 (f, f08) result(res)
+    ! Defined comparison for MPI_File and integer handles
+    type(MPI_File),intent(in) :: f08
+    integer,intent(in)        :: f
+    logical                   :: res
+    res = f08%MPI_VAL == f
+end function mpi_file_f_eq_f08
+
+function mpi_file_f08_eq_f (f08, f) result(res)
+    ! Defined comparison for MPI_File and integer handles
+    type(MPI_File),intent(in) :: f08
+    integer,intent(in)        :: f
+    logical                   :: res
+    res = f08%MPI_VAL == f
+end function mpi_file_f08_eq_f
+
+function mpi_group_f08_eq_f (f08, f) result(res)
+    ! Defined comparison for MPI_Group and integer handles
+    type(MPI_Group),intent(in) :: f08
+    integer,intent(in)        :: f
+    logical                   :: res
+    res = f08%MPI_VAL == f
+end function mpi_group_f08_eq_f
+
+function mpi_group_f_eq_f08 (f, f08) result(res)
+    ! Defined comparison for MPI_Group and integer handles
+    type(MPI_Group),intent(in) :: f08
+    integer,intent(in)        :: f
+    logical                   :: res
+    res = f08%MPI_VAL == f
+end function mpi_group_f_eq_f08
+
+function mpi_info_f08_eq_f (f08, f) result(res)
+    ! Defined comparison for MPI_Info and integer handles
+    type(MPI_Info),intent(in) :: f08
+    integer,intent(in)        :: f
+    logical                   :: res
+    res = f08%MPI_VAL == f
+end function mpi_info_f08_eq_f
+
+function mpi_info_f_eq_f08 (f, f08) result(res)
+    ! Defined comparison for MPI_Info and integer handles
+    type(MPI_Info),intent(in) :: f08
+    integer,intent(in)        :: f
+    logical                   :: res
+    res = f08%MPI_VAL == f
+end function mpi_info_f_eq_f08
+
+function mpi_op_f08_eq_f (f08, f) result(res)
+    ! Defined comparison for MPI_Op and integer handles
+    type(MPI_Op),intent(in) :: f08
+    integer,intent(in)        :: f
+    logical                   :: res
+    res = f08%MPI_VAL == f
+end function mpi_op_f08_eq_f
+
+function mpi_op_f_eq_f08 (f, f08) result(res)
+    ! Defined comparison for MPI_Op and integer handles
+    type(MPI_Op),intent(in) :: f08
+    integer,intent(in)        :: f
+    logical                   :: res
+    res = f08%MPI_VAL == f
+end function mpi_op_f_eq_f08
+
+function mpi_request_f08_eq_f (f08, f) result(res)
+    ! Defined comparison for MPI_Request and integer handles
+    type(MPI_Request),intent(in) :: f08
+    integer,intent(in)        :: f
+    logical                   :: res
+    res = f08%MPI_VAL == f
+end function mpi_request_f08_eq_f
+
+function mpi_request_f_eq_f08 (f, f08) result(res)
+    ! Defined comparison for MPI_Request and integer handles
+    type(MPI_Request),intent(in) :: f08
+    integer,intent(in)        :: f
+    logical                   :: res
+    res = f08%MPI_VAL == f
+end function mpi_request_f_eq_f08
+
+function mpi_win_f08_eq_f (f08, f) result(res)
+    ! Defined comparison for MPI_Win and integer handles
+    type(MPI_Win),intent(in) :: f08
+    integer,intent(in)        :: f
+    logical                   :: res
+    res = f08%MPI_VAL == f
+end function mpi_win_f08_eq_f
+
+function mpi_win_f_eq_f08 (f, f08) result(res)
+    ! Defined comparison for MPI_Win and integer handles
+    type(MPI_Win),intent(in) :: f08
+    integer,intent(in)        :: f
+    logical                   :: res
+    res = f08%MPI_VAL == f
+end function mpi_win_f_eq_f08
+
+function mpi_message_f08_eq_f (f08, f) result(res)
+    ! Defined comparison for MPI_Message and integer handles
+    type(MPI_Message),intent(in) :: f08
+    integer,intent(in)        :: f
+    logical                   :: res
+    res = f08%MPI_VAL == f
+end function mpi_message_f08_eq_f
+
+function mpi_message_f_eq_f08 (f, f08) result(res)
+    ! Defined comparison for MPI_Message and integer handles
+    type(MPI_Message),intent(in) :: f08
+    integer,intent(in)        :: f
+    logical                   :: res
+    res = f08%MPI_VAL == f
+end function mpi_message_f_eq_f08
+
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!
+!  Non-equal part
+!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+function mpi_comm_neq (x, y) result(res)
+    type(MPI_Comm), intent(in) :: x, y
+    logical :: res
+    res = (x%MPI_VAL /= y%MPI_VAL)
+end function mpi_comm_neq
+
+function mpi_datatype_neq (x, y) result(res)
+    type(MPI_Datatype), intent(in) :: x, y
+    logical :: res
+    res = (x%MPI_VAL /= y%MPI_VAL)
+end function mpi_datatype_neq
+
+function mpi_errhandler_neq (x, y) result(res)
+    type(MPI_Errhandler), intent(in) :: x, y
+    logical :: res
+    res = (x%MPI_VAL /= y%MPI_VAL)
+end function mpi_errhandler_neq
+
+function mpi_file_neq (x, y) result(res)
+    type(MPI_File), intent(in) :: x, y
+    logical :: res
+    res = (x%MPI_VAL /= y%MPI_VAL)
+end function mpi_File_neq
+
+function mpi_group_neq (x, y) result(res)
+    type(MPI_Group), intent(in) :: x, y
+    logical :: res
+    res = (x%MPI_VAL /= y%MPI_VAL)
+end function mpi_group_neq
+
+function mpi_info_neq (x, y) result(res)
+    type(MPI_Info), intent(in) :: x, y
+    logical :: res
+    res = (x%MPI_VAL /= y%MPI_VAL)
+end function mpi_info_neq
+
+function mpi_op_neq (x, y) result(res)
+    type(MPI_Op), intent(in) :: x, y
+    logical :: res
+    res = (x%MPI_VAL /= y%MPI_VAL)
+end function mpi_op_neq
+
+function mpi_request_neq (x, y) result(res)
+    type(MPI_Request), intent(in) :: x, y
+    logical :: res
+    res = (x%MPI_VAL /= y%MPI_VAL)
+end function mpi_request_neq
+
+function mpi_win_neq (x, y) result(res)
+    type(MPI_Win), intent(in) :: x, y
+    logical :: res
+    res = (x%MPI_VAL /= y%MPI_VAL)
+end function mpi_win_neq
+
+function mpi_message_neq (x, y) result(res)
+    type(MPI_Message), intent(in) :: x, y
+    logical :: res
+    res = (x%MPI_VAL /= y%MPI_VAL)
+end function mpi_message_neq
+
+function mpi_comm_f08_ne_f (f08, f) result(res)
+    ! Defined comparison for MPI_Comm and integer handles
+    type(MPI_Comm),intent(in) :: f08
+    integer,intent(in)        :: f
+    logical                   :: res
+    res = f08%MPI_VAL /= f
+end function mpi_comm_f08_ne_f
+
+function mpi_comm_f_ne_f08 (f, f08) result(res)
+    ! Defined comparison for MPI_Comm and integer handles
+    type(MPI_Comm),intent(in) :: f08
+    integer,intent(in)        :: f
+    logical                   :: res
+    res = f08%MPI_VAL /= f
+end function mpi_comm_f_ne_f08
+
+function mpi_datatype_f08_ne_f (f08, f) result(res)
+    ! Defined comparison for MPI_Datatype and integer handles
+    type(MPI_Datatype),intent(in) :: f08
+    integer,intent(in)        :: f
+    logical                   :: res
+    res = f08%MPI_VAL /= f
+end function mpi_datatype_f08_ne_f
+
+function mpi_datatype_f_ne_f08 (f, f08) result(res)
+    ! Defined comparison for MPI_Datatype and integer handles
+    type(MPI_Datatype),intent(in) :: f08
+    integer,intent(in)        :: f
+    logical                   :: res
+    res = f08%MPI_VAL /= f
+end function mpi_datatype_f_ne_f08
+
+function mpi_errhandler_f08_ne_f (f08, f) result(res)
+    ! Defined comparison for MPI_Errhandler and integer handles
+    type(MPI_Errhandler),intent(in) :: f08
+    integer,intent(in)        :: f
+    logical                   :: res
+    res = f08%MPI_VAL /= f
+end function mpi_errhandler_f08_ne_f
+
+function mpi_errhandler_f_ne_f08 (f, f08) result(res)
+    ! Defined comparison for MPI_Errhandler and integer handles
+    type(MPI_Errhandler),intent(in) :: f08
+    integer,intent(in)        :: f
+    logical                   :: res
+    res = f08%MPI_VAL /= f
+end function mpi_errhandler_f_ne_f08
+
+function mpi_file_f_ne_f08 (f, f08) result(res)
+    ! Defined comparison for MPI_File and integer handles
+    type(MPI_File),intent(in) :: f08
+    integer,intent(in)        :: f
+    logical                   :: res
+    res = f08%MPI_VAL /= f
+end function mpi_file_f_ne_f08
+
+function mpi_file_f08_ne_f (f08, f) result(res)
+    ! Defined comparison for MPI_File and integer handles
+    type(MPI_File),intent(in) :: f08
+    integer,intent(in)        :: f
+    logical                   :: res
+    res = f08%MPI_VAL /= f
+end function mpi_file_f08_ne_f
+
+function mpi_group_f08_ne_f (f08, f) result(res)
+    ! Defined comparison for MPI_Group and integer handles
+    type(MPI_Group),intent(in) :: f08
+    integer,intent(in)        :: f
+    logical                   :: res
+    res = f08%MPI_VAL /= f
+end function mpi_group_f08_ne_f
+
+function mpi_group_f_ne_f08 (f, f08) result(res)
+    ! Defined comparison for MPI_Group and integer handles
+    type(MPI_Group),intent(in) :: f08
+    integer,intent(in)        :: f
+    logical                   :: res
+    res = f08%MPI_VAL /= f
+end function mpi_group_f_ne_f08
+
+function mpi_info_f08_ne_f (f08, f) result(res)
+    ! Defined comparison for MPI_Info and integer handles
+    type(MPI_Info),intent(in) :: f08
+    integer,intent(in)        :: f
+    logical                   :: res
+    res = f08%MPI_VAL /= f
+end function mpi_info_f08_ne_f
+
+function mpi_info_f_ne_f08 (f, f08) result(res)
+    ! Defined comparison for MPI_Info and integer handles
+    type(MPI_Info),intent(in) :: f08
+    integer,intent(in)        :: f
+    logical                   :: res
+    res = f08%MPI_VAL /= f
+end function mpi_info_f_ne_f08
+
+function mpi_op_f08_ne_f (f08, f) result(res)
+    ! Defined comparison for MPI_Op and integer handles
+    type(MPI_Op),intent(in) :: f08
+    integer,intent(in)        :: f
+    logical                   :: res
+    res = f08%MPI_VAL /= f
+end function mpi_op_f08_ne_f
+
+function mpi_op_f_ne_f08 (f, f08) result(res)
+    ! Defined comparison for MPI_Op and integer handles
+    type(MPI_Op),intent(in) :: f08
+    integer,intent(in)        :: f
+    logical                   :: res
+    res = f08%MPI_VAL /= f
+end function mpi_op_f_ne_f08
+
+function mpi_request_f08_ne_f (f08, f) result(res)
+    ! Defined comparison for MPI_Request and integer handles
+    type(MPI_Request),intent(in) :: f08
+    integer,intent(in)        :: f
+    logical                   :: res
+    res = f08%MPI_VAL /= f
+end function mpi_request_f08_ne_f
+
+function mpi_request_f_ne_f08 (f, f08) result(res)
+    ! Defined comparison for MPI_Request and integer handles
+    type(MPI_Request),intent(in) :: f08
+    integer,intent(in)        :: f
+    logical                   :: res
+    res = f08%MPI_VAL /= f
+end function mpi_request_f_ne_f08
+
+function mpi_win_f08_ne_f (f08, f) result(res)
+    ! Defined comparison for MPI_Win and integer handles
+    type(MPI_Win),intent(in) :: f08
+    integer,intent(in)        :: f
+    logical                   :: res
+    res = f08%MPI_VAL /= f
+end function mpi_win_f08_ne_f
+
+function mpi_win_f_ne_f08 (f, f08) result(res)
+    ! Defined comparison for MPI_Win and integer handles
+    type(MPI_Win),intent(in) :: f08
+    integer,intent(in)        :: f
+    logical                   :: res
+    res = f08%MPI_VAL /= f
+end function mpi_win_f_ne_f08
+
+function mpi_message_f08_ne_f (f08, f) result(res)
+    ! Defined comparison for MPI_Message and integer handles
+    type(MPI_Message),intent(in) :: f08
+    integer,intent(in)        :: f
+    logical                   :: res
+    res = f08%MPI_VAL /= f
+end function mpi_message_f08_ne_f
+
+function mpi_message_f_ne_f08 (f, f08) result(res)
+    ! Defined comparison for MPI_Message and integer handles
+    type(MPI_Message),intent(in) :: f08
+    integer,intent(in)        :: f
+    logical                   :: res
+    res = f08%MPI_VAL /= f
+end function mpi_message_f_ne_f08
+
+! 17.2.4 - Conversion between Fortran and C handles
+
+!  MPI_Comm MPI_Comm_f2c(MPI_Fint comm)
+function mpi_comm_f2c (comm) bind(c,name="MPI_Comm_f2c") result (res)
+    use mpi_c_interface_types, only: c_Comm
+    integer,value :: comm
+    integer(c_Comm) :: res
+
+    res = comm
+end function mpi_comm_f2c
+
+function pmpi_comm_f2c (comm) bind(c,name="PMPI_Comm_f2c") result (res)
+    use mpi_c_interface_types, only: c_Comm
+    integer,value :: comm
+    integer(c_Comm) :: res
+
+    res = comm
+end function pmpi_comm_f2c
+
+!  MPI_Fint MPI_Comm_c2f(MPI_Comm comm)
+function mpi_comm_c2f (comm) bind(c,name="MPI_Comm_c2f") result (res)
+    use mpi_c_interface_types, only: c_Comm
+    integer(c_Comm),value :: comm
+    integer :: res
+
+    res = comm
+end function mpi_comm_c2f
+
+function pmpi_comm_c2f (comm) bind(c,name="PMPI_Comm_c2f") result (res)
+    use mpi_c_interface_types, only: c_Comm
+    integer(c_Comm),value :: comm
+    integer :: res
+
+    res = comm
+end function pmpi_comm_c2f
+
+!  MPI_Type MPI_Type_f2c(MPI_Fint type)
+function mpi_type_f2c (datatype) bind(c,name="MPI_Type_f2c") result (res)
+    use mpi_c_interface_types, only: c_Datatype
+    integer,value :: datatype
+    integer(c_Datatype) :: res
+
+    res = datatype
+end function mpi_type_f2c
+
+function pmpi_type_f2c (datatype) bind(c,name="PMPI_Type_f2c") result (res)
+    use mpi_c_interface_types, only: c_Datatype
+    integer,value :: datatype
+    integer(c_Datatype) :: res
+
+    res = datatype
+end function pmpi_type_f2c
+
+!  MPI_Fint MPI_Type_c2f(MPI_Type type)
+function mpi_type_c2f (datatype) bind(c,name="MPI_Type_c2f") result (res)
+    use mpi_c_interface_types, only: c_Datatype
+    integer(c_Datatype),value :: datatype
+    integer :: res
+
+    res = datatype
+end function mpi_type_c2f
+
+function pmpi_type_c2f (datatype) bind(c,name="PMPI_Type_c2f") result (res)
+    use mpi_c_interface_types, only: c_Datatype
+    integer(c_Datatype),value :: datatype
+    integer :: res
+
+    res = datatype
+end function pmpi_type_c2f
+
+!  MPI_Group MPI_Group_f2c(MPI_Fint group)
+function mpi_group_f2c (group) bind(c,name="MPI_Group_f2c") result (res)
+    use mpi_c_interface_types, only: c_Group
+    integer,value :: group
+    integer(c_Group) :: res
+
+    res = group
+end function mpi_group_f2c
+
+function pmpi_group_f2c (group) bind(c,name="PMPI_Group_f2c") result (res)
+    use mpi_c_interface_types, only: c_Group
+    integer,value :: group
+    integer(c_Group) :: res
+
+    res = group
+end function pmpi_group_f2c
+
+
+! MPI_Fint MPI_Group_c2f(MPI_Datatype datatype)
+function mpi_group_c2f (group) bind(c,name="MPI_Group_c2f") result (res)
+    use mpi_c_interface_types, only: c_Group
+    integer(c_Group),value :: group
+    integer :: res
+
+    res = group
+end function mpi_group_c2f
+
+function pmpi_group_c2f (group) bind(c,name="PMPI_Group_c2f") result (res)
+    use mpi_c_interface_types, only: c_Group
+    integer(c_Group),value :: group
+    integer :: res
+
+    res = group
+end function pmpi_group_c2f
+
+
+! MPI_Request MPI_Request_f2c(MPI_Fint request)
+function mpi_request_f2c (request) bind(c,name="MPI_Request_f2c") result (res)
+    use mpi_c_interface_types, only: c_Request
+    integer,value :: request
+    integer(c_Request) :: res
+
+    res = request
+end function mpi_request_f2c
+
+function pmpi_request_f2c (request) bind(c,name="PMPI_Request_f2c") result (res)
+    use mpi_c_interface_types, only: c_Request
+    integer,value :: request
+    integer(c_Request) :: res
+
+    res = request
+end function pmpi_request_f2c
+
+
+! MPI_Fint MPI_Request_c2f(MPI_Datatype datatype)
+function mpi_request_c2f (request) bind(c,name="MPI_Request_c2f") result (res)
+    use mpi_c_interface_types, only: c_Request
+    integer(c_Request),value :: request
+    integer :: res
+
+    res = request
+end function mpi_request_c2f
+
+function pmpi_request_c2f (request) bind(c,name="PMPI_Request_c2f") result (res)
+    use mpi_c_interface_types, only: c_Request
+    integer(c_Request),value :: request
+    integer :: res
+
+    res = request
+end function pmpi_request_c2f
+
+! MPI_File MPI_File_f2c(MPI_Fint file)
+! The MPI_File_f2c/c2f functions are defined in C
+
+function MPI_File_f2c (file) bind(c,name="MPI_File_f2c") result (res)
+    use mpi_c_interface_types, only: c_File
+    integer,value :: file
+    integer(c_File) :: res
+end function MPI_File_f2c
+
+function pmpi_file_f2c (file) bind(c,name="PMPI_File_f2c") result (res)
+    use mpi_c_interface_types, only: c_File
+    integer,value :: file
+    integer(c_File) :: res
+
+    res = file
+end function pmpi_file_f2c
+
+! MPI_Fint MPI_File_c2f(MPI_Datatype datatype)
+function MPI_File_c2f (file) bind(c,name="MPI_File_c2f") result (res)
+    use mpi_c_interface_types, only: c_File
+    integer(c_File),value :: file
+    integer :: res
+end function MPI_File_c2f
+
+function pmpi_file_c2f (file) bind(c,name="PMPI_File_c2f") result (res)
+    use mpi_c_interface_types, only: c_File
+    integer(c_File),value :: file
+    integer :: res
+
+    res = file
+end function pmpi_file_c2f
+
+! MPI_Win MPI_Win_f2c(MPI_Fint win)
+function mpi_win_f2c (win) bind(c,name="MPI_Win_f2c") result (res)
+    use mpi_c_interface_types, only: C_win
+    integer,value :: win
+    integer(C_win) :: res
+
+    res = win
+end function mpi_win_f2c
+
+function pmpi_win_f2c (win) bind(c,name="PMPI_Win_f2c") result (res)
+    use mpi_c_interface_types, only: C_win
+    integer,value :: win
+    integer(C_win) :: res
+
+    res = win
+end function pmpi_win_f2c
+
+! MPI_Fint MPI_Win_c2f(MPI_Datatype datatype)
+function mpi_win_c2f (win) bind(c,name="MPI_Win_c2f") result (res)
+    use mpi_c_interface_types, only: C_win
+    integer(C_win),value :: win
+    integer :: res
+
+    res = win
+end function mpi_win_c2f
+
+function pmpi_win_c2f (win) bind(c,name="PMPI_Win_c2f") result (res)
+    use mpi_c_interface_types, only: C_win
+    integer(C_win),value :: win
+    integer :: res
+
+    res = win
+end function pmpi_win_c2f
+
+! MPI_Op MPI_Op_f2c(MPI_Fint op)
+function mpi_op_f2c (op) bind(c,name="MPI_Op_f2c") result (res)
+    use mpi_c_interface_types, only: c_Op
+    integer,value :: op
+    integer(c_Op) :: res
+
+    res = op
+end function mpi_op_f2c
+
+function pmpi_op_f2c (op) bind(c,name="PMPI_Op_f2c") result (res)
+    use mpi_c_interface_types, only: c_Op
+    integer,value :: op
+    integer(c_Op) :: res
+
+    res = op
+end function pmpi_op_f2c
+
+! MPI_Fint MPI_Op_c2f(MPI_Datatype datatype)
+function mpi_op_c2f (op) bind(c,name="MPI_Op_c2f") result (res)
+    use mpi_c_interface_types, only: c_Op
+    integer(c_Op),value :: op
+    integer :: res
+
+    res = op
+end function mpi_op_c2f
+
+function pmpi_op_c2f (op) bind(c,name="PMPI_Op_c2f") result (res)
+    use mpi_c_interface_types, only: c_Op
+    integer(c_Op),value :: op
+    integer :: res
+
+    res = op
+end function pmpi_op_c2f
+
+! MPI_Info MPI_Info_f2c(MPI_Fint info)
+function mpi_info_f2c (info) bind(c,name="MPI_Info_f2c") result (res)
+    use mpi_c_interface_types, only: c_Info
+    integer,value :: info
+    integer(c_Info) :: res
+
+    res = info
+end function mpi_info_f2c
+
+function pmpi_info_f2c (info) bind(c,name="PMPI_Info_f2c") result (res)
+    use mpi_c_interface_types, only: c_Info
+    integer,value :: info
+    integer(c_Info) :: res
+
+    res = info
+end function pmpi_info_f2c
+
+! MPI_Fint MPI_Info_c2f(MPI_Datatype datatype)
+function mpi_info_c2f (info) bind(c,name="MPI_Info_c2f") result (res)
+    use mpi_c_interface_types, only: c_Info
+    integer(c_Info),value :: info
+    integer :: res
+
+    res = info
+end function mpi_info_c2f
+
+function pmpi_info_c2f (info) bind(c,name="PMPI_Info_c2f") result (res)
+    use mpi_c_interface_types, only: c_Info
+    integer(c_Info),value :: info
+    integer :: res
+
+    res = info
+end function pmpi_info_c2f
+
+! MPI_Errhandler MPI_Errhandler_f2c(MPI_Fint errhandler)
+function mpi_errhandler_f2c (errhandler) bind(c,name="MPI_Errhandler_f2c") result (res)
+    use mpi_c_interface_types, only: c_Errhandler
+    integer,value :: errhandler
+    integer(c_Errhandler) :: res
+
+    res = errhandler
+end function mpi_errhandler_f2c
+
+function pmpi_errhandler_f2c (errhandler) bind(c,name="PMPI_Errhandler_f2c") result (res)
+    use mpi_c_interface_types, only: c_Errhandler
+    integer,value :: errhandler
+    integer(c_Errhandler) :: res
+
+    res = errhandler
+end function pmpi_errhandler_f2c
+
+! MPI_Fint MPI_Errhandler_c2f(MPI_Datatype datatype)
+function mpi_errhandler_c2f (errhandler) bind(c,name="MPI_Errhandler_c2f") result (res)
+    use mpi_c_interface_types, only: c_Errhandler
+    integer(c_Errhandler),value :: errhandler
+    integer :: res
+
+    res = errhandler
+end function mpi_errhandler_c2f
+
+function pmpi_errhandler_c2f (errhandler) bind(c,name="PMPI_Errhandler_c2f") result (res)
+    use mpi_c_interface_types, only: c_Errhandler
+    integer(c_Errhandler),value :: errhandler
+    integer :: res
+
+    res = errhandler
+end function pmpi_errhandler_c2f
+
+! MPI_Message MPI_Message_f2c(MPI_Fint message)
+function mpi_message_f2c (message) bind(c,name="MPI_Message_f2c") result (res)
+    use mpi_c_interface_types, only: c_Message
+    integer,value :: message
+    integer(c_Message) :: res
+
+    res = message
+end function mpi_message_f2c
+
+function pmpi_message_f2c (message) bind(c,name="PMPI_Message_f2c") result (res)
+    use mpi_c_interface_types, only: c_Message
+    integer,value :: message
+    integer(c_Message) :: res
+
+    res = message
+end function pmpi_message_f2c
+
+! MPI_Fint MPI_Message_c2f(MPI_Datatype datatype)
+function mpi_message_c2f (message) bind(c,name="MPI_Message_c2f") result (res)
+    use mpi_c_interface_types, only: c_Message
+    integer(c_Message),value :: message
+    integer :: res
+
+    res = message
+end function mpi_message_c2f
+
+function pmpi_message_c2f (message) bind(c,name="PMPI_Message_c2f") result (res)
+    use mpi_c_interface_types, only: c_Message
+    integer(c_Message),value :: message
+    integer :: res
+
+    res = message
+end function pmpi_message_c2f
+
+end module mpi_f08_types
diff --git a/src/binding/fortran/use_mpi_f08/mpi_f08_types.f90 b/src/binding/fortran/use_mpi_f08/mpi_f08_types.f90
deleted file mode 100644
index d0680c3..0000000
--- a/src/binding/fortran/use_mpi_f08/mpi_f08_types.f90
+++ /dev/null
@@ -1,1156 +0,0 @@
-! MPI 3 Data types for Fortran.
-! From A.1.2, pp 676-677
-! Note added MPI_Message type not in the spec by mistake
-!
-! Module mpi_f08_types is a helper module used by
-! mpi_f08_constants and mpi_f08
-! It is not defined in the spec and not intended for end users.
-! (jczhang: Does not the spec require MPI_Comm etc be defined?)
-!--------------------------------------------------------------
-
-MODULE mpi_f08_types
-use,intrinsic :: iso_c_binding, only: c_int
-use :: mpi_c_interface_types, only: c_Count, c_Status
-IMPLICIT NONE
-
-private :: c_int, c_Count, c_Status
-
-! F08 derived types
-! A.1.2  p 677
-
-TYPE, BIND(C) :: MPI_Comm
- integer :: MPI_VAL
-END TYPE MPI_Comm
-
-TYPE, BIND(C) :: MPI_Datatype
- integer :: MPI_VAL
-END TYPE MPI_Datatype
-
-TYPE, BIND(C) :: MPI_Errhandler
- integer :: MPI_VAL
-END TYPE MPI_Errhandler
-
-TYPE, BIND(C) :: MPI_File
- integer :: MPI_VAL
-END TYPE MPI_File
-
-TYPE, BIND(C) :: MPI_Group
- integer :: MPI_VAL
-END TYPE MPI_Group
-
-TYPE, BIND(C) :: MPI_Info
- integer :: MPI_VAL
-END TYPE MPI_Info
-
-TYPE, BIND(C) :: MPI_Op
- integer :: MPI_VAL
-END TYPE MPI_Op
-
-TYPE, BIND(C) :: MPI_Request
- integer :: MPI_VAL
-END TYPE MPI_Request
-
-TYPE, BIND(C) :: MPI_Win
- integer :: MPI_VAL
-END TYPE MPI_Win
-
-TYPE, BIND(C) :: MPI_Message
- integer :: MPI_VAL
-END TYPE MPI_Message
-
-! Fortran 2008 struct for status. Must be consistent with mpi.h, mpif.h
-TYPE, BIND(C) :: MPI_Status
-    integer :: count_lo;
-    integer :: count_hi_and_cancelled;
-    integer :: MPI_SOURCE
-    integer :: MPI_TAG
-    integer :: MPI_ERROR
-END TYPE MPI_Status
-
-! Fortran subscript constants
-! 3.2.5  p 30, and A.1.1 p 664
-integer,parameter :: MPI_SOURCE = 3
-integer,parameter :: MPI_TAG    = 4
-integer,parameter :: MPI_ERROR  = 5
-integer,parameter :: MPI_STATUS_SIZE = 5
-
-interface assignment(=)
-   module procedure mpi_status_f08_assgn_c
-   module procedure mpi_status_c_assgn_f08
-   module procedure mpi_status_f_assgn_c
-   module procedure mpi_status_c_assgn_f
-end interface
-private :: mpi_status_f08_assgn_c
-private :: mpi_status_c_assgn_f08
-private :: mpi_status_f_assgn_c
-private :: mpi_status_c_assgn_f
-
-! Required operator overloads for == and /= for opaque handles
-! 2.5.1 pp 12-13
-
-interface operator(==)
-   module procedure mpi_comm_f08_eq_f
-   module procedure mpi_comm_f_eq_f08
-   module procedure mpi_datatype_f08_eq_f
-   module procedure mpi_datatype_f_eq_f08
-   module procedure mpi_errhandler_f08_eq_f
-   module procedure mpi_errhandler_f_eq_f08
-   module procedure mpi_file_f08_eq_f
-   module procedure mpi_file_f_eq_f08
-   module procedure mpi_group_f08_eq_f
-   module procedure mpi_group_f_eq_f08
-   module procedure mpi_info_f08_eq_f
-   module procedure mpi_info_f_eq_f08
-   module procedure mpi_op_f08_eq_f
-   module procedure mpi_op_f_eq_f08
-   module procedure mpi_request_f08_eq_f
-   module procedure mpi_request_f_eq_f08
-   module procedure mpi_win_f08_eq_f
-   module procedure mpi_win_f_eq_f08
-   module procedure mpi_message_f08_eq_f
-   module procedure mpi_message_f_eq_f08
-end interface
-private :: mpi_comm_f08_eq_f
-private :: mpi_comm_f_eq_f08
-private :: mpi_datatype_f08_eq_f
-private :: mpi_datatype_f_eq_f08
-private :: mpi_errhandler_f08_eq_f
-private :: mpi_errhandler_f_eq_f08
-private :: mpi_file_f08_eq_f
-private :: mpi_file_f_eq_f08
-private :: mpi_group_f08_eq_f
-private :: mpi_group_f_eq_f08
-private :: mpi_info_f08_eq_f
-private :: mpi_info_f_eq_f08
-private :: mpi_op_f08_eq_f
-private :: mpi_op_f_eq_f08
-private :: mpi_request_f08_eq_f
-private :: mpi_request_f_eq_f08
-private :: mpi_win_f08_eq_f
-private :: mpi_win_f_eq_f08
-private :: mpi_message_f08_eq_f
-private :: mpi_message_f_eq_f08
-
-interface operator(/=)
-   module procedure mpi_comm_f08_ne_f
-   module procedure mpi_comm_f_ne_f08
-   module procedure mpi_datatype_f08_ne_f
-   module procedure mpi_datatype_f_ne_f08
-   module procedure mpi_errhandler_f08_ne_f
-   module procedure mpi_errhandler_f_ne_f08
-   module procedure mpi_file_f08_ne_f
-   module procedure mpi_file_f_ne_f08
-   module procedure mpi_group_f08_ne_f
-   module procedure mpi_group_f_ne_f08
-   module procedure mpi_info_f08_ne_f
-   module procedure mpi_info_f_ne_f08
-   module procedure mpi_op_f08_ne_f
-   module procedure mpi_op_f_ne_f08
-   module procedure mpi_request_f08_ne_f
-   module procedure mpi_request_f_ne_f08
-   module procedure mpi_win_f08_ne_f
-   module procedure mpi_win_f_ne_f08
-   module procedure mpi_message_f08_ne_f
-   module procedure mpi_message_f_ne_f08
-end interface
-private :: mpi_comm_f08_ne_f
-private :: mpi_comm_f_ne_f08
-private :: mpi_datatype_f08_ne_f
-private :: mpi_datatype_f_ne_f08
-private :: mpi_errhandler_f08_ne_f
-private :: mpi_errhandler_f_ne_f08
-private :: mpi_file_f08_ne_f
-private :: mpi_file_f_ne_f08
-private :: mpi_group_f08_ne_f
-private :: mpi_group_f_ne_f08
-private :: mpi_info_f08_ne_f
-private :: mpi_info_f_ne_f08
-private :: mpi_op_f08_ne_f
-private :: mpi_op_f_ne_f08
-private :: mpi_request_f08_ne_f
-private :: mpi_request_f_ne_f08
-private :: mpi_win_f08_ne_f
-private :: mpi_win_f_ne_f08
-private :: mpi_message_f08_ne_f
-private :: mpi_message_f_ne_f08
-
-
-! MPI_Sizeof in 17.1.9
-
-interface MPI_Sizeof
-   module procedure MPI_Sizeof_xint8
-   module procedure MPI_Sizeof_xint16
-   module procedure MPI_Sizeof_xint32
-   module procedure MPI_Sizeof_xint64
-   module procedure MPI_Sizeof_xreal32
-   module procedure MPI_Sizeof_xreal64
-   module procedure MPI_Sizeof_xreal128
-   module procedure MPI_Sizeof_xcomplex32
-   module procedure MPI_Sizeof_xcomplex64
-   module procedure MPI_Sizeof_xcomplex128
-end interface
-
-   private :: MPI_Sizeof_xint8
-   private :: MPI_Sizeof_xint16
-   private :: MPI_Sizeof_xint32
-   private :: MPI_Sizeof_xint64
-   private :: MPI_Sizeof_xreal32
-   private :: MPI_Sizeof_xreal64
-   private :: MPI_Sizeof_xreal128
-   private :: MPI_Sizeof_xcomplex32
-   private :: MPI_Sizeof_xcomplex64
-   private :: MPI_Sizeof_xcomplex128
-
-contains
-
-
-!--> MPI_Sizeof in 17.1.9,  specifics
-
-  subroutine MPI_Sizeof_xint8 (x, size, ierror)
-       use,intrinsic :: iso_fortran_env, only: int8
-       integer(int8),dimension(..) :: x
-       integer, intent(out) :: size
-       integer, optional,  intent(out) :: ierror
-
-       size = storage_size(x)/8
-       if (present(ierror)) ierror = 0
-  end subroutine MPI_Sizeof_xint8
-
-  subroutine MPI_Sizeof_xint16 (x, size, ierror)
-       use,intrinsic :: iso_fortran_env, only: int16
-       integer(int16),dimension(..) :: x
-       integer, intent(out) :: size
-       integer, optional,  intent(out) :: ierror
-
-       size = storage_size(x)/8
-       if (present(ierror)) ierror = 0
-  end subroutine MPI_Sizeof_xint16
-
-  subroutine MPI_Sizeof_xint32 (x, size, ierror)
-       use,intrinsic :: iso_fortran_env, only: int32
-       integer(int32),dimension(..) :: x
-       integer, intent(out) :: size
-       integer, optional,  intent(out) :: ierror
-
-       size = storage_size(x)/8
-       if (present(ierror)) ierror = 0
-  end subroutine MPI_Sizeof_xint32
-
-  subroutine MPI_Sizeof_xint64 (x, size, ierror)
-       use,intrinsic :: iso_fortran_env, only: int64
-       integer(int64),dimension(..) :: x
-       integer, intent(out) :: size
-       integer, optional,  intent(out) :: ierror
-
-       size = storage_size(x)/8
-       if (present(ierror)) ierror = 0
-  end subroutine MPI_Sizeof_xint64
-
-  subroutine MPI_Sizeof_xreal32 (x, size, ierror)
-       use,intrinsic :: iso_fortran_env, only: real32, int32
-       real(real32),dimension(..) :: x
-       integer, intent(out) :: size
-       integer, optional,  intent(out) :: ierror
-
-       size = storage_size(x)/8
-       ierror = 0
-  end subroutine MPI_Sizeof_xreal32
-
-  subroutine MPI_Sizeof_xreal64 (x, size, ierror)
-       use,intrinsic :: iso_fortran_env, only: real64
-       real(real64),dimension(..) :: x
-       integer, intent(out) :: size
-       integer, optional,  intent(out) :: ierror
-
-       size = storage_size(x)/8
-       ierror = 0
-  end subroutine MPI_Sizeof_xreal64
-
-  subroutine MPI_Sizeof_xreal128 (x, size, ierror)
-       use,intrinsic :: iso_fortran_env, only: real128
-       real(real128),dimension(..) :: x
-       integer, intent(out) :: size
-       integer, optional,  intent(out) :: ierror
-
-       size = storage_size(x)/8
-       ierror = 0
-  end subroutine MPI_Sizeof_xreal128
-
-  subroutine MPI_Sizeof_xcomplex32 (x, size, ierror)
-       use,intrinsic :: iso_fortran_env, only: real32
-       complex(real32),dimension(..) :: x
-       integer, intent(out) :: size
-       integer, optional,  intent(out) :: ierror
-
-       size = storage_size(x)/8
-       ierror = 0
-  end subroutine MPI_Sizeof_xcomplex32
-
-  subroutine MPI_Sizeof_xcomplex64 (x, size, ierror)
-       use,intrinsic :: iso_fortran_env, only: real64
-       complex(real64),dimension(..) :: x
-       integer, intent(out) :: size
-       integer, optional,  intent(out) :: ierror
-
-       size = storage_size(x)/8
-       ierror = 0
-  end subroutine MPI_Sizeof_xcomplex64
-
-  subroutine MPI_Sizeof_xcomplex128 (x, size, ierror)
-       use,intrinsic :: iso_fortran_env, only: real128
-       complex(real128),dimension(..) :: x
-       integer, intent(out) :: size
-       integer, optional,  intent(out) :: ierror
-
-       size = storage_size(x)/8
-       ierror = 0
-  end subroutine MPI_Sizeof_xcomplex128
-
-  subroutine mpi_status_f08_assgn_c (status_f08, status_c)
-    ! Defined status_f08 = status_c
-    type(MPI_Status),intent(out) :: status_f08
-    type(c_Status),intent(in)    :: status_c
-
-    status_f08%count_lo   = status_c%count_lo
-    status_f08%count_hi_and_cancelled  = status_c%count_hi_and_cancelled
-    status_f08%mpi_source = status_c%mpi_source
-    status_f08%mpi_tag    = status_c%mpi_tag
-    status_f08%mpi_error  = status_c%mpi_error
-  end subroutine mpi_status_f08_assgn_c
-
-  subroutine mpi_status_c_assgn_f08 (status_c, status_f08)
-    ! Defined status_c = status_f08
-    type(c_Status),intent(out) :: status_c
-    type(MPI_Status),intent(in) :: status_f08
-
-    status_c%count_lo   = status_f08%count_lo
-    status_c%count_hi_and_cancelled  = status_f08%count_hi_and_cancelled
-    status_c%mpi_source = status_f08%mpi_source
-    status_c%mpi_tag    = status_f08%mpi_tag
-    status_c%mpi_error  = status_f08%mpi_error
-  end subroutine mpi_status_c_assgn_f08
-
-  subroutine mpi_status_f_assgn_c (status_f, status_c)
-    ! Defined status_f = status_c
-    use,intrinsic :: iso_fortran_env, only: int32
-    integer,intent(out) :: status_f(MPI_STATUS_SIZE)
-    type (c_Status),intent(in) :: status_c
-
-    status_f(1) = status_c%count_lo
-    status_f(2) = status_c%count_hi_and_cancelled
-    status_f(MPI_SOURCE) = status_c%mpi_source
-    status_f(MPI_TAG)    = status_c%mpi_tag
-    status_f(MPI_ERROR)  = status_c%mpi_error
-  end subroutine mpi_status_f_assgn_c
-
-  subroutine mpi_status_c_assgn_f (status_c, status_f)
-    ! Defined status_c = status_f
-    use,intrinsic :: iso_fortran_env, only: int32
-    integer,intent(in) :: status_f(MPI_STATUS_SIZE)
-    integer(C_count) :: cnt
-    type(c_Status),intent(out) :: status_c
-
-    status_c%count_lo   = status_f(1);
-    status_c%count_hi_and_cancelled  = status_f(2);
-    status_c%mpi_source = status_f(MPI_SOURCE)
-    status_c%mpi_tag    = status_f(MPI_TAG)
-    status_c%mpi_error  = status_f(MPI_ERROR)
-  end subroutine mpi_status_c_assgn_f
-
-! int MPI_Status_f082c(const MPI_F08_status *status_f08, MPI_Status *status_c)
-
-  function MPI_Status_f082c (status_f08, status_c) &
-              BIND(C, name="MPI_Status_f082c") RESULT (res)
-    use,intrinsic :: iso_c_binding, only: c_int
-    type(MPI_Status),intent(in):: status_f08
-    type(c_Status),intent(out) :: status_c
-    integer(c_int)             :: res
-
-    status_c = status_f08
-    res = 0
-  end function MPI_Status_f082c
-
-  function PMPI_Status_f082c (status_f08, status_c) &
-              BIND(C, name="PMPI_Status_f082c") RESULT (res)
-    use,intrinsic :: iso_c_binding, only: c_int
-    type(MPI_Status),intent(in):: status_f08
-    type(c_Status),intent(out) :: status_c
-    integer(c_int)             :: res
-
-    status_c = status_f08
-    res = 0
-  end function PMPI_Status_f082c
-
-  ! int MPI_Status_c2f08(const MPI_Status *status_c, MPI_F08_status *status_f08)
-
-  function MPI_Status_c2f08 (status_c, status_f08) &
-              BIND(C, name="MPI_Status_c2f08") RESULT (res)
-    use,intrinsic :: iso_c_binding, only: c_int
-    type(MPI_Status),intent(in):: status_c
-    type(c_Status),intent(out) :: status_f08
-    integer(c_int)             :: res
-
-    status_f08 = status_c
-    res = 0
-  end function MPI_Status_c2f08
-
-  function PMPI_Status_c2f08 (status_c, status_f08) &
-              BIND(C, name="PMPI_Status_c2f08") RESULT (res)
-    use,intrinsic :: iso_c_binding, only: c_int
-    type(MPI_Status),intent(in):: status_c
-    type(c_Status),intent(out) :: status_f08
-    integer(c_int)             :: res
-
-    status_f08 = status_c
-    res = 0
-  end function PMPI_Status_c2f08
-
-  ! int MPI_Status_f2c(const MPI_Fint *status_f, MPI_Status *status_c)
-
-  function MPI_Status_f2c (status_f, status_c) &
-              BIND(C, name="MPI_Status_f2c") RESULT (res)
-    use,intrinsic :: iso_c_binding, only: c_int
-    integer,intent(in)         :: status_f(MPI_STATUS_SIZE)
-    type(c_Status),intent(out) :: status_c
-    integer(c_int)             :: res
-
-    status_c = status_f
-    res = 0
-  end function MPI_Status_f2c
-
-  function PMPI_Status_f2c (status_f, status_c) &
-              BIND(C, name="PMPI_Status_f2c") RESULT (res)
-    use,intrinsic :: iso_c_binding, only: c_int
-    integer,intent(in)         :: status_f(MPI_STATUS_SIZE)
-    type(c_Status),intent(out) :: status_c
-    integer(c_int)             :: res
-
-    status_c = status_f
-    res = 0
-  end function PMPI_Status_f2c
-
-  ! int MPI_Status_c2f(const MPI_Status *status_c, MPI_Fint *status_f08)
-
-  function MPI_Status_c2f (status_c, status_f) &
-              BIND(C, name="MPI_Status_c2f") RESULT (res)
-    use,intrinsic :: iso_c_binding, only: c_int
-    type(c_Status),intent(in)  :: status_c
-    integer,intent(out)        :: status_f(MPI_STATUS_SIZE)
-    integer(c_int)             :: res
-
-    status_f(:) = status_c
-    res = 0
-  end function MPI_Status_c2f
-
-  function PMPI_Status_c2f (status_c, status_f) &
-              BIND(C, name="PMPI_Status_c2f") RESULT (res)
-    use,intrinsic :: iso_c_binding, only: c_int
-    type(c_Status),intent(in)  :: status_c
-    integer,intent(out)        :: status_f(MPI_STATUS_SIZE)
-    integer(c_int)             :: res
-
-    status_f(:) = status_c
-    res = 0
-  end function PMPI_Status_c2f
-
-
-  function mpi_comm_f08_eq_f (f08, f) result(res)
-    ! Defined comparison for MPI_Comm and integer handles
-    type(MPI_Comm),intent(in) :: f08
-    integer,intent(in)        :: f
-    logical                   :: res
-    res = f08%MPI_VAL == f
-  end function mpi_comm_f08_eq_f
-
-  function mpi_comm_f_eq_f08 (f, f08) result(res)
-    ! Defined comparison for MPI_Comm and integer handles
-    type(MPI_Comm),intent(in) :: f08
-    integer,intent(in)        :: f
-    logical                   :: res
-    res = f08%MPI_VAL == f
-  end function mpi_comm_f_eq_f08
-
-  function mpi_datatype_f08_eq_f (f08, f) result(res)
-    ! Defined comparison for MPI_Datatype and integer handles
-    type(MPI_Datatype),intent(in) :: f08
-    integer,intent(in)        :: f
-    logical                   :: res
-    res = f08%MPI_VAL == f
-  end function mpi_datatype_f08_eq_f
-
-  function mpi_datatype_f_eq_f08 (f, f08) result(res)
-    ! Defined comparison for MPI_Datatype and integer handles
-    type(MPI_Datatype),intent(in) :: f08
-    integer,intent(in)        :: f
-    logical                   :: res
-    res = f08%MPI_VAL == f
-  end function mpi_datatype_f_eq_f08
-
-  function mpi_errhandler_f08_eq_f (f08, f) result(res)
-    ! Defined comparison for MPI_Errhandler and integer handles
-    type(MPI_Errhandler),intent(in) :: f08
-    integer,intent(in)        :: f
-    logical                   :: res
-    res = f08%MPI_VAL == f
-  end function mpi_errhandler_f08_eq_f
-
-  function mpi_errhandler_f_eq_f08 (f, f08) result(res)
-    ! Defined comparison for MPI_Errhandler and integer handles
-    type(MPI_Errhandler),intent(in) :: f08
-    integer,intent(in)        :: f
-    logical                   :: res
-    res = f08%MPI_VAL == f
-  end function mpi_errhandler_f_eq_f08
-
-  function mpi_file_f_eq_f08 (f, f08) result(res)
-    ! Defined comparison for MPI_File and integer handles
-    type(MPI_File),intent(in) :: f08
-    integer,intent(in)        :: f
-    logical                   :: res
-    res = f08%MPI_VAL == f
-  end function mpi_file_f_eq_f08
-
-  function mpi_file_f08_eq_f (f08, f) result(res)
-    ! Defined comparison for MPI_File and integer handles
-    type(MPI_File),intent(in) :: f08
-    integer,intent(in)        :: f
-    logical                   :: res
-    res = f08%MPI_VAL == f
-  end function mpi_file_f08_eq_f
-
-  function mpi_group_f08_eq_f (f08, f) result(res)
-    ! Defined comparison for MPI_Group and integer handles
-    type(MPI_Group),intent(in) :: f08
-    integer,intent(in)        :: f
-    logical                   :: res
-    res = f08%MPI_VAL == f
-  end function mpi_group_f08_eq_f
-
-  function mpi_group_f_eq_f08 (f, f08) result(res)
-    ! Defined comparison for MPI_Group and integer handles
-    type(MPI_Group),intent(in) :: f08
-    integer,intent(in)        :: f
-    logical                   :: res
-    res = f08%MPI_VAL == f
-  end function mpi_group_f_eq_f08
-
-  function mpi_info_f08_eq_f (f08, f) result(res)
-    ! Defined comparison for MPI_Info and integer handles
-    type(MPI_Info),intent(in) :: f08
-    integer,intent(in)        :: f
-    logical                   :: res
-    res = f08%MPI_VAL == f
-  end function mpi_info_f08_eq_f
-
-  function mpi_info_f_eq_f08 (f, f08) result(res)
-    ! Defined comparison for MPI_Info and integer handles
-    type(MPI_Info),intent(in) :: f08
-    integer,intent(in)        :: f
-    logical                   :: res
-    res = f08%MPI_VAL == f
-  end function mpi_info_f_eq_f08
-
-  function mpi_op_f08_eq_f (f08, f) result(res)
-    ! Defined comparison for MPI_Op and integer handles
-    type(MPI_Op),intent(in) :: f08
-    integer,intent(in)        :: f
-    logical                   :: res
-    res = f08%MPI_VAL == f
-  end function mpi_op_f08_eq_f
-
-  function mpi_op_f_eq_f08 (f, f08) result(res)
-    ! Defined comparison for MPI_Op and integer handles
-    type(MPI_Op),intent(in) :: f08
-    integer,intent(in)        :: f
-    logical                   :: res
-    res = f08%MPI_VAL == f
-  end function mpi_op_f_eq_f08
-
-  function mpi_request_f08_eq_f (f08, f) result(res)
-    ! Defined comparison for MPI_Request and integer handles
-    type(MPI_Request),intent(in) :: f08
-    integer,intent(in)        :: f
-    logical                   :: res
-    res = f08%MPI_VAL == f
-  end function mpi_request_f08_eq_f
-
-  function mpi_request_f_eq_f08 (f, f08) result(res)
-    ! Defined comparison for MPI_Request and integer handles
-    type(MPI_Request),intent(in) :: f08
-    integer,intent(in)        :: f
-    logical                   :: res
-    res = f08%MPI_VAL == f
-  end function mpi_request_f_eq_f08
-
-  function mpi_win_f08_eq_f (f08, f) result(res)
-    ! Defined comparison for MPI_Win and integer handles
-    type(MPI_Win),intent(in) :: f08
-    integer,intent(in)        :: f
-    logical                   :: res
-    res = f08%MPI_VAL == f
-  end function mpi_win_f08_eq_f
-
-  function mpi_win_f_eq_f08 (f, f08) result(res)
-    ! Defined comparison for MPI_Win and integer handles
-    type(MPI_Win),intent(in) :: f08
-    integer,intent(in)        :: f
-    logical                   :: res
-    res = f08%MPI_VAL == f
-  end function mpi_win_f_eq_f08
-
-  function mpi_message_f08_eq_f (f08, f) result(res)
-    ! Defined comparison for MPI_Message and integer handles
-    type(MPI_Message),intent(in) :: f08
-    integer,intent(in)        :: f
-    logical                   :: res
-    res = f08%MPI_VAL == f
-  end function mpi_message_f08_eq_f
-
-  function mpi_message_f_eq_f08 (f, f08) result(res)
-    ! Defined comparison for MPI_Message and integer handles
-    type(MPI_Message),intent(in) :: f08
-    integer,intent(in)        :: f
-    logical                   :: res
-    res = f08%MPI_VAL == f
-  end function mpi_message_f_eq_f08
-
-
-  function mpi_comm_f08_ne_f (f08, f) result(res)
-    ! Defined comparison for MPI_Comm and integer handles
-    type(MPI_Comm),intent(in) :: f08
-    integer,intent(in)        :: f
-    logical                   :: res
-    res = f08%MPI_VAL /= f
-  end function mpi_comm_f08_ne_f
-
-  function mpi_comm_f_ne_f08 (f, f08) result(res)
-    ! Defined comparison for MPI_Comm and integer handles
-    type(MPI_Comm),intent(in) :: f08
-    integer,intent(in)        :: f
-    logical                   :: res
-    res = f08%MPI_VAL /= f
-  end function mpi_comm_f_ne_f08
-
-  function mpi_datatype_f08_ne_f (f08, f) result(res)
-    ! Defined comparison for MPI_Datatype and integer handles
-    type(MPI_Datatype),intent(in) :: f08
-    integer,intent(in)        :: f
-    logical                   :: res
-    res = f08%MPI_VAL /= f
-  end function mpi_datatype_f08_ne_f
-
-  function mpi_datatype_f_ne_f08 (f, f08) result(res)
-    ! Defined comparison for MPI_Datatype and integer handles
-    type(MPI_Datatype),intent(in) :: f08
-    integer,intent(in)        :: f
-    logical                   :: res
-    res = f08%MPI_VAL /= f
-  end function mpi_datatype_f_ne_f08
-
-  function mpi_errhandler_f08_ne_f (f08, f) result(res)
-    ! Defined comparison for MPI_Errhandler and integer handles
-    type(MPI_Errhandler),intent(in) :: f08
-    integer,intent(in)        :: f
-    logical                   :: res
-    res = f08%MPI_VAL /= f
-  end function mpi_errhandler_f08_ne_f
-
-  function mpi_errhandler_f_ne_f08 (f, f08) result(res)
-    ! Defined comparison for MPI_Errhandler and integer handles
-    type(MPI_Errhandler),intent(in) :: f08
-    integer,intent(in)        :: f
-    logical                   :: res
-    res = f08%MPI_VAL /= f
-  end function mpi_errhandler_f_ne_f08
-
-  function mpi_file_f_ne_f08 (f, f08) result(res)
-    ! Defined comparison for MPI_File and integer handles
-    type(MPI_File),intent(in) :: f08
-    integer,intent(in)        :: f
-    logical                   :: res
-    res = f08%MPI_VAL /= f
-  end function mpi_file_f_ne_f08
-
-  function mpi_file_f08_ne_f (f08, f) result(res)
-    ! Defined comparison for MPI_File and integer handles
-    type(MPI_File),intent(in) :: f08
-    integer,intent(in)        :: f
-    logical                   :: res
-    res = f08%MPI_VAL /= f
-  end function mpi_file_f08_ne_f
-
-  function mpi_group_f08_ne_f (f08, f) result(res)
-    ! Defined comparison for MPI_Group and integer handles
-    type(MPI_Group),intent(in) :: f08
-    integer,intent(in)        :: f
-    logical                   :: res
-    res = f08%MPI_VAL /= f
-  end function mpi_group_f08_ne_f
-
-  function mpi_group_f_ne_f08 (f, f08) result(res)
-    ! Defined comparison for MPI_Group and integer handles
-    type(MPI_Group),intent(in) :: f08
-    integer,intent(in)        :: f
-    logical                   :: res
-    res = f08%MPI_VAL /= f
-  end function mpi_group_f_ne_f08
-
-  function mpi_info_f08_ne_f (f08, f) result(res)
-    ! Defined comparison for MPI_Info and integer handles
-    type(MPI_Info),intent(in) :: f08
-    integer,intent(in)        :: f
-    logical                   :: res
-    res = f08%MPI_VAL /= f
-  end function mpi_info_f08_ne_f
-
-  function mpi_info_f_ne_f08 (f, f08) result(res)
-    ! Defined comparison for MPI_Info and integer handles
-    type(MPI_Info),intent(in) :: f08
-    integer,intent(in)        :: f
-    logical                   :: res
-    res = f08%MPI_VAL /= f
-  end function mpi_info_f_ne_f08
-
-  function mpi_op_f08_ne_f (f08, f) result(res)
-    ! Defined comparison for MPI_Op and integer handles
-    type(MPI_Op),intent(in) :: f08
-    integer,intent(in)        :: f
-    logical                   :: res
-    res = f08%MPI_VAL /= f
-  end function mpi_op_f08_ne_f
-
-  function mpi_op_f_ne_f08 (f, f08) result(res)
-    ! Defined comparison for MPI_Op and integer handles
-    type(MPI_Op),intent(in) :: f08
-    integer,intent(in)        :: f
-    logical                   :: res
-    res = f08%MPI_VAL /= f
-  end function mpi_op_f_ne_f08
-
-  function mpi_request_f08_ne_f (f08, f) result(res)
-    ! Defined comparison for MPI_Request and integer handles
-    type(MPI_Request),intent(in) :: f08
-    integer,intent(in)        :: f
-    logical                   :: res
-    res = f08%MPI_VAL /= f
-  end function mpi_request_f08_ne_f
-
-  function mpi_request_f_ne_f08 (f, f08) result(res)
-    ! Defined comparison for MPI_Request and integer handles
-    type(MPI_Request),intent(in) :: f08
-    integer,intent(in)        :: f
-    logical                   :: res
-    res = f08%MPI_VAL /= f
-  end function mpi_request_f_ne_f08
-
-  function mpi_win_f08_ne_f (f08, f) result(res)
-    ! Defined comparison for MPI_Win and integer handles
-    type(MPI_Win),intent(in) :: f08
-    integer,intent(in)        :: f
-    logical                   :: res
-    res = f08%MPI_VAL /= f
-  end function mpi_win_f08_ne_f
-
-  function mpi_win_f_ne_f08 (f, f08) result(res)
-    ! Defined comparison for MPI_Win and integer handles
-    type(MPI_Win),intent(in) :: f08
-    integer,intent(in)        :: f
-    logical                   :: res
-    res = f08%MPI_VAL /= f
-  end function mpi_win_f_ne_f08
-
-  function mpi_message_f08_ne_f (f08, f) result(res)
-    ! Defined comparison for MPI_Message and integer handles
-    type(MPI_Message),intent(in) :: f08
-    integer,intent(in)        :: f
-    logical                   :: res
-    res = f08%MPI_VAL /= f
-  end function mpi_message_f08_ne_f
-
-  function mpi_message_f_ne_f08 (f, f08) result(res)
-    ! Defined comparison for MPI_Message and integer handles
-    type(MPI_Message),intent(in) :: f08
-    integer,intent(in)        :: f
-    logical                   :: res
-    res = f08%MPI_VAL /= f
-  end function mpi_message_f_ne_f08
-
-! 17.2.4 - Conversion between Fortran and C handles
-
-!  MPI_Comm MPI_Comm_f2c(MPI_Fint comm)
-
-  function mpi_comm_f2c (comm) bind(c,name="MPI_Comm_f2c") result (res)
-    use mpi_c_interface_types, only: C_comm
-    integer,value :: comm
-    integer(C_comm) :: res
-
-    res = comm
-  end function mpi_comm_f2c
-
-  function pmpi_comm_f2c (comm) bind(c,name="PMPI_Comm_f2c") result (res)
-    use mpi_c_interface_types, only: C_comm
-    integer,value :: comm
-    integer(C_comm) :: res
-
-    res = comm
-  end function pmpi_comm_f2c
-
-
-!  MPI_Fint MPI_Comm_c2f(MPI_Comm comm)
-
-  function mpi_comm_c2f (comm) bind(c,name="MPI_Comm_c2f") result (res)
-    use mpi_c_interface_types, only: C_comm
-    integer(C_comm),value :: comm
-    integer :: res
-
-    res = comm
-  end function mpi_comm_c2f
-
-  function pmpi_comm_c2f (comm) bind(c,name="PMPI_Comm_c2f") result (res)
-    use mpi_c_interface_types, only: C_comm
-    integer(C_comm),value :: comm
-    integer :: res
-
-    res = comm
-  end function pmpi_comm_c2f
-
-
-!  MPI_Type MPI_Type_f2c(MPI_Fint type)
-
-  function mpi_type_f2c (datatype) bind(c,name="MPI_Type_f2c") result (res)
-    use mpi_c_interface_types, only: C_datatype
-    integer,value :: datatype
-    integer(C_datatype) :: res
-
-    res = datatype
-  end function mpi_type_f2c
-
-  function pmpi_type_f2c (datatype) bind(c,name="PMPI_Type_f2c") result (res)
-    use mpi_c_interface_types, only: C_datatype
-    integer,value :: datatype
-    integer(C_datatype) :: res
-
-    res = datatype
-  end function pmpi_type_f2c
-
-!  MPI_Fint MPI_Type_c2f(MPI_Type type)
-
-  function mpi_type_c2f (datatype) bind(c,name="MPI_Type_c2f") result (res)
-    use mpi_c_interface_types, only: C_datatype
-    integer(C_datatype),value :: datatype
-    integer :: res
-
-    res = datatype
-  end function mpi_type_c2f
-
-  function pmpi_type_c2f (datatype) bind(c,name="PMPI_Type_c2f") result (res)
-    use mpi_c_interface_types, only: C_datatype
-    integer(C_datatype),value :: datatype
-    integer :: res
-
-    res = datatype
-  end function pmpi_type_c2f
-
-!  MPI_Group MPI_Group_f2c(MPI_Fint group)
-
-  function mpi_group_f2c (group) bind(c,name="MPI_Group_f2c") result (res)
-    use mpi_c_interface_types, only: C_group
-    integer,value :: group
-    integer(C_group) :: res
-
-    res = group
-  end function mpi_group_f2c
-
-  function pmpi_group_f2c (group) bind(c,name="PMPI_Group_f2c") result (res)
-    use mpi_c_interface_types, only: C_group
-    integer,value :: group
-    integer(C_group) :: res
-
-    res = group
-  end function pmpi_group_f2c
-
-
-!  MPI_Fint MPI_Group_c2f(MPI_Datatype datatype)
-
-  function mpi_group_c2f (group) bind(c,name="MPI_Group_c2f") result (res)
-    use mpi_c_interface_types, only: C_group
-    integer(C_group),value :: group
-    integer :: res
-
-    res = group
-  end function mpi_group_c2f
-
-  function pmpi_group_c2f (group) bind(c,name="PMPI_Group_c2f") result (res)
-    use mpi_c_interface_types, only: C_group
-    integer(C_group),value :: group
-    integer :: res
-
-    res = group
-  end function pmpi_group_c2f
-
-
-!  MPI_Request MPI_Request_f2c(MPI_Fint request)
-
-  function mpi_request_f2c (request) bind(c,name="MPI_Request_f2c") result (res)
-    use mpi_c_interface_types, only: C_request
-    integer,value :: request
-    integer(C_request) :: res
-
-    res = request
-  end function mpi_request_f2c
-
-  function pmpi_request_f2c (request) bind(c,name="PMPI_Request_f2c") result (res)
-    use mpi_c_interface_types, only: C_request
-    integer,value :: request
-    integer(C_request) :: res
-
-    res = request
-  end function pmpi_request_f2c
-
-
-!  MPI_Fint MPI_Request_c2f(MPI_Datatype datatype)
-
-  function mpi_request_c2f (request) bind(c,name="MPI_Request_c2f") result (res)
-    use mpi_c_interface_types, only: C_request
-    integer(C_request),value :: request
-    integer :: res
-
-    res = request
-  end function mpi_request_c2f
-
-  function pmpi_request_c2f (request) bind(c,name="PMPI_Request_c2f") result (res)
-    use mpi_c_interface_types, only: C_request
-    integer(C_request),value :: request
-    integer :: res
-
-    res = request
-  end function pmpi_request_c2f
-
-
-
-!  MPI_File MPI_File_f2c(MPI_Fint file)
-
-  function mpi_file_f2c (file) bind(c,name="MPI_File_f2c") result (res)
-    use mpi_c_interface_types, only: C_file
-    integer,value :: file
-    integer(C_file) :: res
-
-    res = file
-  end function mpi_file_f2c
-
-  function pmpi_file_f2c (file) bind(c,name="PMPI_File_f2c") result (res)
-    use mpi_c_interface_types, only: C_file
-    integer,value :: file
-    integer(C_file) :: res
-
-    res = file
-  end function pmpi_file_f2c
-
-
-!  MPI_Fint MPI_File_c2f(MPI_Datatype datatype)
-
-  function mpi_file_c2f (file) bind(c,name="MPI_File_c2f") result (res)
-    use mpi_c_interface_types, only: C_file
-    integer(C_file),value :: file
-    integer :: res
-
-    res = file
-  end function mpi_file_c2f
-
-  function pmpi_file_c2f (file) bind(c,name="PMPI_File_c2f") result (res)
-    use mpi_c_interface_types, only: C_file
-    integer(C_file),value :: file
-    integer :: res
-
-    res = file
-  end function pmpi_file_c2f
-
-
-!  MPI_Win MPI_Win_f2c(MPI_Fint win)
-
-  function mpi_win_f2c (win) bind(c,name="MPI_Win_f2c") result (res)
-    use mpi_c_interface_types, only: C_win
-    integer,value :: win
-    integer(C_win) :: res
-
-    res = win
-  end function mpi_win_f2c
-
-  function pmpi_win_f2c (win) bind(c,name="PMPI_Win_f2c") result (res)
-    use mpi_c_interface_types, only: C_win
-    integer,value :: win
-    integer(C_win) :: res
-
-    res = win
-  end function pmpi_win_f2c
-
-
-!  MPI_Fint MPI_Win_c2f(MPI_Datatype datatype)
-
-  function mpi_win_c2f (win) bind(c,name="MPI_Win_c2f") result (res)
-    use mpi_c_interface_types, only: C_win
-    integer(C_win),value :: win
-    integer :: res
-
-    res = win
-  end function mpi_win_c2f
-
-  function pmpi_win_c2f (win) bind(c,name="PMPI_Win_c2f") result (res)
-    use mpi_c_interface_types, only: C_win
-    integer(C_win),value :: win
-    integer :: res
-
-    res = win
-  end function pmpi_win_c2f
-
-!  MPI_Op MPI_Op_f2c(MPI_Fint op)
-
-  function mpi_op_f2c (op) bind(c,name="MPI_Op_f2c") result (res)
-    use mpi_c_interface_types, only: C_op
-    integer,value :: op
-    integer(C_op) :: res
-
-    res = op
-  end function mpi_op_f2c
-
-  function pmpi_op_f2c (op) bind(c,name="PMPI_Op_f2c") result (res)
-    use mpi_c_interface_types, only: C_op
-    integer,value :: op
-    integer(C_op) :: res
-
-    res = op
-  end function pmpi_op_f2c
-
-
-!  MPI_Fint MPI_Op_c2f(MPI_Datatype datatype)
-
-  function mpi_op_c2f (op) bind(c,name="MPI_Op_c2f") result (res)
-    use mpi_c_interface_types, only: C_op
-    integer(C_op),value :: op
-    integer :: res
-
-    res = op
-  end function mpi_op_c2f
-
-  function pmpi_op_c2f (op) bind(c,name="PMPI_Op_c2f") result (res)
-    use mpi_c_interface_types, only: C_op
-    integer(C_op),value :: op
-    integer :: res
-
-    res = op
-  end function pmpi_op_c2f
-
-!  MPI_Info MPI_Info_f2c(MPI_Fint info)
-
-  function mpi_info_f2c (info) bind(c,name="MPI_Info_f2c") result (res)
-    use mpi_c_interface_types, only: C_info
-    integer,value :: info
-    integer(C_info) :: res
-
-    res = info
-  end function mpi_info_f2c
-
-  function pmpi_info_f2c (info) bind(c,name="PMPI_Info_f2c") result (res)
-    use mpi_c_interface_types, only: C_info
-    integer,value :: info
-    integer(C_info) :: res
-
-    res = info
-  end function pmpi_info_f2c
-
-
-!  MPI_Fint MPI_Info_c2f(MPI_Datatype datatype)
-
-  function mpi_info_c2f (info) bind(c,name="MPI_Info_c2f") result (res)
-    use mpi_c_interface_types, only: C_info
-    integer(C_info),value :: info
-    integer :: res
-
-    res = info
-  end function mpi_info_c2f
-
-  function pmpi_info_c2f (info) bind(c,name="PMPI_Info_c2f") result (res)
-    use mpi_c_interface_types, only: C_info
-    integer(C_info),value :: info
-    integer :: res
-
-    res = info
-  end function pmpi_info_c2f
-
-!  MPI_Errhandler MPI_Errhandler_f2c(MPI_Fint errhandler)
-
-  function mpi_errhandler_f2c (errhandler) bind(c,name="MPI_Errhandler_f2c") result (res)
-    use mpi_c_interface_types, only: C_errhandler
-    integer,value :: errhandler
-    integer(C_errhandler) :: res
-
-    res = errhandler
-  end function mpi_errhandler_f2c
-
-  function pmpi_errhandler_f2c (errhandler) bind(c,name="PMPI_Errhandler_f2c") result (res)
-    use mpi_c_interface_types, only: C_errhandler
-    integer,value :: errhandler
-    integer(C_errhandler) :: res
-
-    res = errhandler
-  end function pmpi_errhandler_f2c
-
-
-!  MPI_Fint MPI_Errhandler_c2f(MPI_Datatype datatype)
-
-  function mpi_errhandler_c2f (errhandler) bind(c,name="MPI_Errhandler_c2f") result (res)
-    use mpi_c_interface_types, only: C_errhandler
-    integer(C_errhandler),value :: errhandler
-    integer :: res
-
-    res = errhandler
-  end function mpi_errhandler_c2f
-
-  function pmpi_errhandler_c2f (errhandler) bind(c,name="PMPI_Errhandler_c2f") result (res)
-    use mpi_c_interface_types, only: C_errhandler
-    integer(C_errhandler),value :: errhandler
-    integer :: res
-
-    res = errhandler
-  end function pmpi_errhandler_c2f
-
-!  MPI_Message MPI_Message_f2c(MPI_Fint message)
-
-  function mpi_message_f2c (message) bind(c,name="MPI_Message_f2c") result (res)
-    use mpi_c_interface_types, only: C_message
-    integer,value :: message
-    integer(C_message) :: res
-
-    res = message
-  end function mpi_message_f2c
-
-  function pmpi_message_f2c (message) bind(c,name="PMPI_Message_f2c") result (res)
-    use mpi_c_interface_types, only: C_message
-    integer,value :: message
-    integer(C_message) :: res
-
-    res = message
-  end function pmpi_message_f2c
-
-
-!  MPI_Fint MPI_Message_c2f(MPI_Datatype datatype)
-
-  function mpi_message_c2f (message) bind(c,name="MPI_Message_c2f") result (res)
-    use mpi_c_interface_types, only: C_message
-    integer(C_message),value :: message
-    integer :: res
-
-    res = message
-  end function mpi_message_c2f
-
-  function pmpi_message_c2f (message) bind(c,name="PMPI_Message_c2f") result (res)
-    use mpi_c_interface_types, only: C_message
-    integer(C_message),value :: message
-    integer :: res
-
-    res = message
-  end function pmpi_message_c2f
-
-
-END MODULE mpi_f08_types
-
diff --git a/src/binding/fortran/use_mpi_f08/tests/Makefile b/src/binding/fortran/use_mpi_f08/tests/Makefile
deleted file mode 100644
index 10a2c65..0000000
--- a/src/binding/fortran/use_mpi_f08/tests/Makefile
+++ /dev/null
@@ -1,98 +0,0 @@
-FC=gfortran
-
-PROG=fort_mpi_tests
-
-TEST_OBJS=\
-	fort_mpi_test1.o \
-	fort_mpi_test2.o \
-	fort_mpi_test3.o \
-	fort_mpi_test4.o \
-	fort_mpi_test5.o \
-	fort_mpi_test6.o \
-	fort_mpi_test7.o \
-	fort_mpi_test8.o \
-	fort_mpi_test9.o \
-	fort_mpi_test10.o \
-	fort_mpi_test11.o \
-	fort_mpi_test12.o \
-	fort_mpi_test18.o \
-	fort_mpi_test19.o \
-
-F08_MOD=../MPI_F08.mod
-F08_MOD_INC=-I ../
-F08_MOD_LINK=-L../ -lmpi_f08
-BINDLIB=../cdesc/libcdesc.a
-BINDLIB_LINK=-L../cdesc -L../f08ts -lf08ts -lcdesc
-
-all: $(PROG)
-
-fort_mpi_tests:	fort_mpi_tests.o $(F08_MOD) $(TEST_OBJS) $(BINDLIB)
-	$(FC) -o fort_mpi_tests fort_mpi_tests.o $(TEST_OBJS) $(BINDLIB_LINK) $(F08_MOD_LINK)
-
-fort_mpi_tests.o:	fort_mpi_tests.f90 $(F08_MOD)
-	$(FC) -c fort_mpi_tests.f90 $(F08_MOD_INC)
-
-fort_mpi_test1.o:	fort_mpi_test1.f90 $(F08_MOD)
-	$(FC) -c fort_mpi_test1.f90  $(F08_MOD_INC)
-
-fort_mpi_test2.o:	fort_mpi_test2.f90 $(F08_MOD)
-	$(FC) -c fort_mpi_test2.f90  $(F08_MOD_INC)
-
-fort_mpi_test3.o:	fort_mpi_test3.f90 $(F08_MOD)
-	$(FC) -c fort_mpi_test3.f90  $(F08_MOD_INC)
-
-fort_mpi_test4.o:	fort_mpi_test4.f90 $(F08_MOD)
-	$(FC) -c fort_mpi_test4.f90  $(F08_MOD_INC)
-
-fort_mpi_test5.o:	fort_mpi_test5.f90 $(F08_MOD)
-	$(FC) -c fort_mpi_test5.f90  $(F08_MOD_INC)
-
-fort_mpi_test6.o:	fort_mpi_test6.f90 $(F08_MOD)
-	$(FC) -c fort_mpi_test6.f90  $(F08_MOD_INC)
-
-fort_mpi_test7.o:	fort_mpi_test7.f90 $(F08_MOD)
-	$(FC) -c fort_mpi_test7.f90  $(F08_MOD_INC)
-
-fort_mpi_test8.o:	fort_mpi_test8.f90 $(F08_MOD)
-	$(FC) -c fort_mpi_test8.f90  $(F08_MOD_INC)
-
-fort_mpi_test9.o:	fort_mpi_test9.f90 $(F08_MOD)
-	$(FC) -c fort_mpi_test9.f90  $(F08_MOD_INC)
-
-fort_mpi_test10.o:	fort_mpi_test10.f90 $(F08_MOD)
-	$(FC) -c fort_mpi_test10.f90  $(F08_MOD_INC)
-
-fort_mpi_test11.o:	fort_mpi_test11.f90 $(F08_MOD)
-	$(FC) -c fort_mpi_test11.f90  $(F08_MOD_INC)
-
-fort_mpi_test12.o:	fort_mpi_test12.f90 $(F08_MOD)
-	$(FC) -c fort_mpi_test12.f90  $(F08_MOD_INC)
-
-fort_mpi_test18.o:	fort_mpi_test18.f90 $(F08_MOD)
-	$(FC) -c fort_mpi_test18.f90  $(F08_MOD_INC)
-
-fort_mpi_test19.o:	fort_mpi_test19.f90 $(F08_MOD)
-	$(FC) -c fort_mpi_test19.f90  $(F08_MOD_INC)
-
-clean:
-	rm -f *.o *.mod
-
-clobber:	clean
-	rm -f $(PROG)
-
-checkrcs:
-	sh ../util/checkrcs.sh
-
-# OLD - but should still work
-
-fort_test_2d:	$(F08_MOD) $(BINDLIB) fort_test_2d.o
-	$(FC) -o fort_test_2d fort_test_2d.o $(F08_MOD_LINK) $(BINDLIB_LINK)
-
-fort_test_2d.o:	fort_test_2d.f90
-	$(FC) -c fort_test_2d.f90 -I mpi_f08
-
-fort_test:	$(F08_MOD) $(BINDLIB) fort_test.o
-	$(FC) -o fort_test fort_test.o  $(F08_MOD_LINK) $(BINDLIB_LINK)
-
-fort_test.o:	fort_test.f90 $(F08_MOD)
-	$(FC) -c fort_test.f90 -I mpi_f08
diff --git a/src/binding/fortran/use_mpi_f08/tests/fort_mpi_test1.f90 b/src/binding/fortran/use_mpi_f08/tests/fort_mpi_test1.f90
deleted file mode 100644
index f651794..0000000
--- a/src/binding/fortran/use_mpi_f08/tests/fort_mpi_test1.f90
+++ /dev/null
@@ -1,41 +0,0 @@
-
-subroutine test1(rank)
-    use mpi_f08
-    implicit none
-
-    character*8 :: name='test1'
-    character*80 :: title='test 1: Send/Recv - send integer'
-    
-    integer :: rank, ierr, sint, i
-    integer, dimension(10) :: iar
-    type(MPI_Status) status
-    
-    if (rank .eq. 0) then
-        sint = 789
-        print *, ' ===== ', trim(title), ' ====='
-        print *, "rank 0 sends ", sint
-        ierr = MPI_SUCCESS
-        call mpi_send(sint, 1, MPI_INTEGER, 1, 567, MPI_COMM_WORLD, ierr);
-        if (ierr .ne. MPI_SUCCESS) then
-            print *,"PE ",rank,": ",name,": mpi_send exited in error (",ierr,")"
-        endif
-    else
-        ierr = MPI_SUCCESS
-        call mpi_recv(sint, 1, MPI_INTEGER, 0, 567, MPI_COMM_WORLD, status, ierr);
-        if (ierr .ne. MPI_SUCCESS) then
-            print *,"PE ",rank,": ",name,"mpi_recv exited in error (",ierr,")"
-        endif
-        print *, "rank 1 receives ",sint
-        if (sint .eq. 789) then
-            print *, "PE ", rank,": PASS - ", trim(title)
-        else
-            print *, "PE ", rank,": FAIL - ", trim(title)
-        endif
-    endif
-
-    call MPI_Barrier(MPI_COMM_WORLD, ierr);
-    if (ierr .ne. MPI_SUCCESS) then
-        print *,"PE ",rank,": ",name,": mpi_barrier exited in error (",ierr,")"
-        call MPI_Abort(MPI_COMM_WORLD, 9);
-    endif
-end
diff --git a/src/binding/fortran/use_mpi_f08/tests/fort_mpi_test10.f90 b/src/binding/fortran/use_mpi_f08/tests/fort_mpi_test10.f90
deleted file mode 100644
index 66287f5..0000000
--- a/src/binding/fortran/use_mpi_f08/tests/fort_mpi_test10.f90
+++ /dev/null
@@ -1,63 +0,0 @@
-
-subroutine test10(rank)
-    use mpi_f08
-    implicit none
-
-    character*8 :: name='test10'
-    character*80 :: title='test 10: Isend/Irecv - send integer'
-    
-    integer :: rank, ierr, sint, i
-    integer, dimension(10) :: iar
-    type(MPI_Request) request
-    type(MPI_Status) status
-    
-    if (rank .eq. 0) then
-        sint = 789
-        print *, ' ===== ', trim(title), ' ====='
-        print *, "rank 0 sends ", sint
-        ierr = MPI_SUCCESS
-
-        block
-            ASYNCHRONOUS :: sint
-
-            call mpi_isend(sint, 1, MPI_INTEGER, 1, 567, MPI_COMM_WORLD, request, ierr);
-            if (ierr .ne. MPI_SUCCESS) then
-                print *,"PE ",rank,": ",name,": mpi_isend exited in error (",ierr,")"
-            endif
-
-            call mpi_wait(request, status, ierr)
-            if (ierr .ne. MPI_SUCCESS) then
-                print *,"PE ",rank,": ",name,": mpi_wait exited in error (",ierr,")"
-            endif
-        end block
-    else
-        ierr = MPI_SUCCESS
-
-        block
-            ASYNCHRONOUS :: sint
-
-            call mpi_irecv(sint, 1, MPI_INTEGER, 0, 567, MPI_COMM_WORLD, request, ierr);
-            if (ierr .ne. MPI_SUCCESS) then
-                print *,"PE ",rank,": ",name,"mpi_irecv exited in error (",ierr,")"
-            endif
-
-            call mpi_wait(request, status, ierr)
-            if (ierr .ne. MPI_SUCCESS) then
-                print *,"PE ",rank,": ",name,": mpi_wait exited in error (",ierr,")"
-            endif
-        end block
-
-        print *, "rank 1 receives ",sint
-        if (sint .eq. 789) then
-            print *, "PE ", rank,": PASS - ", trim(title)
-        else
-            print *, "PE ", rank,": FAIL - ", trim(title)
-        endif
-    endif
-
-    call MPI_Barrier(MPI_COMM_WORLD, ierr);
-    if (ierr .ne. MPI_SUCCESS) then
-        print *,"PE ",rank,": ",name,": mpi_barrier exited in error (",ierr,")"
-        call MPI_Abort(MPI_COMM_WORLD, 9);
-    endif
-end
diff --git a/src/binding/fortran/use_mpi_f08/tests/fort_mpi_test11.f90 b/src/binding/fortran/use_mpi_f08/tests/fort_mpi_test11.f90
deleted file mode 100644
index 2831bef..0000000
--- a/src/binding/fortran/use_mpi_f08/tests/fort_mpi_test11.f90
+++ /dev/null
@@ -1,74 +0,0 @@
-
-subroutine test11(rank)
-    use mpi_f08
-    implicit none
-
-    character (len=10) :: name='test11'
-    character (len=80) :: title='test 11: Isend/Irecv - 1d array - iar(10)'
-    
-    integer :: rank, ierr, sint, i, errors
-    integer, dimension(10) :: iar
-    type(MPI_Request) request
-    type(MPI_Status) status
-    
-    if (rank .eq. 0) then
-        print *, ' ===== ', trim(title), ' ====='
-        do i=1,10
-            iar(i)=i
-        end do
-        ierr = MPI_SUCCESS
-
-        block
-            ASYNCHRONOUS :: iar
-
-            call mpi_isend(iar, 10, MPI_INTEGER, 1, 567, MPI_COMM_WORLD, request, ierr);
-            if (ierr .ne. MPI_SUCCESS) then
-                print *,"PE ",rank,": ",name,": mpi_isend exited in error (",ierr,")"
-            endif
-
-            call mpi_wait(request, status, ierr)
-            if (ierr .ne. MPI_SUCCESS) then
-                print *,"PE ",rank,": ",name,": mpi_wait exited in error (",ierr,")"
-            endif
-
-        end block
-
-    else if (rank .eq. 1) then
-        ierr = MPI_SUCCESS
-
-        block
-            ASYNCHRONOUS :: iar
-
-            call mpi_irecv(iar, 10, MPI_INTEGER, 0, 567, MPI_COMM_WORLD, request, ierr);
-            if (ierr .ne. MPI_SUCCESS) then
-                print *,"PE ",rank,": ",name,"mpi_irecv exited in error (",ierr,")"
-            endif
-
-            call mpi_wait(request, status, ierr)
-            if (ierr .ne. MPI_SUCCESS) then
-                print *,"PE ",rank,": ",name,": mpi_wait exited in error (",ierr,")"
-            endif
-
-        end block
-
-        errors = 0
-        do i=1,10
-            if (iar(i) .ne. i) then
-                print *, "rank 1: iar(", i, ")=", iar(i), ", expected ",i
-                errors = errors + 1
-            endif
-        end do
-        if (errors .eq. 0) then
-            print *, "PE ", rank,": PASS - ", trim(title)
-        else
-            print *, "PE ", rank,": FAIL - ", trim(title)
-        endif
-        print *, iar(1), iar(2), iar(3), iar(4), iar(5), iar(6), iar(7), iar(8), iar(9)
-    endif
-
-    call MPI_Barrier(MPI_COMM_WORLD, ierr);
-    if (ierr .ne. MPI_SUCCESS) then
-        print *,"PE ",rank,": ",name,": mpi_barrier exited in error (",ierr,")"
-        call MPI_Abort(MPI_COMM_WORLD, 9);
-    endif
-end subroutine test11
diff --git a/src/binding/fortran/use_mpi_f08/tests/fort_mpi_test12.f90 b/src/binding/fortran/use_mpi_f08/tests/fort_mpi_test12.f90
deleted file mode 100644
index 0b2ed19..0000000
--- a/src/binding/fortran/use_mpi_f08/tests/fort_mpi_test12.f90
+++ /dev/null
@@ -1,81 +0,0 @@
-
-subroutine test12(rank)
-    use mpi_f08
-    implicit none
-
-    character (len=10) :: name='test12'
-    character (len=80) :: title='test 12: Isend/Irecv array slice - iar(2:7)'
-    
-    integer :: rank, ierr, sint, i, errors
-    integer, dimension(10) ::  iar, iar_check
-    type(MPI_Request) request
-    type(MPI_Status) status
-    
-    if (rank .eq. 0) then
-        print *, ' ===== ', trim(title), ' ====='
-        do i=1,10
-            iar(i)=i
-        end do
-        ierr = MPI_SUCCESS
-
-        block
-            ASYNCHRONOUS :: iar
-
-            call mpi_isend(iar(2:7), 6, MPI_INTEGER, 1, 678, MPI_COMM_WORLD, request, ierr);
-            if (ierr .ne. MPI_SUCCESS) then
-                print *,"PE ",rank,": ",name,": mpi_isend exited in error (",ierr,")"
-            endif
-
-            call mpi_wait(request, status, ierr)
-            if (ierr .ne. MPI_SUCCESS) then
-                print *,"PE ",rank,": ",name,": mpi_wait exited in error (",ierr,")"
-            endif
-
-        end block
-
-    else if (rank .eq. 1) then
-        do i=1,10
-            iar(i)=0
-            iar_check(i)=0
-        end do
-        do i=2,7
-            iar_check(i)=i
-        end do
-        ierr = MPI_SUCCESS
-
-        block
-            ASYNCHRONOUS :: iar
-
-            call mpi_irecv(iar(2:7), 6, MPI_INTEGER, 0, 678, MPI_COMM_WORLD, request, ierr);
-            if (ierr .ne. MPI_SUCCESS) then
-                print *,"PE ",rank,": ",name,"mpi_irecv exited in error (",ierr,")"
-            endif
-
-            call mpi_wait(request, status, ierr)
-            if (ierr .ne. MPI_SUCCESS) then
-                print *,"PE ",rank,": ",name,": mpi_wait exited in error (",ierr,")"
-            endif
-
-        end block
-
-        errors = 0
-        do i=1,10
-            if (iar(i) .ne. iar_check(i)) then
-                print *, "rank 1: iar(", i, ")=", iar(i), ", expected ",iar_check(i)
-                errors = errors + 1
-            endif
-        end do
-        if (errors .eq. 0) then
-            print *, "PE ", rank,": PASS - test 12 - ", trim(title)
-        else
-            print *, "PE ", rank,": FAIL - test 12 - ", trim(title)
-        endif
-        print *, iar(1), iar(2), iar(3), iar(4), iar(5), iar(6), iar(7), iar(8), iar(9)
-    endif
-
-    call MPI_Barrier(MPI_COMM_WORLD, ierr);
-    if (ierr .ne. MPI_SUCCESS) then
-        print *,"PE ",rank,": ",name,": mpi_barrier exited in error (",ierr,")"
-        call MPI_Abort(MPI_COMM_WORLD, 9);
-    endif
-end subroutine test12
diff --git a/src/binding/fortran/use_mpi_f08/tests/fort_mpi_test18.f90 b/src/binding/fortran/use_mpi_f08/tests/fort_mpi_test18.f90
deleted file mode 100644
index 666243e..0000000
--- a/src/binding/fortran/use_mpi_f08/tests/fort_mpi_test18.f90
+++ /dev/null
@@ -1,109 +0,0 @@
-
-subroutine test18(rank)
-    use mpi_f08
-    implicit none
-
-    character (len=10) :: name='test18'
-    character (len=80) :: title='test 18: Isend/Irecv 2d array column slice - iar_2d(:,2:6:2)'
-    
-    integer :: rank, ierr, i, errors, j
-    integer, dimension(9,9) :: iar_2d, iar_2dch
-    type(MPI_Status) status
-    type(MPI_Request) request
-    
-    if (rank .eq. 0) then
-        print *, ' ===== ', trim(title), ' ====='
-
-        do i=1,9
-            do j=1,9
-                iar_2d(j,i) = (j * 10) + i
-            end do
-        end do
-
-        do j=1,9
-            print *, (iar_2d(i,j),i=1,9)
-        end do
-
-    else
-        do i=1,9
-            do j=1,9
-                iar_2d(j,i) = 0
-                iar_2dch(j,i) = 0
-            end do
-        end do
-
-        do i=2,6,2
-            do j=1,9
-                iar_2dch(j,i) = (j * 10) + i
-            end do
-        end do
-    endif
-
-    call MPI_Barrier(MPI_COMM_WORLD, ierr);
-    if (ierr .ne. MPI_SUCCESS) then
-        print *,"PE ",rank,": ",name,": A: mpi_barrier exited in error (",ierr,")"
-        call MPI_Abort(MPI_COMM_WORLD, 9);
-    endif
-
-    if (rank .eq. 0) then
-
-        ierr = MPI_SUCCESS
-
-        block
-            ASYNCHRONOUS :: iar_2d
-
-            call mpi_isend(iar_2d(:,2:6:2), 27, MPI_INTEGER, 1, 123, MPI_COMM_WORLD, request, ierr);
-            if (ierr .ne. MPI_SUCCESS) then
-                print *,"PE ",rank,": ",name,": mpi_isend exited in error (",ierr,")"
-            endif
-
-            call mpi_wait(request, status, ierr)
-            if (ierr .ne. MPI_SUCCESS) then
-                print *,"PE ",rank,": ",name,": mpi_wait exited in error (",ierr,")"
-            endif
-
-        end block
-
-    else if (rank .eq. 1) then
-
-        ierr = MPI_SUCCESS
-
-        block
-            ASYNCHRONOUS :: iar_2d
-
-            call mpi_irecv(iar_2d(:,2:6:2), 27, MPI_INTEGER, 0, 123, MPI_COMM_WORLD, request, ierr);
-            if (ierr .ne. MPI_SUCCESS) then
-                print *,"PE ",rank,": ",name,"mpi_irecv exited in error (",ierr,")"
-            endif
-
-            call mpi_wait(request, status, ierr)
-            if (ierr .ne. MPI_SUCCESS) then
-                print *,"PE ",rank,": ",name,": mpi_wait exited in error (",ierr,")"
-            endif
-        end block
-
-        errors = 0
-        do i=1,9
-            do j=1,9
-                if (iar_2d(j,i) .ne. iar_2dch(j,i)) then
-                    print *, "rank 1: iar_2d(", j, ",", i, ")=", iar_2d(j,i), ", expected ", iar_2dch(j,i)
-                    errors = errors + 1
-                endif
-            end do
-        end do
-        if (errors .eq. 0) then
-            print *, "PE ", rank,": PASS - ", trim(title)
-        else
-            print *, "PE ", rank,": FAIL - ", trim(title)
-        endif
-        do j=1,9
-            print *, (iar_2d(i,j),i=1,9)
-        end do
-    endif
-
-    call MPI_Barrier(MPI_COMM_WORLD, ierr);
-    if (ierr .ne. MPI_SUCCESS) then
-        print *,"PE ",rank,": ",name,": mpi_barrier exited in error (",ierr,")"
-        call MPI_Abort(MPI_COMM_WORLD, 9);
-    endif
-end subroutine test18
diff --git a/src/binding/fortran/use_mpi_f08/tests/fort_mpi_test19.f90 b/src/binding/fortran/use_mpi_f08/tests/fort_mpi_test19.f90
deleted file mode 100644
index c6fd97d..0000000
--- a/src/binding/fortran/use_mpi_f08/tests/fort_mpi_test19.f90
+++ /dev/null
@@ -1,107 +0,0 @@
-
-subroutine test19(rank)
-    use mpi_f08
-    implicit none
-
-    character (len=10) :: name='test19'
-    character (len=80) :: title='test 19: Isend/Irecv 2d array column slice - iar_2d(1:7:3,2:6:2)'
-    
-    integer :: rank, ierr, i, errors, j
-    integer, dimension(9,9) :: iar_2d, iar_2dch
-    type(MPI_Status) status
-    type(MPI_Request) request
-    
-    if (rank .eq. 0) then
-        print *, ' ===== ', trim(title), ' ====='
-
-        do i=1,9
-            do j=1,9
-                iar_2d(j,i) = (j * 10) + i
-            end do
-        end do
-
-        do j=1,9
-            print *, (iar_2d(i,j),i=1,9)
-        end do
-
-    else
-        do i=1,9
-            do j=1,9
-                iar_2d(j,i) = 0
-                iar_2dch(j,i) = 0
-            end do
-        end do
-        do i=2,6,2
-            do j=1,7,3
-                iar_2dch(j,i) = (j * 10) + i
-            end do
-        end do
-
-    endif
-
-    call MPI_Barrier(MPI_COMM_WORLD, ierr);
-    if (ierr .ne. MPI_SUCCESS) then
-        print *,"PE ",rank,": ",name,": A: mpi_barrier exited in error (",ierr,")"
-        call MPI_Abort(MPI_COMM_WORLD, 9);
-    endif
-
-    if (rank .eq. 0) then
-        ierr = MPI_SUCCESS
-
-        block
-            ASYNCHRONOUS :: iar_2d
-            call mpi_isend(iar_2d(1:7:3,2:6:2), 27, MPI_INTEGER, 1, 123, MPI_COMM_WORLD, request, ierr);
-            if (ierr .ne. MPI_SUCCESS) then
-                print *,"PE ",rank,": ",name,": mpi_isend exited in error (",ierr,")"
-            endif
-
-            call mpi_wait(request, status, ierr)
-            if (ierr .ne. MPI_SUCCESS) then
-                print *,"PE ",rank,": ",name,": mpi_wait exited in error (",ierr,")"
-            endif
-
-        end block
-    else if (rank .eq. 1) then
-
-        ierr = MPI_SUCCESS
-
-        block
-            ASYNCHRONOUS :: iar_2d
-
-            call mpi_irecv(iar_2d(1:7:3,2:6:2), 27, MPI_INTEGER, 0, 123, MPI_COMM_WORLD, request, ierr);
-            if (ierr .ne. MPI_SUCCESS) then
-                print *,"PE ",rank,": ",name,"mpi_irecv exited in error (",ierr,")"
-            endif
-
-            call mpi_wait(request, status, ierr)
-            if (ierr .ne. MPI_SUCCESS) then
-                print *,"PE ",rank,": ",name,": mpi_wait exited in error (",ierr,")"
-            endif
-
-        end block
-
-        errors = 0
-        do i=2,6,2
-            do j=1,7,3
-                if (iar_2d(j,i) .ne. iar_2dch(j,i)) then
-                    print *, "rank 1: iar_2d(", j, ",", i, ")=", iar_2d(j,i), ", expected ", iar_2dch(j,i)
-                    errors = errors + 1
-                endif
-            end do
-        end do
-        if (errors .eq. 0) then
-            print *, "PE ", rank,": PASS - ", trim(title)
-        else
-            print *, "PE ", rank,": FAIL - ", trim(title)
-        endif
-        do j=1,9
-            print *, (iar_2d(i,j),i=1,9)
-        end do
-    endif
-
-    call MPI_Barrier(MPI_COMM_WORLD, ierr);
-    if (ierr .ne. MPI_SUCCESS) then
-        print *,"PE ",rank,": ",name,": mpi_barrier exited in error (",ierr,")"
-        call MPI_Abort(MPI_COMM_WORLD, 9);
-    endif
-end subroutine test19
diff --git a/src/binding/fortran/use_mpi_f08/tests/fort_mpi_test2.f90 b/src/binding/fortran/use_mpi_f08/tests/fort_mpi_test2.f90
deleted file mode 100644
index a058a80..0000000
--- a/src/binding/fortran/use_mpi_f08/tests/fort_mpi_test2.f90
+++ /dev/null
@@ -1,49 +0,0 @@
-
-subroutine test2(rank)
-    use mpi_f08
-    implicit none
-
-    character (len=10) :: name='test2'
-    character (len=80) :: title='test 2: Send/Recv - 1d array - iar(10)'
-    
-    integer :: rank, ierr, i, errors
-    integer, dimension(10) ::  iar
-    type(MPI_Status) status
-    
-    if (rank .eq. 0) then
-        print *, ' ===== ', trim(title), ' ====='
-        do i=1,10
-            iar(i)=i
-        end do
-        ierr = MPI_SUCCESS
-        call mpi_send(iar, 10, MPI_INTEGER, 1, 567, MPI_COMM_WORLD, ierr);
-        if (ierr .ne. MPI_SUCCESS) then
-            print *,"PE ",rank,": ",name,": mpi_send exited in error (",ierr,")"
-        endif
-    else if (rank .eq. 1) then
-        ierr = MPI_SUCCESS
-        call mpi_recv(iar, 10, MPI_INTEGER, 0, 567, MPI_COMM_WORLD, status, ierr);
-        if (ierr .ne. MPI_SUCCESS) then
-            print *,"PE ",rank,": ",name,"mpi_recv exited in error (",ierr,")"
-        endif
-        errors = 0
-        do i=1,10
-            if (iar(i) .ne. i) then
-                print *, "rank 1: iar(", i, ")=", iar(i), ", expected ",i
-                errors = errors + 1
-            endif
-        end do
-        if (errors .eq. 0) then
-            print *, "PE ", rank,": PASS - ", trim(title)
-        else
-            print *, "PE ", rank,": FAIL - ", trim(title)
-        endif
-        print *, iar(1), iar(2), iar(3), iar(4), iar(5), iar(6), iar(7), iar(8), iar(9)
-    endif
-
-    call MPI_Barrier(MPI_COMM_WORLD, ierr);
-    if (ierr .ne. MPI_SUCCESS) then
-        print *,"PE ",rank,": ",name,": mpi_barrier exited in error (",ierr,")"
-        call MPI_Abort(MPI_COMM_WORLD, 9);
-    endif
-end subroutine test2
diff --git a/src/binding/fortran/use_mpi_f08/tests/fort_mpi_test3.f90 b/src/binding/fortran/use_mpi_f08/tests/fort_mpi_test3.f90
deleted file mode 100644
index 917054b..0000000
--- a/src/binding/fortran/use_mpi_f08/tests/fort_mpi_test3.f90
+++ /dev/null
@@ -1,56 +0,0 @@
-
-subroutine test3(rank)
-    use mpi_f08
-    implicit none
-
-    character (len=10) :: name='test3'
-    character (len=80) :: title='test 3: Send/Recv array slice - iar(2:7)'
-    
-    integer :: rank, ierr, i, errors
-    integer, dimension(10) ::  iar, iar_check
-    type(MPI_Status) status
-    
-    if (rank .eq. 0) then
-        print *, ' ===== ', trim(title), ' ====='
-        do i=1,10
-            iar(i)=i
-        end do
-        ierr = MPI_SUCCESS
-        call mpi_send(iar(2:7), 6, MPI_INTEGER, 1, 678, MPI_COMM_WORLD, ierr);
-        if (ierr .ne. MPI_SUCCESS) then
-            print *,"PE ",rank,": ",name,": mpi_send exited in error (",ierr,")"
-        endif
-    else if (rank .eq. 1) then
-        do i=1,10
-            iar(i)=0
-            iar_check(i)=0
-        end do
-        do i=2,7
-            iar_check(i)=i
-        end do
-        ierr = MPI_SUCCESS
-        call mpi_recv(iar(2:7), 6, MPI_INTEGER, 0, 678, MPI_COMM_WORLD, status, ierr);
-        if (ierr .ne. MPI_SUCCESS) then
-            print *,"PE ",rank,": ",name,"mpi_recv exited in error (",ierr,")"
-        endif
-        errors = 0
-        do i=1,10
-            if (iar(i) .ne. iar_check(i)) then
-                print *, "rank 1: iar(", i, ")=", iar(i), ", expected ",iar_check(i)
-                errors = errors + 1
-            endif
-        end do
-        if (errors .eq. 0) then
-            print *, "PE ", rank,": PASS - test 3 - ", trim(title)
-        else
-            print *, "PE ", rank,": FAIL - test 3 - ", trim(title)
-        endif
-        print *, iar(1), iar(2), iar(3), iar(4), iar(5), iar(6), iar(7), iar(8), iar(9)
-    endif
-
-    call MPI_Barrier(MPI_COMM_WORLD, ierr);
-    if (ierr .ne. MPI_SUCCESS) then
-        print *,"PE ",rank,": ",name,": mpi_barrier exited in error (",ierr,")"
-        call MPI_Abort(MPI_COMM_WORLD, 9);
-    endif
-end subroutine test3
diff --git a/src/binding/fortran/use_mpi_f08/tests/fort_mpi_test4.f90 b/src/binding/fortran/use_mpi_f08/tests/fort_mpi_test4.f90
deleted file mode 100644
index 87f9225..0000000
--- a/src/binding/fortran/use_mpi_f08/tests/fort_mpi_test4.f90
+++ /dev/null
@@ -1,56 +0,0 @@
-
-subroutine test4(rank)
-    use mpi_f08
-    implicit none
-
-    character (len=10) :: name='test4'
-    character (len=80) :: title='test 4: Send/Recv array slice with stride - iar(2:8:2)'
-    
-    integer :: rank, ierr, i, errors
-    integer, dimension(10) ::  iar, iar_check
-    type(MPI_Status) status
-    
-    if (rank .eq. 0) then
-        print *, ' ===== ', trim(title), ' ====='
-        do i=1,10
-            iar(i)=i
-        end do
-        ierr = MPI_SUCCESS
-        call mpi_send(iar(2:8:2), 4, MPI_INTEGER, 1, 789, MPI_COMM_WORLD, ierr);
-        if (ierr .ne. MPI_SUCCESS) then
-            print *,"PE ",rank,": ",name,": mpi_send exited in error (",ierr,")"
-        endif
-    else if (rank .eq. 1) then
-        do i=1,10
-            iar(i)=0
-            iar_check(i)=0
-        end do
-        do i=2,8,2
-            iar_check(i)=i
-        end do
-        ierr = MPI_SUCCESS
-        call mpi_recv(iar(2:8:2), 4, MPI_INTEGER, 0, 789, MPI_COMM_WORLD, status, ierr);
-        if (ierr .ne. MPI_SUCCESS) then
-            print *,"PE ",rank,": ",name,"mpi_recv exited in error (",ierr,")"
-        endif
-        errors = 0
-        do i=1,10
-            if (iar(i) .ne. iar_check(i)) then
-                print *, "rank 1: iar(", i, ")=", iar(i), ", expected ",iar_check(i)
-                errors = errors + 1
-            endif
-        end do
-        if (errors .eq. 0) then
-            print *, "PE ", rank,": PASS - ", trim(title)
-        else
-            print *, "PE ", rank,": FAIL - ", trim(title)
-        endif
-        print *, iar(1), iar(2), iar(3), iar(4), iar(5), iar(6), iar(7), iar(8), iar(9)
-    endif
-
-    call MPI_Barrier(MPI_COMM_WORLD, ierr);
-    if (ierr .ne. MPI_SUCCESS) then
-        print *,"PE ",rank,": ",name,": mpi_barrier exited in error (",ierr,")"
-        call MPI_Abort(MPI_COMM_WORLD, 9);
-    endif
-end subroutine test4
diff --git a/src/binding/fortran/use_mpi_f08/tests/fort_mpi_test5.f90 b/src/binding/fortran/use_mpi_f08/tests/fort_mpi_test5.f90
deleted file mode 100644
index db90789..0000000
--- a/src/binding/fortran/use_mpi_f08/tests/fort_mpi_test5.f90
+++ /dev/null
@@ -1,78 +0,0 @@
-
-subroutine test5(rank)
-    use mpi_f08
-    implicit none
-
-    character (len=10) :: name='test5'
-    character (len=80) :: title='test 5: Send/Recv 2d array - iar(9,9)'
-    
-    integer :: rank, ierr, i, errors, j
-    integer, dimension(9,9) :: iar_2d
-    type(MPI_Status) status
-    
-    if (rank .eq. 0) then
-        print *, ' ===== ', trim(title), ' ====='
-
-        do i=1,9
-            do j=1,9
-                iar_2d(j,i) = (j * 10) + i
-            end do
-        end do
-
-        do j=1,9
-            print *, (iar_2d(i,j),i=1,9)
-        end do
-
-    else
-        do i=1,9
-            do j=1,9
-                iar_2d(j,i) = 0
-            end do
-        end do
-
-    endif
-
-    call MPI_Barrier(MPI_COMM_WORLD, ierr);
-    if (ierr .ne. MPI_SUCCESS) then
-        print *,"PE ",rank,": ",name,": A: mpi_barrier exited in error (",ierr,")"
-        call MPI_Abort(MPI_COMM_WORLD, 9);
-    endif
-
-    if (rank .eq. 0) then
-        ierr = MPI_SUCCESS
-        call mpi_send(iar_2d, 81, MPI_INTEGER, 1, 890, MPI_COMM_WORLD, ierr);
-        if (ierr .ne. MPI_SUCCESS) then
-            print *,"PE ",rank,": ",name,": mpi_send exited in error (",ierr,")"
-        endif
-    else if (rank .eq. 1) then
-        ierr = MPI_SUCCESS
-        call mpi_recv(iar_2d, 81, MPI_INTEGER, 0, 890, MPI_COMM_WORLD, status, ierr);
-        if (ierr .ne. MPI_SUCCESS) then
-            print *,"PE ",rank,": ",name,"mpi_recv exited in error (",ierr,")"
-        endif
-
-        errors = 0
-        do i=1,9
-            do j=1,9
-                if (iar_2d(j,i) .ne. (j * 10) + i) then
-                    print *, "rank 1: iar_2d(", j, ",", i, ")=", iar_2d(j,i), ", expected ", (j * 10) + i
-                    errors = errors + 1
-                endif
-            end do
-        end do
-        if (errors .eq. 0) then
-            print *, "PE ", rank,": PASS - ", trim(title)
-        else
-            print *, "PE ", rank,": FAIL - ", trim(title)
-        endif
-        do j=1,9
-            print *, (iar_2d(i,j),i=1,9)
-        end do
-    endif
-
-    call MPI_Barrier(MPI_COMM_WORLD, ierr);
-    if (ierr .ne. MPI_SUCCESS) then
-        print *,"PE ",rank,": ",name,": mpi_barrier exited in error (",ierr,")"
-        call MPI_Abort(MPI_COMM_WORLD, 9);
-    endif
-end subroutine test5
diff --git a/src/binding/fortran/use_mpi_f08/tests/fort_mpi_test6.f90 b/src/binding/fortran/use_mpi_f08/tests/fort_mpi_test6.f90
deleted file mode 100644
index ba648a1..0000000
--- a/src/binding/fortran/use_mpi_f08/tests/fort_mpi_test6.f90
+++ /dev/null
@@ -1,81 +0,0 @@
-
-subroutine test6(rank)
-    use mpi_f08
-    implicit none
-
-    character (len=10) :: name='test6'
-    character (len=80) :: title='test 6: Send/Recv 2d array column - iar_2d(:,3)'
-    integer :: rank, ierr, i, errors, j
-    integer, dimension(9,9) :: iar_2d, iar_2dch
-    type(MPI_Status) status
-    
-    if (rank .eq. 0) then
-        print *, ' ===== ', trim(title), ' ====='
-
-        do i=1,9
-            do j=1,9
-                iar_2d(j,i) = (j * 10) + i
-            end do
-        end do
-
-        do j=1,9
-            print *, (iar_2d(i,j),i=1,9)
-        end do
-
-    else
-        do i=1,9
-            do j=1,9
-                iar_2d(j,i) = 0
-                iar_2dch(j,i) = 0
-            end do
-        end do
-
-        do j=1,9
-            iar_2dch(j,3) = (j * 10) + 3
-        end do
-    endif
-
-    call MPI_Barrier(MPI_COMM_WORLD, ierr);
-    if (ierr .ne. MPI_SUCCESS) then
-        print *,"PE ",rank,": ",name,": A: mpi_barrier exited in error (",ierr,")"
-        call MPI_Abort(MPI_COMM_WORLD, 9);
-    endif
-
-    if (rank .eq. 0) then
-        ierr = MPI_SUCCESS
-        call mpi_send(iar_2d(:,3), 9, MPI_INTEGER, 1, 890, MPI_COMM_WORLD, ierr);
-        if (ierr .ne. MPI_SUCCESS) then
-            print *,"PE ",rank,": ",name,": mpi_send exited in error (",ierr,")"
-        endif
-    else if (rank .eq. 1) then
-        ierr = MPI_SUCCESS
-        call mpi_recv(iar_2d(:,3), 9, MPI_INTEGER, 0, 890, MPI_COMM_WORLD, status, ierr);
-        if (ierr .ne. MPI_SUCCESS) then
-            print *,"PE ",rank,": ",name,"mpi_recv exited in error (",ierr,")"
-        endif
-
-        errors = 0
-        do i=1,9
-            do j=1,9
-                if (iar_2d(j,i) .ne. iar_2dch(j,i)) then
-                    print *, "rank 1: iar_2d(", j, ",", i, ")=", iar_2d(j,i), ", expected ", iar_2dch(j,i)
-                    errors = errors + 1
-                endif
-            end do
-        end do
-        if (errors .eq. 0) then
-            print *, "PE ", rank,": PASS - ", trim(title)
-        else
-            print *, "PE ", rank,": FAIL - ", trim(title)
-        endif
-        do j=1,9
-            print *, (iar_2d(i,j),i=1,9)
-        end do
-    endif
-
-    call MPI_Barrier(MPI_COMM_WORLD, ierr);
-    if (ierr .ne. MPI_SUCCESS) then
-        print *,"PE ",rank,": ",name,": mpi_barrier exited in error (",ierr,")"
-        call MPI_Abort(MPI_COMM_WORLD, 9);
-    endif
-end subroutine test6
diff --git a/src/binding/fortran/use_mpi_f08/tests/fort_mpi_test7.f90 b/src/binding/fortran/use_mpi_f08/tests/fort_mpi_test7.f90
deleted file mode 100644
index 3a081b8..0000000
--- a/src/binding/fortran/use_mpi_f08/tests/fort_mpi_test7.f90
+++ /dev/null
@@ -1,85 +0,0 @@
-
-subroutine test7(rank)
-    use mpi_f08
-    implicit none
-
-    character (len=10) :: name='test7'
-    character (len=80) :: title='test 7: Send/Recv 2d array row - iar_2d(6,:)'
-    
-    integer :: rank, ierr, i, errors, j
-    integer, dimension(9,9) :: iar_2d, iar_2dch
-    type(MPI_Status) status
-    
-    if (rank .eq. 0) then
-        print *, ' ===== ', trim(title), ' ====='
-
-        do i=1,9
-            do j=1,9
-                iar_2d(j,i) = (j * 10) + i
-            end do
-        end do
-
-        do j=1,9
-            print *, (iar_2d(i,j),i=1,9)
-        end do
-
-    else
-        do i=1,9
-            do j=1,9
-                iar_2d(j,i) = 0
-                iar_2dch(j,i) = 0
-            end do
-        end do
-
-        do i=1,9
-            do j=6,6
-                iar_2dch(j,i) = (j * 10) + i
-            end do
-        end do
-    endif
-
-    call MPI_Barrier(MPI_COMM_WORLD, ierr);
-    if (ierr .ne. MPI_SUCCESS) then
-        print *,"PE ",rank,": ",name,": A: mpi_barrier exited in error (",ierr,")"
-        call MPI_Abort(MPI_COMM_WORLD, 9);
-    endif
-
-    if (rank .eq. 0) then
-        ierr = MPI_SUCCESS
-        call mpi_send(iar_2d(6,:), 9, MPI_INTEGER, 1, 890, MPI_COMM_WORLD, ierr);
-        if (ierr .ne. MPI_SUCCESS) then
-            print *,"PE ",rank,": ",name,": mpi_send exited in error (",ierr,")"
-        endif
-    else if (rank .eq. 1) then
-        ierr = MPI_SUCCESS
-        call mpi_recv(iar_2d(6,:), 9, MPI_INTEGER, 0, 890, MPI_COMM_WORLD, status, ierr);
-        if (ierr .ne. MPI_SUCCESS) then
-            print *,"PE ",rank,": ",name,"mpi_recv exited in error (",ierr,")"
-        endif
-
-        errors = 0
-        do i=1,9
-            do j=1,9
-                if (iar_2d(j,i) .ne. iar_2dch(j,i)) then
-                    print *, "rank 1: iar_2d(", j, ",", i, ")=", iar_2d(j,i), ", expected ", iar_2dch(j,i)
-                    errors = errors + 1
-                endif
-            end do
-        end do
-        if (errors .eq. 0) then
-            print *, "PE ", rank,": PASS - ", trim(title)
-        else
-            print *, "PE ", rank,": FAIL - ", trim(title)
-        endif
-        do j=1,9
-            print *, (iar_2d(i,j),i=1,9)
-        end do
-
-    endif
-
-    call MPI_Barrier(MPI_COMM_WORLD, ierr);
-    if (ierr .ne. MPI_SUCCESS) then
-        print *,"PE ",rank,": ",name,": mpi_barrier exited in error (",ierr,")"
-        call MPI_Abort(MPI_COMM_WORLD, 9);
-    endif
-end subroutine test7
diff --git a/src/binding/fortran/use_mpi_f08/tests/fort_mpi_test8.f90 b/src/binding/fortran/use_mpi_f08/tests/fort_mpi_test8.f90
deleted file mode 100644
index accb6f1..0000000
--- a/src/binding/fortran/use_mpi_f08/tests/fort_mpi_test8.f90
+++ /dev/null
@@ -1,84 +0,0 @@
-
-subroutine test8(rank)
-    use mpi_f08
-    implicit none
-
-    character (len=10) :: name='test8'
-    character (len=80) :: title='test 8: Send/Recv 2d array column slice - iar_2d(:,2:6:2)'
-    
-    integer :: rank, ierr, i, errors, j
-    integer, dimension(9,9) :: iar_2d, iar_2dch
-    type(MPI_Status) status
-    
-    if (rank .eq. 0) then
-        print *, ' ===== ', trim(title), ' ====='
-
-        do i=1,9
-            do j=1,9
-                iar_2d(j,i) = (j * 10) + i
-            end do
-        end do
-
-        do j=1,9
-            print *, (iar_2d(i,j),i=1,9)
-        end do
-
-    else
-        do i=1,9
-            do j=1,9
-                iar_2d(j,i) = 0
-                iar_2dch(j,i) = 0
-            end do
-        end do
-
-        do i=2,6,2
-            do j=1,9
-                iar_2dch(j,i) = (j * 10) + i
-            end do
-        end do
-    endif
-
-    call MPI_Barrier(MPI_COMM_WORLD, ierr);
-    if (ierr .ne. MPI_SUCCESS) then
-        print *,"PE ",rank,": ",name,": A: mpi_barrier exited in error (",ierr,")"
-        call MPI_Abort(MPI_COMM_WORLD, 9);
-    endif
-
-    if (rank .eq. 0) then
-        ierr = MPI_SUCCESS
-        call mpi_send(iar_2d(:,2:6:2), 27, MPI_INTEGER, 1, 123, MPI_COMM_WORLD, ierr);
-        if (ierr .ne. MPI_SUCCESS) then
-            print *,"PE ",rank,": ",name,": mpi_send exited in error (",ierr,")"
-        endif
-    else if (rank .eq. 1) then
-        ierr = MPI_SUCCESS
-        call mpi_recv(iar_2d(:,2:6:2), 27, MPI_INTEGER, 0, 123, MPI_COMM_WORLD, status, ierr);
-        if (ierr .ne. MPI_SUCCESS) then
-            print *,"PE ",rank,": ",name,"mpi_recv exited in error (",ierr,")"
-        endif
-
-        errors = 0
-        do i=1,9
-            do j=1,9
-                if (iar_2d(j,i) .ne. iar_2dch(j,i)) then
-                    print *, "rank 1: iar_2d(", j, ",", i, ")=", iar_2d(j,i), ", expected ", iar_2dch(j,i)
-                    errors = errors + 1
-                endif
-            end do
-        end do
-        if (errors .eq. 0) then
-            print *, "PE ", rank,": PASS - ", trim(title)
-        else
-            print *, "PE ", rank,": FAIL - ", trim(title)
-        endif
-        do j=1,9
-            print *, (iar_2d(i,j),i=1,9)
-        end do
-    endif
-
-    call MPI_Barrier(MPI_COMM_WORLD, ierr);
-    if (ierr .ne. MPI_SUCCESS) then
-        print *,"PE ",rank,": ",name,": mpi_barrier exited in error (",ierr,")"
-        call MPI_Abort(MPI_COMM_WORLD, 9);
-    endif
-end subroutine test8
diff --git a/src/binding/fortran/use_mpi_f08/tests/fort_mpi_test9.f90 b/src/binding/fortran/use_mpi_f08/tests/fort_mpi_test9.f90
deleted file mode 100644
index b04d110..0000000
--- a/src/binding/fortran/use_mpi_f08/tests/fort_mpi_test9.f90
+++ /dev/null
@@ -1,84 +0,0 @@
-
-subroutine test9(rank)
-    use mpi_f08
-    implicit none
-
-    character (len=10) :: name='test9'
-    character (len=80) :: title='test 9: Send/Recv 2d array column slice - iar_2d(1:7:3,2:6:2)'
-    
-    integer :: rank, ierr, i, errors, j
-    integer, dimension(9,9) :: iar_2d, iar_2dch
-    type(MPI_Status) status
-    
-    if (rank .eq. 0) then
-        print *, ' ===== ', trim(title), ' ====='
-
-        do i=1,9
-            do j=1,9
-                iar_2d(j,i) = (j * 10) + i
-            end do
-        end do
-
-        do j=1,9
-            print *, (iar_2d(i,j),i=1,9)
-        end do
-
-    else
-        do i=1,9
-            do j=1,9
-                iar_2d(j,i) = 0
-                iar_2dch(j,i) = 0
-            end do
-        end do
-        do i=2,6,2
-            do j=1,7,3
-                iar_2dch(j,i) = (j * 10) + i
-            end do
-        end do
-
-    endif
-
-    call MPI_Barrier(MPI_COMM_WORLD, ierr);
-    if (ierr .ne. MPI_SUCCESS) then
-        print *,"PE ",rank,": ",name,": A: mpi_barrier exited in error (",ierr,")"
-        call MPI_Abort(MPI_COMM_WORLD, 9);
-    endif
-
-    if (rank .eq. 0) then
-        ierr = MPI_SUCCESS
-        call mpi_send(iar_2d(1:7:3,2:6:2), 27, MPI_INTEGER, 1, 123, MPI_COMM_WORLD, ierr);
-        if (ierr .ne. MPI_SUCCESS) then
-            print *,"PE ",rank,": ",name,": mpi_send exited in error (",ierr,")"
-        endif
-    else if (rank .eq. 1) then
-        ierr = MPI_SUCCESS
-        call mpi_recv(iar_2d(1:7:3,2:6:2), 27, MPI_INTEGER, 0, 123, MPI_COMM_WORLD, status, ierr);
-        if (ierr .ne. MPI_SUCCESS) then
-            print *,"PE ",rank,": ",name,"mpi_recv exited in error (",ierr,")"
-        endif
-
-        errors = 0
-        do i=2,6,2
-            do j=1,7,3
-                if (iar_2d(j,i) .ne. iar_2dch(j,i)) then
-                    print *, "rank 1: iar_2d(", j, ",", i, ")=", iar_2d(j,i), ", expected ", iar_2dch(j,i)
-                    errors = errors + 1
-                endif
-            end do
-        end do
-        if (errors .eq. 0) then
-            print *, "PE ", rank,": PASS - ", trim(title)
-        else
-            print *, "PE ", rank,": FAIL - ", trim(title)
-        endif
-        do j=1,9
-            print *, (iar_2d(i,j),i=1,9)
-        end do
-    endif
-
-    call MPI_Barrier(MPI_COMM_WORLD, ierr);
-    if (ierr .ne. MPI_SUCCESS) then
-        print *,"PE ",rank,": ",name,": mpi_barrier exited in error (",ierr,")"
-        call MPI_Abort(MPI_COMM_WORLD, 9);
-    endif
-end subroutine test9
diff --git a/src/binding/fortran/use_mpi_f08/tests/fort_mpi_tests.f90 b/src/binding/fortran/use_mpi_f08/tests/fort_mpi_tests.f90
deleted file mode 100644
index d9c6490..0000000
--- a/src/binding/fortran/use_mpi_f08/tests/fort_mpi_tests.f90
+++ /dev/null
@@ -1,59 +0,0 @@
-
-program main
-    use mpi_f08
-    implicit none
-
-    integer size, rank, ierr
-
-    call mpi_init(ierr)
-
-    call mpi_comm_size(MPI_COMM_WORLD, size, ierr)
-    call mpi_comm_rank(MPI_COMM_WORLD, rank, ierr)
-
-    print *, 'Hello, I am ', rank, ' of ', size, '.'
-
-    ! Simple scalar
-    call test1(rank)
-
-    ! Send/Recv iar(10)
-    call test2(rank)
-
-    ! Send/Recv iar(2:7)
-    call test3(rank)
-
-    ! Send/Recv iar(2:8:2)
-    call test4(rank)
-
-    ! Send/Recv iar_2d(9,9)
-    call test5(rank)
-
-    ! Send/Recv 2d row iar_2d(:,3)
-    call test6(rank)
-
-    ! Send/Recv 2d row iar_2d(6,:)
-    call test7(rank)
-
-    ! Send/Recv 2d row iar_2d(:,2:6:2)
-    call test8(rank)
-
-    ! Send/Recv 2d row iar_2d(1:7:3,2:6:2)
-    call test9(rank)
-
-    ! Isend/Irecv 2d row iar_2d(:,2:6:2)
-    call test10(rank)
-
-    ! Isend/Irecv iar(10)
-    call test11(rank)
-
-    ! Isend/Irecv iar(2:7)
-    call test12(rank)
-
-    ! Isend/Irecv 2d row iar_2d(:,2:6:2)
-    call test18(rank)
-
-    ! Isend/Irecv 2d row iar_2d(1:7:3,2:6:2)
-    call test19(rank)
-
-    call mpi_finalize(ierr)
-end program main
-
diff --git a/src/binding/fortran/use_mpi_f08/tests/fort_test.f90 b/src/binding/fortran/use_mpi_f08/tests/fort_test.f90
deleted file mode 100644
index 5274444..0000000
--- a/src/binding/fortran/use_mpi_f08/tests/fort_test.f90
+++ /dev/null
@@ -1,150 +0,0 @@
-!
-program main
-
-use mpi_f08
-
-implicit none
-
-integer ierr
-integer size, rank
-integer sint, iar(10)
-type(MPI_Status) status
-integer i
-integer junk(100)
-integer save_my_rank
-
-call mpi_init(ierr)
-
-call mpi_comm_size(MPI_COMM_WORLD, size, ierr)
-call mpi_comm_rank(MPI_COMM_WORLD, rank, ierr)
-
-print *, 'Hello, I am ', rank, ' of ', size, '.'
-
-save_my_rank = rank
-
-! ----------------------------------------------------------
-if (rank .eq. 0) then
-    sint = 789
-    print *, ' ===== Trivial send/recv ====='
-    print *, "rank 0 sends ", sint
-    ierr = MPI_SUCCESS
-    call mpi_send(sint, 1, MPI_INTEGER, 1, 567, MPI_COMM_WORLD, ierr);
-    if (ierr .ne. MPI_SUCCESS) then
-        print *, "PE ", rank, ": mpi_send exited in error (",ierr,")"
-    endif
-else
-    ierr = MPI_SUCCESS
-    call mpi_recv(sint, 1, MPI_INTEGER, 0, 567, MPI_COMM_WORLD, status, ierr);
-    if (ierr .ne. MPI_SUCCESS) then
-        print *, "PE ", rank,": mpi_recv exited in error (",ierr,")"
-    endif
-    print *, "rank 1 receives ",sint
-endif
-
-call MPI_Barrier(MPI_COMM_WORLD, ierr);
-if (ierr .ne. MPI_SUCCESS) then
-    print *, "PE ", rank, ": mpi_barrier exited in error (",ierr,")"
-    call MPI_Abort(MPI_COMM_WORLD, 9);
-endif
-
-! ----------------------------------------------------------
-if (rank .eq. 0) then
-    print *, ' ===== Send/Recv iar(10) ====='
-    do i=1,10
-        iar(i)=i
-    end do
-    ierr = MPI_SUCCESS
-    print *, 'PE 0: loc(iar)=',loc(iar)
-    call mpi_send(iar, 10, MPI_INTEGER, 1, 567, MPI_COMM_WORLD, ierr);
-    if (ierr .ne. MPI_SUCCESS) then
-        print *, "PE ", rank, ": mpi_send exited in error (",ierr,")"
-    endif
-else if (rank .eq. 1) then
-    ierr = MPI_SUCCESS
-    print *, 'PE 1: loc(iar)=',loc(iar)
-    call mpi_recv(iar, 10, MPI_INTEGER, 0, 567, MPI_COMM_WORLD, status, ierr);
-    if (ierr .ne. MPI_SUCCESS) then
-        print *, "PE 1: mpi_recv exited in error (",ierr,")"
-    endif
-    do i=1,10
-        if (iar(i) .ne. i) then
-            print *, "rank 1: iar(", i, ")=", iar(i), ", expected ",i
-        endif
-    end do
-endif
-
-call MPI_Barrier(MPI_COMM_WORLD, ierr);
-if (ierr .ne. MPI_SUCCESS) then
-    print *, "PE ", rank, ": mpi_barrier exited in error (",ierr,")"
-    call MPI_Abort(MPI_COMM_WORLD, 9);
-endif
-
-! ----------------------------------------------------------
-if (rank .eq. 0) then
-    print *, ' ===== Send/Recv iar(2:7) ====='
-    do i=1,10
-        iar(i)=i
-    end do
-    ierr = MPI_SUCCESS
-    print *, 'PE ', rank, '(0),[', save_my_rank, ']: loc(iar)=',loc(iar)
-    print *, 'PE 0: loc(iar)=',loc(iar)
-    call mpi_send(iar(2:7), 10, MPI_INTEGER, 1, 678, MPI_COMM_WORLD, ierr);
-    if (ierr .ne. MPI_SUCCESS) then
-        print *, "PE ", rank, "(0): mpi_send exited in error (",ierr,")"
-    endif
-else if (rank .eq. 1) then
-    ierr = MPI_SUCCESS
-    print *, 'PE 1: loc(iar)=',loc(iar)
-    call mpi_recv(iar(2:7), 10, MPI_INTEGER, 0, 678, MPI_COMM_WORLD, status, ierr);
-    if (ierr .ne. MPI_SUCCESS) then
-        print *, "PE ", rank, "(1): mpi_recv exited in error (",ierr,")"
-    endif
-    do i=2,7
-        if (iar(i) .ne. i) then
-            print *, "rank 1: iar(", i, ")=", iar(i), ", expected ",i
-        endif
-    end do
-endif
-
-call MPI_Barrier(MPI_COMM_WORLD, ierr);
-if (ierr .ne. MPI_SUCCESS) then
-    print *, "PE ", rank, ": mpi_barrier exited in error (",ierr,")"
-    call MPI_Abort(MPI_COMM_WORLD, 9);
-endif
-
-! ----------------------------------------------------------
-if (rank .eq. 0) then
-    print *, ' ===== Send/Recv iar(2:8:2) ====='
-    do i=1,10
-        iar(i)=i
-    end do
-    ierr = MPI_SUCCESS
-    print *, 'PE ', rank, '(0),[', save_my_rank, ']: loc(iar)=',loc(iar)
-    print *, 'PE 0: loc(iar)=',loc(iar)
-    call mpi_send(iar(2:8:2), 10, MPI_INTEGER, 1, 678, MPI_COMM_WORLD, ierr);
-    if (ierr .ne. MPI_SUCCESS) then
-        print *, "PE ", rank, "(0): mpi_send exited in error (",ierr,")"
-    endif
-else if (rank .eq. 1) then
-    ierr = MPI_SUCCESS
-    print *, 'PE 1: loc(iar)=',loc(iar)
-    call mpi_recv(iar(2:8:2), 10, MPI_INTEGER, 0, 678, MPI_COMM_WORLD, status, ierr);
-    if (ierr .ne. MPI_SUCCESS) then
-        print *, "PE ", rank, "(1): mpi_recv exited in error (",ierr,")"
-    endif
-    do i=2,8,2
-        if (iar(i) .ne. i) then
-            print *, "rank 1: iar(", i, ")=", iar(i), ", expected ",i
-        endif
-    end do
-endif
-
-call MPI_Barrier(MPI_COMM_WORLD, ierr);
-if (ierr .ne. MPI_SUCCESS) then
-    print *, "PE ", rank, ": mpi_barrier exited in error (",ierr,")"
-    call MPI_Abort(MPI_COMM_WORLD, 9);
-endif
-! ----------------------------------------------------------
-
-call mpi_finalize(ierr)
-end
diff --git a/src/binding/fortran/use_mpi_f08/tests/fort_test_2d.f90 b/src/binding/fortran/use_mpi_f08/tests/fort_test_2d.f90
deleted file mode 100644
index 9a30c4b..0000000
--- a/src/binding/fortran/use_mpi_f08/tests/fort_test_2d.f90
+++ /dev/null
@@ -1,237 +0,0 @@
-
-!
-program main
-
-use mpi_f08
-
-implicit none
-
-integer ierr
-integer size, rank
-integer sint, iar(10), iar_2d(9,9), iar_3d(9,9,9)
-type(MPI_Status) status
-integer i, j, k
-integer junk(1000)
-integer save_my_rank
-integer errors
-
-call mpi_init(ierr)
-
-call mpi_comm_size(MPI_COMM_WORLD, size, ierr)
-call mpi_comm_rank(MPI_COMM_WORLD, rank, ierr)
-
-print *, 'Hello, I am ', rank, ' of ', size, '.'
-
-
-save_my_rank = rank
-
-! ----------------------------------------------------------
-if (rank .eq. 0) then
-    sint = 789
-    write (0,*) ' ===== Trivial send/recv ====='
-    print *, ' ===== Trivial send/recv ====='
-    print *, "rank 0 sends ", sint
-    ierr = MPI_SUCCESS
-    call mpi_send(sint, 1, MPI_INTEGER, 1, 567, MPI_COMM_WORLD, ierr);
-    if (ierr .ne. MPI_SUCCESS) then
-        print *, "PE ", rank, ": mpi_send exited in error (",ierr,")"
-    endif
-else
-    ierr = MPI_SUCCESS
-    call mpi_recv(sint, 1, MPI_INTEGER, 0, 567, MPI_COMM_WORLD, status, ierr);
-    if (ierr .ne. MPI_SUCCESS) then
-        print *, "PE ", rank,": mpi_recv exited in error (",ierr,")"
-    endif
-    print *, "rank 1 receives ",sint
-    if (sint .eq. 789) then
-        print *, "PE ", rank,": PASS - Trivial send/recv"
-    else
-        print *, "PE ", rank,": FAIL - Trivial send/recv"
-    endif
-endif
-
-call MPI_Barrier(MPI_COMM_WORLD, ierr);
-if (ierr .ne. MPI_SUCCESS) then
-    print *, "PE ", rank, ": mpi_barrier exited in error (",ierr,")"
-    call MPI_Abort(MPI_COMM_WORLD, 9);
-endif
-
-! ----------------------------------------------------------
-if (rank .eq. 0) then
-    write (0,*) ' ===== Send/Recv iar(2:8:2) ====='
-    print *, ' ===== Send/Recv iar(2:8:2) ====='
-    do i=1,10
-        iar(i)=i
-    end do
-    ierr = MPI_SUCCESS
-    print *, 'PE ', rank, '(0),[', save_my_rank, ']: loc(iar)=',loc(iar)
-    print *, 'PE 0: loc(iar)=',loc(iar)
-    call mpi_send(iar(2:8:2), 10, MPI_INTEGER, 1, 678, MPI_COMM_WORLD, ierr);
-    if (ierr .ne. MPI_SUCCESS) then
-        print *, "PE ", rank, "(0): mpi_send exited in error (",ierr,")"
-    endif
-else if (rank .eq. 1) then
-    ierr = MPI_SUCCESS
-    print *, 'PE 1: loc(iar)=',loc(iar)
-    call mpi_recv(iar(2:8:2), 10, MPI_INTEGER, 0, 678, MPI_COMM_WORLD, status, ierr);
-    if (ierr .ne. MPI_SUCCESS) then
-        print *, "PE ", rank, "(1): mpi_recv exited in error (",ierr,")"
-    endif
-    errors = 0
-    do i=2,8,2
-        if (iar(i) .ne. i) then
-            print *, "rank 1: iar(", i, ")=", iar(i), ", expected ",i
-            errors = errors + 1
-        endif
-    end do
-    if (errors .eq. 0) then
-        print *, "PE ", rank,": PASS - Send/Recv iar(2:8:2)"
-    else
-        print *, "PE ", rank,": FAIL - Send/Recv iar(2:8:2)"
-    endif
-endif
-
-call MPI_Barrier(MPI_COMM_WORLD, ierr);
-if (ierr .ne. MPI_SUCCESS) then
-    print *, "PE ", rank, ": mpi_barrier exited in error (",ierr,")"
-    call MPI_Abort(MPI_COMM_WORLD, 9);
-endif
-
-! ----------------------------------------------------------
-if (rank .eq. 0) then
-    write (0, *) " ======== Simple 2d array test (iar_2d) ======== "
-    print *, " ======== Simple 2d array test (iar_2d) ======== "
-
-    do i=1,9
-        do j=1,9
-            iar_2d(j,i) = (j * 10) + i
-        end do
-    end do
-
-    do j=1,9
-        print *, iar_2d(1,j), iar_2d(2,j), iar_2d(3,j), iar_2d(4,j), iar_2d(5,j), iar_2d(6,j), iar_2d(7,j), iar_2d(8,j), iar_2d(9,j)
-    end do
-
-else
-    do i=1,9
-        do j=1,9
-            iar_2d(j,i) = 0
-        end do
-    end do
-
-endif
-
-call MPI_Barrier(MPI_COMM_WORLD, ierr);
-if (ierr .ne. MPI_SUCCESS) then
-    print *, "PE ", rank, ": mpi_barrier exited in error (",ierr,")"
-    call MPI_Abort(MPI_COMM_WORLD, 9);
-endif
-
-if (rank .eq. 0) then
-    print *, 'PE 0: Sending: loc(iar_2d)=',loc(iar_2d)
-    ierr = MPI_SUCCESS
-    call mpi_send(iar_2d, 81, MPI_INTEGER, 1, 789, MPI_COMM_WORLD, ierr);
-    if (ierr .ne. MPI_SUCCESS) then
-        print *, "PE ", rank, ": mpi_send exited in error (",ierr,")"
-    endif
-else
-    print *, 'PE 1: Receiving: loc(iar_2d)=',loc(iar_2d)
-    ierr = MPI_SUCCESS
-    call mpi_recv(iar_2d, 81, MPI_INTEGER, 0, 789, MPI_COMM_WORLD, status, ierr);
-    if (ierr .ne. MPI_SUCCESS) then
-        print *, "PE ", rank, "(1): mpi_recv exited in error (",ierr,")"
-    endif
-    errors = 0
-    do i=1,9
-        do j=1,9
-            if (iar_2d(j,i) .ne. (j * 10) + i) then
-                print *, "rank 1: iar_2d(", j, ",", i, ")=", iar_2d(j,i), ", expected ", (j * 10) + i
-                errors = errors + 1
-            endif
-        end do
-    end do
-    if (errors .eq. 0) then
-        print *, "PE ", rank,": PASS - Send/Recv iar_2d()"
-    else
-        print *, "PE ", rank,": FAIL - Send/Recv iar_2d()"
-    endif
-endif
-
-! ----------------------------------------------------------
-if (rank .eq. 0) then
-    write (0, *) " ======== Simple 3d array test (iar_3d) ======== "
-    print *, " ======== Simple 3d array test (iar_3d) ======== "
-
-    do i=1,9
-        do j=1,9
-            do k=1,9
-                iar_3d(k,j,i) = (k * 100) + (j * 10) + i
-            end do
-        end do
-    end do
-
-else
-    do i=1,9
-        do j=1,9
-            do k=1,9
-                iar_3d(k, j,i) = 0
-            end do
-        end do
-    end do
-
-endif
-
-call MPI_Barrier(MPI_COMM_WORLD, ierr);
-if (ierr .ne. MPI_SUCCESS) then
-    print *, "PE ", rank, ": mpi_barrier exited in error (",ierr,")"
-    call MPI_Abort(MPI_COMM_WORLD, 9);
-endif
-
-if (rank .eq. 0) then
-    print *, 'PE 0: Sending: loc(iar_3d)=',loc(iar_3d)
-    ierr = MPI_SUCCESS
-    call mpi_send(iar_3d, 729, MPI_INTEGER, 1, 891, MPI_COMM_WORLD, ierr);
-    if (ierr .ne. MPI_SUCCESS) then
-        print *, "PE ", rank, ": mpi_send exited in error (",ierr,")"
-    endif
-else
-    print *, 'PE 1: Receiving: loc(iar_3d)=',loc(iar_3d)
-    ierr = MPI_SUCCESS
-    call mpi_recv(iar_3d, 729, MPI_INTEGER, 0, 891, MPI_COMM_WORLD, status, ierr);
-    if (ierr .ne. MPI_SUCCESS) then
-        print *, "PE ", rank, "(1): mpi_recv exited in error (",ierr,")"
-    endif
-
-    errors = 0
-
-    do i=1,9
-        do j=1,9
-            do k=1,9
-                if (iar_3d(k, j,i) .ne. (k * 100) + (j * 10) + i) then
-                    print *, "rank 1: iar_3d(", k, ",", j, ",", i, ")=", iar_3d(k, j,i), ", expected ", (k * 100) + (j * 10) + i
-                    errors = errors + 1
-                endif
-            end do
-        end do
-    end do
-
-    if (errors .eq. 0) then
-        print *, "PE ", rank,": PASS - Send/Recv iar_3d()"
-    else
-        print *, "PE ", rank,": FAIL - Send/Recv iar_3d()"
-    endif
-endif
-
-! ----------------------------------------------------------
-write (0, *) "PE ", rank, ": calling last barrier"
-print *, "PE ", rank, ": calling last barrier"
-call MPI_Barrier(MPI_COMM_WORLD, ierr);
-if (ierr .ne. MPI_SUCCESS) then
-    print *, "PE ", rank, ": mpi_barrier exited in error (",ierr,")"
-    call MPI_Abort(MPI_COMM_WORLD, 9);
-endif
-
-write (0, *) "PE ", rank, ": calling Finalize"
-print *, "PE ", rank, ": calling Finalize"
-call mpi_finalize(ierr)
-end
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_c/comm_spawn_c.c b/src/binding/fortran/use_mpi_f08/wrappers_c/comm_spawn_c.c
new file mode 100644
index 0000000..b7a57f5
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_c/comm_spawn_c.c
@@ -0,0 +1,27 @@
+#include "mpiimpl.h"
+#include "cdesc.h"
+
+int MPIR_Comm_spawn_c(const char *command, char *argv_f, int maxprocs, MPI_Info info, int root,
+        MPI_Comm comm, MPI_Comm *intercomm, int* array_of_errcodes, int argv_elem_len)
+{
+    int mpi_errno = MPI_SUCCESS;
+    char** argv_c = NULL;
+
+    if ((char**)argv_f == MPI_ARGV_NULL) {
+        argv_c = MPI_ARGV_NULL;
+    } else {
+        mpi_errno = MPIR_Fortran_array_of_string_f2c(argv_f, &argv_c, argv_elem_len, 0, 0); /* Don't know size */
+        if (mpi_errno != MPI_SUCCESS) goto fn_fail;
+    }
+
+    mpi_errno = PMPI_Comm_spawn(command, argv_c, maxprocs, info, root, comm, intercomm, array_of_errcodes);
+
+    if (argv_c != MPI_ARGV_NULL) {
+        MPIU_Free(argv_c);
+    }
+
+fn_exit:
+    return mpi_errno;
+fn_fail:
+    goto fn_exit;
+}
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_c/comm_spawn_multiple_c.c b/src/binding/fortran/use_mpi_f08/wrappers_c/comm_spawn_multiple_c.c
new file mode 100644
index 0000000..c83bd98
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_c/comm_spawn_multiple_c.c
@@ -0,0 +1,57 @@
+#include "mpiimpl.h"
+#include "cdesc.h"
+
+#undef FUNCNAME
+#define FUNCNAME MPIR_Comm_spawn_multiple_c
+#undef FCNAME
+#define FCNAME MPIU_QUOTE(FUNCNAME)
+int MPIR_Comm_spawn_multiple_c(int count, char *array_of_commands_f,
+             char **array_of_argv_f, const int* array_of_maxprocs,
+             const MPI_Info *array_of_info, int root, MPI_Comm comm,
+             MPI_Comm *intercomm, int* array_of_errcodes,
+             int commands_elem_len, int argv_elem_len)
+{
+    int mpi_errno = MPI_SUCCESS;
+    char*** array_of_argv_c = NULL;
+    char** array_of_commands_c = NULL;
+    int i, j;
+
+    mpi_errno = MPIR_Fortran_array_of_string_f2c(array_of_commands_f, &array_of_commands_c,
+                    commands_elem_len, 1, count); /* array_of_commands_f size is known */
+    if (mpi_errno != MPI_SUCCESS) goto fn_fail;
+
+    if ((char***)array_of_argv_f == MPI_ARGVS_NULL) {
+        array_of_argv_c = MPI_ARGVS_NULL;
+    } else {
+        array_of_argv_c = (char***) MPIU_Malloc(sizeof(char**)*count);
+        if (array_of_argv_c == NULL) {
+            MPIU_ERR_SETANDJUMP(mpi_errno, MPI_ERR_OTHER, "**nomem");
+        }
+
+        for (i = 0; i < count; i++) {
+            mpi_errno = MPIR_Fortran_array_of_string_f2c(array_of_argv_f[i],
+                 &(array_of_argv_c[i]), argv_elem_len, 0, 0); /* array_of_argv_f[i] size is unknown */
+            if (mpi_errno != MPI_SUCCESS) {
+                for (j = i - 1; j >= 0; j--)
+                    MPIU_Free(array_of_argv_c[j]);
+                goto fn_fail;
+            }
+        }
+    }
+
+    mpi_errno = PMPI_Comm_spawn_multiple(count, array_of_commands_c, array_of_argv_c,
+            array_of_maxprocs, array_of_info, root, comm, intercomm, array_of_errcodes);
+
+    MPIU_Free(array_of_commands_c);
+
+    if (array_of_argv_c != MPI_ARGVS_NULL) {
+        for (i = 0; i < count; i++)
+            MPIU_Free(array_of_argv_c[i]);
+        MPIU_Free(array_of_argv_c);
+    }
+
+fn_exit:
+    return mpi_errno;
+fn_fail:
+    goto fn_exit;
+}
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_c/f_sync_reg_c.c b/src/binding/fortran/use_mpi_f08/wrappers_c/f_sync_reg_c.c
new file mode 100644
index 0000000..7e9eb2d
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_c/f_sync_reg_c.c
@@ -0,0 +1,11 @@
+
+#include "cdesc.h"
+
+int MPIR_F_sync_reg_cdesc(CFI_cdesc_t* buf)
+{
+    int err = MPI_SUCCESS;
+
+    /* Intentionally left empty */
+
+    return err;
+}
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_c/utils.c b/src/binding/fortran/use_mpi_f08/wrappers_c/utils.c
new file mode 100644
index 0000000..3e1e629
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_c/utils.c
@@ -0,0 +1,89 @@
+
+#include "mpiimpl.h"
+#include "cdesc.h"
+
+/*
+  Convert an array of strings in Fortran Format to an array of strings in C format (i.e., char* a[]).
+
+  IN strs_f:  An array of strings in Fortran
+  OUT strs_c: An array of char* in C
+  IN str_len: The length of a string, i.e., an element in strs_f[].
+               By Fortran convention, all strings have the same length
+  IN know_size: Indicate if size of strs_f[] is already known.
+     If it is false, then the last element of strs_f[] is represented by a blank line.
+     Accordingly, we put a NULL to strs_c[] as the last element of strs_c
+     This case mimics argv in MPI_Comm_spawn
+
+     If it is true, then 'size' gives the size of strs_f[]. No terminating NULL is needed in strs_c[]
+     This case mimics array_of_commands in MPI_Comm_spawn_multiple
+
+  IN size: Used only when know_size is true.
+
+  Note: The caller needs to free memory of strs_c
+*/
+#undef FUNCNAME
+#define FUNCNAME MPIR_Fortran_array_of_string_f2c
+#undef FCNAME
+#define FCNAME MPIU_QUOTE(FUNCNAME)
+extern int MPIR_Fortran_array_of_string_f2c(const char* strs_f, char*** strs_c, int str_len, int know_size, int size)
+{
+    int mpi_errno = MPI_SUCCESS;
+    char* buf;
+    char* cur_start;
+    int num_chars = 0; /* To count the number of chars to allocate */
+    int num_strs = 0; /* To count the number of strings in strs_f[] */
+    int reached_the_end = 0; /* Indicate whether we reached the last element in strs_f[] */
+    int index;
+
+    while (!reached_the_end) {
+        for (index = str_len - 1; index >= 0; index--) { /* Trim the trailing blanks */
+            if (strs_f[str_len * num_strs + index] != ' ') break;
+        }
+
+        num_chars += index + 1;
+        num_strs++;
+
+        if (know_size) {
+            if (num_strs == size) reached_the_end = 1; /* Reached the last element */
+        } else if (index < 0) {
+            reached_the_end = 1; /* Found the terminating blank line */
+        }
+    }
+
+    /* Allocate memory for pointers to strings and the strings themself */
+    buf = (char*) MPIU_Malloc(sizeof(char*) * num_strs + sizeof(char) * (num_chars + num_strs)); /* Add \0 for each string */
+    if (buf == NULL) {
+        MPIU_ERR_SETANDJUMP(mpi_errno, MPI_ERR_OTHER, "**nomem");
+    }
+
+    *strs_c = (char**)buf;
+    cur_start = (char*)(buf + sizeof(char*) * num_strs);
+
+    /* Scan strs_f[] again to set *strs_c[] */
+    reached_the_end = 0;
+    num_strs = 0;
+    while (!reached_the_end) {
+        for (index = str_len - 1; index >= 0; index--) {
+            if (strs_f[str_len * num_strs + index] != ' ') break;
+        }
+
+        strncpy(cur_start, &strs_f[str_len*num_strs], index + 1); /* index may be -1 */
+        cur_start[index + 1] = '\0';
+        (*strs_c)[num_strs] = cur_start;
+        cur_start += index + 2; /* Move to start of next string */
+
+        num_strs++;
+
+        if (know_size) {
+            if (num_strs == size) reached_the_end = 1; /* Reached the last element */
+        } else if (index < 0) {
+            reached_the_end = 1; /* Find the terminating blank line */
+            (*strs_c)[num_strs - 1] = NULL; /* Rewrite the last pointer as NULL */
+        }
+    }
+
+fn_exit:
+    return mpi_errno;
+fn_fail:
+    goto fn_exit;
+}
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/abort_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/abort_f08ts.F90
new file mode 100644
index 0000000..faa6c54
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/abort_f08ts.F90
@@ -0,0 +1,32 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Abort_f08(comm, errorcode, ierror)
+    use :: mpi_f08, only : MPI_Comm
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Comm
+    use :: mpi_c_interface, only : MPIR_Abort_c
+
+    implicit none
+
+    type(MPI_Comm), intent(in) :: comm
+    integer, intent(in) :: errorcode
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Comm) :: comm_c
+    integer(c_int) :: errorcode_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Abort_c(comm%MPI_VAL, errorcode)
+    else
+        comm_c = comm%MPI_VAL
+        errorcode_c = errorcode
+        ierror_c = MPIR_Abort_c(comm_c, errorcode_c)
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Abort_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/accumulate_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/accumulate_f08ts.F90
new file mode 100644
index 0000000..b2ebf36
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/accumulate_f08ts.F90
@@ -0,0 +1,55 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Accumulate_f08ts(origin_addr, origin_count, origin_datatype, target_rank, &
+    target_disp, target_count, target_datatype, op, win, ierror)
+    use :: mpi_f08, only : MPI_Datatype, MPI_Op, MPI_Win
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_f08, only : MPI_ADDRESS_KIND
+    use :: mpi_c_interface, only : c_Datatype, c_Op, c_Win
+    use :: mpi_c_interface, only : MPIR_Accumulate_cdesc
+
+    implicit none
+
+    type(*), dimension(..), intent(in), asynchronous :: origin_addr
+    integer, intent(in) :: origin_count
+    integer, intent(in) :: target_rank
+    integer, intent(in) :: target_count
+    type(MPI_Datatype), intent(in) :: origin_datatype
+    integer(MPI_ADDRESS_KIND), intent(in) :: target_disp
+    type(MPI_Datatype), intent(in) :: target_datatype
+    type(MPI_Op), intent(in) :: op
+    type(MPI_Win), intent(in) :: win
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: origin_count_c
+    integer(c_int) :: target_rank_c
+    integer(c_int) :: target_count_c
+    integer(c_Datatype) :: origin_datatype_c
+    integer(MPI_ADDRESS_KIND) :: target_disp_c
+    integer(c_Datatype) :: target_datatype_c
+    integer(c_Op) :: op_c
+    integer(c_Win) :: win_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Accumulate_cdesc(origin_addr, origin_count, origin_datatype%MPI_VAL, target_rank, &
+            target_disp, target_count, target_datatype%MPI_VAL, op%MPI_VAL, win%MPI_VAL)
+    else
+        origin_count_c = origin_count
+        origin_datatype_c = origin_datatype%MPI_VAL
+        target_rank_c = target_rank
+        target_disp_c = target_disp
+        target_count_c = target_count
+        target_datatype_c = target_datatype%MPI_VAL
+        op_c = op%MPI_VAL
+        win_c = win%MPI_VAL
+        ierror_c = MPIR_Accumulate_cdesc(origin_addr, origin_count_c, origin_datatype_c, target_rank_c, &
+            target_disp_c, target_count_c, target_datatype_c, op_c, win_c)
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Accumulate_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/add_error_class_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/add_error_class_f08ts.F90
new file mode 100644
index 0000000..faa0c60
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/add_error_class_f08ts.F90
@@ -0,0 +1,27 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Add_error_class_f08(errorclass, ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : MPIR_Add_error_class_c
+
+    implicit none
+
+    integer, intent(out) :: errorclass
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: errorclass_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Add_error_class_c(errorclass)
+    else
+        ierror_c = MPIR_Add_error_class_c(errorclass_c)
+        errorclass = errorclass_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Add_error_class_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/add_error_code_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/add_error_code_f08ts.F90
new file mode 100644
index 0000000..ea9f31b
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/add_error_code_f08ts.F90
@@ -0,0 +1,31 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Add_error_code_f08(errorclass, errorcode, ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Datatype, c_Comm, c_Request
+    use :: mpi_c_interface, only : MPIR_Add_error_code_c
+
+    implicit none
+
+    integer, intent(in) :: errorclass
+    integer, intent(out) :: errorcode
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: errorclass_c
+    integer(c_int) :: errorcode_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Add_error_code_c(errorclass, errorcode)
+    else
+        errorclass_c = errorclass
+        ierror_c = MPIR_Add_error_code_c(errorclass_c, errorcode_c)
+        errorcode = errorcode_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Add_error_code_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/add_error_string_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/add_error_string_f08ts.F90
new file mode 100644
index 0000000..4385bfb
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/add_error_string_f08ts.F90
@@ -0,0 +1,33 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Add_error_string_f08(errorcode, string, ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_char
+    use :: mpi_c_interface, only : c_Datatype, c_Comm, c_Request
+    use :: mpi_c_interface, only : MPIR_Add_error_string_c
+    use :: mpi_c_interface, only : MPIR_Fortran_string_f2c
+
+    implicit none
+
+    integer, intent(in) :: errorcode
+    character(len=*), intent(in) :: string
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: errorcode_c
+    character(kind=c_char) :: string_c(len_trim(string)+1)
+    integer(c_int) :: ierror_c
+
+    call MPIR_Fortran_string_f2c(string, string_c)
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Add_error_string_c(errorcode, string_c)
+    else
+        errorcode_c = errorcode
+        ierror_c = MPIR_Add_error_string_c(errorcode_c, string_c)
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Add_error_string_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/allgather_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/allgather_f08ts.F90
new file mode 100644
index 0000000..ee262a3
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/allgather_f08ts.F90
@@ -0,0 +1,46 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Allgather_f08ts(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, &
+    comm, ierror)
+    use :: mpi_f08, only : MPI_Datatype, MPI_Comm
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Datatype, c_Comm
+    use :: mpi_c_interface, only : MPIR_Allgather_cdesc
+
+    implicit none
+
+    type(*), dimension(..), intent(in) :: sendbuf
+    type(*), dimension(..) :: recvbuf
+    integer, intent(in) :: sendcount
+    integer, intent(in) :: recvcount
+    type(MPI_Datatype), intent(in) :: sendtype
+    type(MPI_Datatype), intent(in) :: recvtype
+    type(MPI_Comm), intent(in) :: comm
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: sendcount_c
+    integer(c_int) :: recvcount_c
+    integer(c_Datatype) :: sendtype_c
+    integer(c_Datatype) :: recvtype_c
+    integer(c_Comm) :: comm_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Allgather_cdesc(sendbuf, sendcount, sendtype%MPI_VAL, recvbuf, recvcount, recvtype%MPI_VAL, &
+            comm%MPI_VAL)
+    else
+        sendcount_c = sendcount
+        sendtype_c = sendtype%MPI_VAL
+        recvcount_c = recvcount
+        recvtype_c = recvtype%MPI_VAL
+        comm_c = comm%MPI_VAL
+        ierror_c = MPIR_Allgather_cdesc(sendbuf, sendcount_c, sendtype_c, recvbuf, recvcount_c, recvtype_c, &
+            comm_c)
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Allgather_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/allgatherv_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/allgatherv_f08ts.F90
new file mode 100644
index 0000000..eb2a9fe
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/allgatherv_f08ts.F90
@@ -0,0 +1,52 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Allgatherv_f08ts(sendbuf, sendcount, sendtype, recvbuf, recvcounts, displs, &
+    recvtype, comm, ierror)
+    use :: mpi_f08, only : MPI_Datatype, MPI_Comm
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Datatype, c_Comm
+    use :: mpi_c_interface, only : MPIR_Allgatherv_cdesc, MPIR_Comm_size_c
+
+    implicit none
+
+    type(*), dimension(..), intent(in) :: sendbuf
+    type(*), dimension(..) :: recvbuf
+    integer, intent(in) :: sendcount
+    integer, intent(in) :: recvcounts(*)
+    integer, intent(in) :: displs(*)
+    type(MPI_Datatype), intent(in) :: sendtype
+    type(MPI_Datatype), intent(in) :: recvtype
+    type(MPI_Comm), intent(in) :: comm
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: sendcount_c
+    integer(c_int), allocatable, dimension(:) :: recvcounts_c
+    integer(c_int), allocatable, dimension(:) :: displs_c
+    integer(c_Datatype) :: sendtype_c
+    integer(c_Datatype) :: recvtype_c
+    integer(c_Comm) :: comm_c
+    integer(c_int) :: ierror_c
+    integer(c_int) :: err, length ! To get length of assumed-size arrays
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Allgatherv_cdesc(sendbuf, sendcount, sendtype%MPI_VAL, recvbuf, recvcounts, displs, &
+            recvtype%MPI_VAL, comm%MPI_VAL)
+    else
+        comm_c = comm%MPI_VAL
+        err = MPIR_Comm_size_c(comm_c, length)
+        sendcount_c = sendcount
+        sendtype_c = sendtype%MPI_VAL
+        recvcounts_c(1:length) = recvcounts(1:length)
+        displs_c(1:length) = displs(1:length)
+        recvtype_c = recvtype%MPI_VAL
+        comm_c = comm%MPI_VAL
+        ierror_c = MPIR_Allgatherv_cdesc(sendbuf, sendcount_c, sendtype_c, recvbuf, recvcounts_c, displs_c, &
+            recvtype_c, comm_c)
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Allgatherv_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/alloc_mem_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/alloc_mem_f08ts.F90
new file mode 100644
index 0000000..ec86259
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/alloc_mem_f08ts.F90
@@ -0,0 +1,37 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Alloc_mem_f08(size, info, baseptr, ierror)
+    use, intrinsic :: iso_c_binding, only : c_ptr
+    use :: mpi_f08, only : MPI_Info
+    use, intrinsic :: iso_c_binding, only : c_ptr, c_int
+    use :: mpi_f08, only : MPI_ADDRESS_KIND
+    use :: mpi_c_interface, only : c_Info
+    use :: mpi_c_interface, only : MPIR_Alloc_mem_c
+
+    implicit none
+
+    integer(MPI_ADDRESS_KIND), intent(in) :: size
+    type(MPI_Info), intent(in) :: info
+    type(c_ptr), intent(out) :: baseptr
+    integer, optional, intent(out) :: ierror
+
+    integer(MPI_ADDRESS_KIND) :: size_c
+    integer(c_Info) :: info_c
+    type(c_ptr) :: baseptr_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Alloc_mem_c(size, info%MPI_VAL, baseptr)
+    else
+        size_c = size
+        info_c = info%MPI_VAL
+        ierror_c = MPIR_Alloc_mem_c(size_c, info_c, baseptr_c)
+        baseptr = baseptr_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Alloc_mem_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/allreduce_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/allreduce_f08ts.F90
new file mode 100644
index 0000000..73c9074
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/allreduce_f08ts.F90
@@ -0,0 +1,40 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Allreduce_f08ts(sendbuf, recvbuf, count, datatype, op, comm, ierror)
+    use :: mpi_f08, only : MPI_Datatype, MPI_Op, MPI_Comm
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Datatype, c_Op, c_Comm
+    use :: mpi_c_interface, only : MPIR_Allreduce_cdesc
+
+    implicit none
+
+    type(*), dimension(..), intent(in) :: sendbuf
+    type(*), dimension(..) :: recvbuf
+    integer, intent(in) :: count
+    type(MPI_Datatype), intent(in) :: datatype
+    type(MPI_Op), intent(in) :: op
+    type(MPI_Comm), intent(in) :: comm
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: count_c
+    integer(c_Datatype) :: datatype_c
+    integer(c_Op) :: op_c
+    integer(c_Comm) :: comm_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Allreduce_cdesc(sendbuf, recvbuf, count, datatype%MPI_VAL, op%MPI_VAL, comm%MPI_VAL)
+    else
+        count_c = count
+        datatype_c = datatype%MPI_VAL
+        op_c = op%MPI_VAL
+        comm_c = comm%MPI_VAL
+        ierror_c = MPIR_Allreduce_cdesc(sendbuf, recvbuf, count_c, datatype_c, op_c, comm_c)
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Allreduce_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/alltoall_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/alltoall_f08ts.F90
new file mode 100644
index 0000000..1219c42
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/alltoall_f08ts.F90
@@ -0,0 +1,46 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Alltoall_f08ts(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, &
+    comm, ierror)
+    use :: mpi_f08, only : MPI_Datatype, MPI_Comm
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Datatype, c_Comm
+    use :: mpi_c_interface, only : MPIR_Alltoall_cdesc
+
+    implicit none
+
+    type(*), dimension(..), intent(in) :: sendbuf
+    type(*), dimension(..) :: recvbuf
+    integer, intent(in) :: sendcount
+    integer, intent(in) :: recvcount
+    type(MPI_Datatype), intent(in) :: sendtype
+    type(MPI_Datatype), intent(in) :: recvtype
+    type(MPI_Comm), intent(in) :: comm
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: sendcount_c
+    integer(c_int) :: recvcount_c
+    integer(c_Datatype) :: sendtype_c
+    integer(c_Datatype) :: recvtype_c
+    integer(c_Comm) :: comm_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Alltoall_cdesc(sendbuf, sendcount, sendtype%MPI_VAL, recvbuf, recvcount, recvtype%MPI_VAL, &
+            comm%MPI_VAL)
+    else
+        sendcount_c = sendcount
+        sendtype_c = sendtype%MPI_VAL
+        recvcount_c = recvcount
+        recvtype_c = recvtype%MPI_VAL
+        comm_c = comm%MPI_VAL
+        ierror_c = MPIR_Alltoall_cdesc(sendbuf, sendcount_c, sendtype_c, recvbuf, recvcount_c, recvtype_c, &
+            comm_c)
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Alltoall_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/alltoallv_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/alltoallv_f08ts.F90
new file mode 100644
index 0000000..d470a8f
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/alltoallv_f08ts.F90
@@ -0,0 +1,56 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Alltoallv_f08ts(sendbuf, sendcounts, sdispls, sendtype, recvbuf, recvcounts, &
+    rdispls, recvtype, comm, ierror)
+    use :: mpi_f08, only : MPI_Datatype, MPI_Comm
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Datatype, c_Comm
+    use :: mpi_c_interface, only : MPIR_Alltoallv_cdesc, MPIR_Comm_size_c
+
+    implicit none
+
+    type(*), dimension(..), intent(in) :: sendbuf
+    type(*), dimension(..) :: recvbuf
+    integer, intent(in) :: sendcounts(*)
+    integer, intent(in) :: sdispls(*)
+    integer, intent(in) :: recvcounts(*)
+    integer, intent(in) :: rdispls(*)
+    type(MPI_Datatype), intent(in) :: sendtype
+    type(MPI_Datatype), intent(in) :: recvtype
+    type(MPI_Comm), intent(in) :: comm
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int), allocatable :: sendcounts_c(:)
+    integer(c_int), allocatable :: sdispls_c(:)
+    integer(c_int), allocatable :: recvcounts_c(:)
+    integer(c_int), allocatable :: rdispls_c(:)
+
+    integer(c_Datatype) :: sendtype_c
+    integer(c_Datatype) :: recvtype_c
+    integer(c_Comm) :: comm_c
+    integer(c_int) :: ierror_c
+    integer(c_int) :: err, length ! To get length of assumed-size arrays
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Alltoallv_cdesc(sendbuf, sendcounts, sdispls, sendtype%MPI_VAL, recvbuf, recvcounts, &
+                    rdispls, recvtype%MPI_VAL, comm%MPI_VAL)
+    else
+        sendtype_c = sendtype%MPI_VAL
+        recvtype_c = recvtype%MPI_VAL
+        comm_c = comm%MPI_VAL
+        err = MPIR_Comm_size_c(comm_c, length);
+        sendcounts_c = sendcounts(1:length);
+        sdispls_c = sdispls(1:length)
+        recvcounts_c = recvcounts(1:length)
+        rdispls_c = sdispls(1:length)
+
+        ierror_c = MPIR_Alltoallv_cdesc(sendbuf, sendcounts_c, sdispls_c, sendtype_c, recvbuf, recvcounts_c, &
+                    rdispls_c, recvtype_c, comm_c)
+    endif
+
+    if(present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Alltoallv_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/alltoallw_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/alltoallw_f08ts.F90
new file mode 100644
index 0000000..ce4dc26
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/alltoallw_f08ts.F90
@@ -0,0 +1,56 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Alltoallw_f08ts(sendbuf, sendcounts, sdispls, sendtypes, recvbuf, recvcounts, &
+    rdispls, recvtypes, comm, ierror)
+    use :: mpi_f08, only : MPI_Datatype, MPI_Comm
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Datatype, c_Comm
+    use :: mpi_c_interface, only : MPIR_Alltoallw_cdesc, MPIR_Comm_size_c
+
+    implicit none
+
+    type(*), dimension(..), intent(in) :: sendbuf
+    type(*), dimension(..) :: recvbuf
+    integer, intent(in) :: sendcounts(*)
+    integer, intent(in) :: sdispls(*)
+    integer, intent(in) :: recvcounts(*)
+    integer, intent(in) :: rdispls(*)
+    type(MPI_Datatype), intent(in) :: sendtypes(*)
+    type(MPI_Datatype), intent(in) :: recvtypes(*)
+    type(MPI_Comm), intent(in) :: comm
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int), allocatable :: sendcounts_c(:)
+    integer(c_int), allocatable :: sdispls_c(:)
+    integer(c_int), allocatable :: recvcounts_c(:)
+    integer(c_int), allocatable :: rdispls_c(:)
+    integer(c_Datatype), allocatable :: sendtypes_c(:)
+    integer(c_Datatype), allocatable :: recvtypes_c(:)
+    integer(c_Comm) :: comm_c
+    integer(c_int) :: ierror_c
+    integer(c_int) :: err, length ! To get length of assumed-size arrays
+
+    comm_c = comm%MPI_VAL
+    err = MPIR_Comm_size_c(comm_c, length)
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Alltoallw_cdesc(sendbuf, sendcounts, sdispls, sendtypes(1:length)%MPI_VAL, recvbuf, recvcounts, &
+            rdispls, recvtypes(1:length)%MPI_VAL, comm%MPI_VAL)
+    else
+        sendtypes_c = sendtypes(1:length)%MPI_VAL
+        recvtypes_c = recvtypes(1:length)%MPI_VAL
+        sendcounts_c = sendcounts(1:length)
+        sdispls_c = sdispls(1:length)
+        recvcounts_c = recvcounts(1:length)
+        rdispls_c = rdispls(1:length)
+
+        ierror_c = MPIR_Alltoallw_cdesc(sendbuf, sendcounts_c, sdispls_c, sendtypes_c, recvbuf, recvcounts_c, &
+            rdispls_c, recvtypes_c, comm_c)
+    end if
+
+    if(present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Alltoallw_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/barrier_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/barrier_f08ts.F90
new file mode 100644
index 0000000..85ad641
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/barrier_f08ts.F90
@@ -0,0 +1,29 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Barrier_f08(comm, ierror)
+    use :: mpi_f08, only : MPI_Comm
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Comm
+    use :: mpi_c_interface, only : MPIR_Barrier_c
+
+    implicit none
+
+    type(MPI_Comm), intent(in) :: comm
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Comm) :: comm_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Barrier_c(comm%MPI_VAL)
+    else
+        comm_c = comm%MPI_VAL
+        ierror_c = MPIR_Barrier_c(comm_c)
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Barrier_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/bcast_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/bcast_f08ts.F90
new file mode 100644
index 0000000..1e98579
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/bcast_f08ts.F90
@@ -0,0 +1,39 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Bcast_f08ts(buffer, count, datatype, root, comm, ierror)
+    use :: mpi_f08, only : MPI_Datatype, MPI_Comm
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Datatype, c_Comm
+    use :: mpi_c_interface, only : MPIR_Bcast_cdesc
+
+    implicit none
+
+    type(*), dimension(..) :: buffer
+    integer, intent(in) :: count
+    integer, intent(in) :: root
+    type(MPI_Datatype), intent(in) :: datatype
+    type(MPI_Comm), intent(in) :: comm
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: count_c
+    integer(c_int) :: root_c
+    integer(c_Datatype) :: datatype_c
+    integer(c_Comm) :: comm_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Bcast_cdesc(buffer, count, datatype%MPI_VAL, root, comm%MPI_VAL)
+    else
+        count_c = count
+        datatype_c = datatype%MPI_VAL
+        root_c = root
+        comm_c = comm%MPI_VAL
+        ierror_c = MPIR_Bcast_cdesc(buffer, count_c, datatype_c, root_c, comm_c)
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Bcast_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/bsend_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/bsend_f08ts.F90
new file mode 100644
index 0000000..86d3c15
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/bsend_f08ts.F90
@@ -0,0 +1,42 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Bsend_f08ts(buf, count, datatype, dest, tag, comm, ierror)
+    use :: mpi_f08, only : MPI_Datatype, MPI_Comm, MPI_Request
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Datatype, c_Comm
+    use :: mpi_c_interface, only : MPIR_Bsend_cdesc
+
+    implicit none
+
+    type(*), dimension(..), intent(in) :: buf
+    integer, intent(in) :: count
+    integer, intent(in) :: dest
+    integer, intent(in) :: tag
+    type(MPI_Datatype), intent(in) :: datatype
+    type(MPI_Comm), intent(in) :: comm
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: count_c
+    integer(c_int) :: dest_c
+    integer(c_int) :: tag_c
+    integer(c_Datatype) :: datatype_c
+    integer(c_Comm) :: comm_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Bsend_cdesc(buf, count, datatype%MPI_VAL, dest, tag, comm%MPI_VAL)
+    else
+        count_c = count
+        datatype_c = datatype%MPI_VAL
+        dest_c = dest
+        tag_c = tag
+        comm_c = comm%MPI_VAL
+        ierror_c = MPIR_Bsend_cdesc(buf, count_c, datatype_c, dest_c, tag_c, comm_c)
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Bsend_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/bsend_init_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/bsend_init_f08ts.F90
new file mode 100644
index 0000000..e4ca5d3
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/bsend_init_f08ts.F90
@@ -0,0 +1,45 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Bsend_init_f08ts(buf, count, datatype, dest, tag, comm, request, ierror)
+    use :: mpi_f08, only : MPI_Datatype, MPI_Comm, MPI_Request
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Datatype, c_Comm, c_Request
+    use :: mpi_c_interface, only : MPIR_Bsend_init_cdesc
+
+    implicit none
+
+    type(*), dimension(..) :: buf
+    integer, intent(in) :: count
+    integer, intent(in) :: dest
+    integer, intent(in) :: tag
+    type(MPI_Datatype), intent(in) :: datatype
+    type(MPI_Comm), intent(in) :: comm
+    type(MPI_Request), intent(out) :: request
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: count_c
+    integer(c_int) :: dest_c
+    integer(c_int) :: tag_c
+    integer(c_Datatype) :: datatype_c
+    integer(c_Comm) :: comm_c
+    integer(c_Request) :: request_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Bsend_init_cdesc(buf, count, datatype%MPI_VAL, dest, tag, comm%MPI_VAL, request%MPI_VAL)
+    else
+        count_c = count
+        datatype_c = datatype%MPI_VAL
+        dest_c = dest
+        tag_c = tag
+        comm_c = comm%MPI_VAL
+        ierror_c = MPIR_Bsend_init_cdesc(buf, count_c, datatype_c, dest_c, tag_c, comm_c, request_c)
+        request%MPI_VAL = request_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Bsend_init_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/buffer_attach_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/buffer_attach_f08ts.F90
new file mode 100644
index 0000000..1d7effd
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/buffer_attach_f08ts.F90
@@ -0,0 +1,28 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Buffer_attach_f08ts(buffer, size, ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : MPIR_Buffer_attach_cdesc
+
+    implicit none
+
+    type(*), dimension(..) :: buffer
+    integer, intent(in) :: size
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: size_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Buffer_attach_cdesc(buffer, size)
+    else
+        size_c = size
+        ierror_c = MPIR_Buffer_attach_cdesc(buffer, size_c)
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Buffer_attach_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/buffer_detach_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/buffer_detach_f08ts.F90
new file mode 100644
index 0000000..527db47
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/buffer_detach_f08ts.F90
@@ -0,0 +1,32 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Buffer_detach_f08(buffer_addr, size, ierror)
+    use, intrinsic :: iso_c_binding, only : c_ptr
+    use, intrinsic :: iso_c_binding, only : c_int, c_ptr
+    use :: mpi_c_interface, only : MPIR_Buffer_detach_c
+
+    implicit none
+
+    type(c_ptr) :: buffer_addr
+    integer, intent(out) :: size
+    integer, optional, intent(out) :: ierror
+
+    type(c_ptr) :: buffer_addr_c
+    integer(c_int) :: size_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Buffer_detach_c(buffer_addr, size)
+    else
+        buffer_addr_c = buffer_addr
+        ierror_c = MPIR_Buffer_detach_c(buffer_addr_c, size_c)
+        buffer_addr = buffer_addr_c
+        size = size_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Buffer_detach_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/cancel_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/cancel_f08ts.F90
new file mode 100644
index 0000000..5eea71f
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/cancel_f08ts.F90
@@ -0,0 +1,29 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Cancel_f08(request, ierror)
+    use :: mpi_f08, only : MPI_Request
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Request
+    use :: mpi_c_interface, only : MPIR_Cancel_c
+
+    implicit none
+
+    type(MPI_Request), intent(in) :: request
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Request) :: request_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Cancel_c(request%MPI_VAL)
+    else
+        request_c = request%MPI_VAL
+        ierror_c = MPIR_Cancel_c(request_c)
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Cancel_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/cart_coords_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/cart_coords_f08ts.F90
new file mode 100644
index 0000000..e2f4dfb
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/cart_coords_f08ts.F90
@@ -0,0 +1,38 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Cart_coords_f08(comm, rank, maxdims, coords, ierror)
+    use :: mpi_f08, only : MPI_Comm
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Comm
+    use :: mpi_c_interface, only : MPIR_Cart_coords_c
+
+    implicit none
+
+    type(MPI_Comm), intent(in) :: comm
+    integer, intent(in) :: rank
+    integer, intent(in) :: maxdims
+    integer, intent(out) :: coords(maxdims)
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Comm) :: comm_c
+    integer(c_int) :: rank_c
+    integer(c_int) :: maxdims_c
+    integer(c_int) :: coords_c(maxdims)
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Cart_coords_c(comm%MPI_VAL, rank, maxdims, coords)
+    else
+        comm_c = comm%MPI_VAL
+        rank_c = rank
+        maxdims_c = maxdims
+        ierror_c = MPIR_Cart_coords_c(comm_c, rank_c, maxdims_c, coords_c)
+        coords = coords_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Cart_coords_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/cart_create_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/cart_create_f08ts.F90
new file mode 100644
index 0000000..16faa64
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/cart_create_f08ts.F90
@@ -0,0 +1,45 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Cart_create_f08(comm_old, ndims, dims, periods, reorder, comm_cart, ierror)
+    use :: mpi_f08, only : MPI_Comm
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Comm
+    use :: mpi_c_interface, only : MPIR_Cart_create_c
+
+    implicit none
+
+    type(MPI_Comm), intent(in) :: comm_old
+    integer, intent(in) :: ndims
+    integer, intent(in) :: dims(ndims)
+    logical, intent(in) :: periods(ndims)
+    logical, intent(in) :: reorder
+    type(MPI_Comm), intent(out) :: comm_cart
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Comm) :: comm_old_c
+    integer(c_int) :: ndims_c
+    integer(c_int) :: dims_c(ndims)
+    integer(c_int) :: periods_c(ndims)
+    integer(c_int) :: reorder_c
+    integer(c_Comm) :: comm_cart_c
+    integer(c_int) :: ierror_c
+
+    periods_c = merge(1, 0, periods)
+    reorder_c = merge(1, 0, reorder)
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Cart_create_c(comm_old%MPI_VAL, ndims, dims, periods_c, reorder_c, comm_cart_c)
+    else
+        comm_old_c = comm_old%MPI_VAL
+        ndims_c = ndims
+        dims_c = dims
+        ierror_c = MPIR_Cart_create_c(comm_old_c, ndims_c, dims_c, periods_c, reorder_c, comm_cart_c)
+    end if
+
+    comm_cart%MPI_VAL = comm_cart_c
+    if(present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Cart_create_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/cart_get_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/cart_get_f08ts.F90
new file mode 100644
index 0000000..9f141ae
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/cart_get_f08ts.F90
@@ -0,0 +1,42 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Cart_get_f08(comm, maxdims, dims, periods, coords, ierror)
+    use :: mpi_f08, only : MPI_Comm
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Comm
+    use :: mpi_c_interface, only : MPIR_Cart_get_c
+
+    implicit none
+
+    type(MPI_Comm), intent(in) :: comm
+    integer, intent(in) :: maxdims
+    integer, intent(out) :: dims(maxdims)
+    integer, intent(out) :: coords(maxdims)
+    logical, intent(out) :: periods(maxdims)
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Comm) :: comm_c
+    integer(c_int) :: maxdims_c
+    integer(c_int) :: dims_c(maxdims)
+    integer(c_int) :: coords_c(maxdims)
+    integer(c_int) :: periods_c(maxdims)
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Cart_get_c(comm%MPI_VAL, maxdims, dims, periods_c, coords)
+    else
+        comm_c = comm%MPI_VAL
+        maxdims_c = maxdims
+        ierror_c = MPIR_Cart_get_c(comm_c, maxdims_c, dims_c, periods_c, coords_c)
+        dims = dims_c
+        coords = coords_c
+    end if
+
+    periods = merge(.true., .false., periods_c(:) /= 0)
+
+    if(present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Cart_get_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/cart_map_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/cart_map_f08ts.F90
new file mode 100644
index 0000000..5225db4
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/cart_map_f08ts.F90
@@ -0,0 +1,42 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Cart_map_f08(comm, ndims, dims, periods, newrank, ierror)
+    use :: mpi_f08, only : MPI_Comm
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Comm
+    use :: mpi_c_interface, only : MPIR_Cart_map_c
+
+    implicit none
+
+    type(MPI_Comm), intent(in) :: comm
+    integer, intent(in) :: ndims
+    integer, intent(in) :: dims(ndims)
+    logical, intent(in) :: periods(ndims)
+    integer, intent(out) :: newrank
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Comm) :: comm_c
+    integer(c_int) :: ndims_c
+    integer(c_int) :: dims_c(ndims)
+    integer(c_int) :: periods_c(ndims)
+    integer(c_int) :: newrank_c
+    integer(c_int) :: ierror_c
+
+    periods_c = merge(1, 0, periods)
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Cart_map_c(comm%MPI_VAL, ndims, dims, periods_c, newrank)
+    else
+        comm_c = comm%MPI_VAL
+        ndims_c = ndims
+        dims_c = dims
+        ierror_c = MPIR_Cart_map_c(comm_c, ndims_c, dims_c, periods_c, newrank_c)
+        newrank = newrank_c
+    end if
+
+    if(present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Cart_map_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/cart_rank_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/cart_rank_f08ts.F90
new file mode 100644
index 0000000..14ca015
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/cart_rank_f08ts.F90
@@ -0,0 +1,37 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Cart_rank_f08(comm, coords, rank, ierror)
+    use :: mpi_f08, only : MPI_Comm
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Comm
+    use :: mpi_c_interface, only : MPIR_Cart_rank_c, MPIR_Cartdim_get_c
+
+    implicit none
+
+    type(MPI_Comm), intent(in) :: comm
+    integer, intent(in) :: coords(*)
+    integer, intent(out) :: rank
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Comm) :: comm_c
+    integer(c_int), allocatable :: coords_c(:)
+    integer(c_int) :: rank_c
+    integer(c_int) :: ierror_c
+    integer(c_int) :: err, ndims ! To get length of assumed-size arrays
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Cart_rank_c(comm%MPI_VAL, coords, rank)
+    else
+        comm_c = comm%MPI_VAL
+        err = MPIR_Cartdim_get_c(comm_c, ndims)
+        coords_c = coords(1:ndims)
+        ierror_c = MPIR_Cart_rank_c(comm_c, coords_c, rank_c)
+        rank = rank_c
+    end if
+
+    if(present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Cart_rank_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/cart_shift_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/cart_shift_f08ts.F90
new file mode 100644
index 0000000..cef0587
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/cart_shift_f08ts.F90
@@ -0,0 +1,41 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Cart_shift_f08(comm, direction, disp, rank_source, rank_dest, ierror)
+    use :: mpi_f08, only : MPI_Comm
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Comm
+    use :: mpi_c_interface, only : MPIR_Cart_shift_c
+
+    implicit none
+
+    type(MPI_Comm), intent(in) :: comm
+    integer, intent(in) :: direction
+    integer, intent(in) :: disp
+    integer, intent(out) :: rank_source
+    integer, intent(out) :: rank_dest
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Comm) :: comm_c
+    integer(c_int) :: direction_c
+    integer(c_int) :: disp_c
+    integer(c_int) :: rank_source_c
+    integer(c_int) :: rank_dest_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Cart_shift_c(comm%MPI_VAL, direction, disp, rank_source, rank_dest)
+    else
+        comm_c = comm%MPI_VAL
+        direction_c = direction
+        disp_c = disp
+        ierror_c = MPIR_Cart_shift_c(comm_c, direction_c, disp_c, rank_source_c, rank_dest_c)
+        rank_source = rank_source_c
+        rank_dest = rank_dest_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Cart_shift_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/cart_sub_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/cart_sub_f08ts.F90
new file mode 100644
index 0000000..09cadd1
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/cart_sub_f08ts.F90
@@ -0,0 +1,36 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Cart_sub_f08(comm, remain_dims, newcomm, ierror)
+    use :: mpi_f08, only : MPI_Comm, MPI_SUCCESS
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Comm
+    use :: mpi_c_interface, only : MPIR_Cart_sub_c, MPIR_Cartdim_get_c
+
+    implicit none
+
+    type(MPI_Comm), intent(in) :: comm
+    logical, intent(in) :: remain_dims(*)
+    type(MPI_Comm), intent(out) :: newcomm
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Comm) :: comm_c
+    integer(c_int), allocatable :: remain_dims_c(:)
+    integer(c_Comm) :: newcomm_c
+    integer(c_int) :: ierror_c
+    integer(c_int) :: err, ndims! To get length of assumed-size arrays
+
+    comm_c = comm%MPI_VAL
+    ierror_c = MPIR_Cartdim_get_c(comm_c, ndims)
+
+    if (ierror_c /= MPI_SUCCESS) then
+        remain_dims_c = merge(1, 0, remain_dims(1:ndims))
+        ierror_c = MPIR_Cart_sub_c(comm_c, remain_dims_c, newcomm_c)
+        newcomm%MPI_VAL = newcomm_c
+    end if
+    
+    if(present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Cart_sub_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/cartdim_get_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/cartdim_get_f08ts.F90
new file mode 100644
index 0000000..179d7d7
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/cartdim_get_f08ts.F90
@@ -0,0 +1,32 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Cartdim_get_f08(comm, ndims, ierror)
+    use :: mpi_f08, only : MPI_Comm
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Comm
+    use :: mpi_c_interface, only : MPIR_Cartdim_get_c
+
+    implicit none
+
+    type(MPI_Comm), intent(in) :: comm
+    integer, intent(out) :: ndims
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Comm) :: comm_c
+    integer(c_int) :: ndims_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Cartdim_get_c(comm%MPI_VAL, ndims)
+    else
+        comm_c = comm%MPI_VAL
+        ierror_c = MPIR_Cartdim_get_c(comm_c, ndims_c)
+        ndims = ndims_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Cartdim_get_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/close_port_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/close_port_f08ts.F90
new file mode 100644
index 0000000..c2601a8
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/close_port_f08ts.F90
@@ -0,0 +1,25 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Close_port_f08(port_name, ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_char
+    use :: mpi_c_interface, only : MPIR_Close_port_c
+    use :: mpi_c_interface, only : MPIR_Fortran_string_f2c
+
+    implicit none
+
+    character(len=*), intent(in) :: port_name
+    integer, optional, intent(out) :: ierror
+
+    character(kind=c_char) :: port_name_c(len_trim(port_name)+1)
+    integer(c_int) :: ierror_c
+
+    call MPIR_Fortran_string_f2c(port_name, port_name_c)
+
+    ierror_c = MPIR_Close_port_c(port_name_c)
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Close_port_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/comm_accept_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/comm_accept_f08ts.F90
new file mode 100644
index 0000000..c26cc08
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/comm_accept_f08ts.F90
@@ -0,0 +1,43 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Comm_accept_f08(port_name, info, root, comm, newcomm, ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_char
+    use :: mpi_f08, only : MPI_Info, MPI_Comm
+    use :: mpi_c_interface, only : c_Info, c_Comm
+    use :: mpi_c_interface, only : MPIR_Comm_accept_c
+    use :: mpi_c_interface, only : MPIR_Fortran_string_f2c
+
+    implicit none
+
+    character(len=*), intent(in) :: port_name
+    type(MPI_Info), intent(in) :: info
+    integer, intent(in) :: root
+    type(MPI_Comm), intent(in) :: comm
+    type(MPI_Comm), intent(out) :: newcomm
+    integer, optional, intent(out) :: ierror
+
+    character(kind=c_char) :: port_name_c(len_trim(port_name)+1)
+    integer(c_Info) :: info_c
+    integer(c_int) :: root_c
+    integer(c_Comm) :: comm_c
+    integer(c_Comm) :: newcomm_c
+    integer(c_int) :: ierror_c
+
+    call MPIR_Fortran_string_f2c(port_name, port_name_c)
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Comm_accept_c(port_name_c, info%MPI_VAL, root, comm%MPI_VAL, newcomm%MPI_VAL)
+    else
+        info_c = info%MPI_VAL
+        root_c = root
+        comm_c = comm%MPI_VAL
+        ierror_c = MPIR_Comm_accept_c(port_name_c, info_c, root_c, comm_c, newcomm_c)
+        newcomm%MPI_VAL = newcomm_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Comm_accept_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/comm_call_errhandler_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/comm_call_errhandler_f08ts.F90
new file mode 100644
index 0000000..8588a82
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/comm_call_errhandler_f08ts.F90
@@ -0,0 +1,32 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Comm_call_errhandler_f08(comm, errorcode, ierror)
+    use :: mpi_f08, only : MPI_Comm
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Comm
+    use :: mpi_c_interface, only : MPIR_Comm_call_errhandler_c
+
+    implicit none
+
+    type(MPI_Comm), intent(in) :: comm
+    integer, intent(in) :: errorcode
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Comm) :: comm_c
+    integer(c_int) :: errorcode_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Comm_call_errhandler_c(comm%MPI_VAL, errorcode)
+    else
+        comm_c = comm%MPI_VAL
+        errorcode_c = errorcode
+        ierror_c = MPIR_Comm_call_errhandler_c(comm_c, errorcode_c)
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Comm_call_errhandler_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/comm_compare_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/comm_compare_f08ts.F90
new file mode 100644
index 0000000..9ef05aa
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/comm_compare_f08ts.F90
@@ -0,0 +1,35 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Comm_compare_f08(comm1,comm2,result, ierror)
+    use :: mpi_f08, only : MPI_Comm
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Comm
+    use :: mpi_c_interface, only : MPIR_Comm_compare_c
+
+    implicit none
+
+    type(MPI_Comm), intent(in) :: comm1
+    type(MPI_Comm), intent(in) :: comm2
+    integer, intent(out) :: result
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Comm) :: comm1_c
+    integer(c_Comm) :: comm2_c
+    integer(c_int) :: result_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Comm_compare_c(comm1%MPI_VAL, comm2%MPI_VAL, result)
+    else
+        comm1_c = comm1%MPI_VAL
+        comm2_c = comm2%MPI_VAL
+        ierror_c = MPIR_Comm_compare_c(comm1_c, comm2_c, result_c)
+        result = result_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Comm_compare_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/comm_connect_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/comm_connect_f08ts.F90
new file mode 100644
index 0000000..4992813
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/comm_connect_f08ts.F90
@@ -0,0 +1,43 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Comm_connect_f08(port_name, info, root, comm, newcomm, ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_char
+    use :: mpi_f08, only : MPI_Info, MPI_Comm
+    use :: mpi_c_interface, only : c_Info, c_Comm
+    use :: mpi_c_interface, only : MPIR_Comm_connect_c
+    use :: mpi_c_interface, only : MPIR_Fortran_string_f2c
+
+    implicit none
+
+    character(len=*), intent(in) :: port_name
+    type(MPI_Info), intent(in) :: info
+    integer, intent(in) :: root
+    type(MPI_Comm), intent(in) :: comm
+    type(MPI_Comm), intent(out) :: newcomm
+    integer, optional, intent(out) :: ierror
+
+    character(kind=c_char) :: port_name_c(len_trim(port_name)+1)
+    integer(c_Info) :: info_c
+    integer(c_int) :: root_c
+    integer(c_Comm) :: comm_c
+    integer(c_Comm) :: newcomm_c
+    integer(c_int) :: ierror_c
+
+    call MPIR_Fortran_string_f2c(port_name, port_name_c)
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Comm_connect_c(port_name_c, info%MPI_VAL, root, comm%MPI_VAL, newcomm%MPI_VAL)
+    else
+        info_c = info%MPI_VAL
+        root_c = root
+        comm_c = comm%MPI_VAL
+        ierror_c = MPIR_Comm_connect_c(port_name_c, info_c, root_c, comm_c, newcomm_c)
+        newcomm%MPI_VAL = newcomm_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Comm_connect_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/comm_create_errhandler_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/comm_create_errhandler_f08ts.F90
new file mode 100644
index 0000000..ec8533c
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/comm_create_errhandler_f08ts.F90
@@ -0,0 +1,34 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Comm_create_errhandler_f08(comm_errhandler_fn, errhandler, ierror)
+    use :: mpi_f08, only : MPI_Errhandler
+    use :: mpi_f08, only : MPI_Comm_errhandler_function
+    use, intrinsic :: iso_c_binding, only : c_funloc
+    use, intrinsic :: iso_c_binding, only : c_int, c_funptr
+    use :: mpi_c_interface, only : c_Errhandler
+    use :: mpi_c_interface, only : MPIR_Comm_create_errhandler_c
+
+    implicit none
+
+    procedure(MPI_Comm_errhandler_function) :: comm_errhandler_fn
+    type(MPI_Errhandler), intent(out) :: errhandler
+    integer, optional, intent(out) :: ierror
+
+    type(c_funptr) :: comm_errhandler_fn_c
+    integer(c_Errhandler) :: errhandler_c
+    integer(c_int) :: ierror_c
+
+    comm_errhandler_fn_c = c_funloc(comm_errhandler_fn)
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Comm_create_errhandler_c(comm_errhandler_fn_c, errhandler%MPI_VAL)
+    else
+        ierror_c = MPIR_Comm_create_errhandler_c(comm_errhandler_fn_c, errhandler_c)
+        errhandler%MPI_VAL = errhandler_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Comm_create_errhandler_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/comm_create_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/comm_create_f08ts.F90
new file mode 100644
index 0000000..2a5d5cd
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/comm_create_f08ts.F90
@@ -0,0 +1,35 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Comm_create_f08(comm, group, newcomm, ierror)
+    use :: mpi_f08, only : MPI_Comm, MPI_Group
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Group, c_Comm
+    use :: mpi_c_interface, only : MPIR_Comm_create_c
+
+    implicit none
+
+    type(MPI_Comm), intent(in) :: comm
+    type(MPI_Group), intent(in) :: group
+    type(MPI_Comm), intent(out) :: newcomm
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Comm) :: comm_c
+    integer(c_Group) :: group_c
+    integer(c_Comm) :: newcomm_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Comm_create_c(comm%MPI_VAL, group%MPI_VAL, newcomm%MPI_VAL)
+    else
+        comm_c = comm%MPI_VAL
+        group_c = group%MPI_VAL
+        ierror_c = MPIR_Comm_create_c(comm_c, group_c, newcomm_c)
+        newcomm%MPI_VAL = newcomm_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Comm_create_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/comm_create_group_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/comm_create_group_f08ts.F90
new file mode 100644
index 0000000..00b81d5
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/comm_create_group_f08ts.F90
@@ -0,0 +1,38 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Comm_create_group_f08(comm, group, tag, newcomm, ierror)
+    use :: mpi_f08, only : MPI_Comm, MPI_Group
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Group, c_Comm
+    use :: mpi_c_interface, only : MPIR_Comm_create_group_c
+
+    implicit none
+
+    type(MPI_Comm), intent(in) :: comm
+    type(MPI_Group), intent(in) :: group
+    integer, intent(in) :: tag
+    type(MPI_Comm), intent(out) :: newcomm
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Comm) :: comm_c
+    integer(c_Group) :: group_c
+    integer(c_int) :: tag_c
+    integer(c_Comm) :: newcomm_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Comm_create_group_c(comm%MPI_VAL, group%MPI_VAL, tag, newcomm%MPI_VAL)
+    else
+        comm_c = comm%MPI_VAL
+        group_c = group%MPI_VAL
+        tag_c = tag
+        ierror_c = MPIR_Comm_create_group_c(comm_c, group_c, tag_c, newcomm_c)
+        newcomm%MPI_VAL = newcomm_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Comm_create_group_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/comm_create_keyval_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/comm_create_keyval_f08ts.F90
new file mode 100644
index 0000000..e0303c0
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/comm_create_keyval_f08ts.F90
@@ -0,0 +1,38 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Comm_create_keyval_f08(comm_copy_attr_fn, comm_delete_attr_fn, comm_keyval, &
+    extra_state, ierror)
+    use, intrinsic :: iso_c_binding, only : c_funloc
+    use, intrinsic :: iso_c_binding, only : c_int, c_funptr
+    use :: mpi_f08, only : MPI_Comm_copy_attr_function
+    use :: mpi_f08, only : MPI_Comm_delete_attr_function
+    use :: mpi_f08, only : MPI_ADDRESS_KIND
+    use :: mpi_c_interface, only : MPIR_Comm_create_keyval_c
+    use :: mpi_c_interface, only : MPIR_Keyval_set_proxy, MPIR_Comm_copy_attr_f08_proxy, MPIR_Comm_delete_attr_f08_proxy
+
+    implicit none
+
+    procedure(MPI_Comm_copy_attr_function) :: comm_copy_attr_fn
+    procedure(MPI_Comm_delete_attr_function) :: comm_delete_attr_fn
+    integer, intent(out) :: comm_keyval
+    integer(MPI_ADDRESS_KIND), intent(in) :: extra_state
+    integer, optional, intent(out) :: ierror
+
+    type(c_funptr) :: comm_copy_attr_fn_c
+    type(c_funptr) :: comm_delete_attr_fn_c
+    integer(c_int) :: comm_keyval_c
+    integer(c_int) :: ierror_c
+
+    comm_copy_attr_fn_c = c_funloc(comm_copy_attr_fn)
+    comm_delete_attr_fn_c = c_funloc(comm_delete_attr_fn)
+
+    ierror_c = MPIR_Comm_create_keyval_c(comm_copy_attr_fn_c, comm_delete_attr_fn_c, comm_keyval_c, extra_state)
+
+    call MPIR_Keyval_set_proxy(comm_keyval_c, c_funloc(MPIR_Comm_copy_attr_f08_proxy), c_funloc(MPIR_Comm_delete_attr_f08_proxy))
+    comm_keyval = comm_keyval_c
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Comm_create_keyval_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/comm_delete_attr_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/comm_delete_attr_f08ts.F90
new file mode 100644
index 0000000..17a7965
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/comm_delete_attr_f08ts.F90
@@ -0,0 +1,32 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Comm_delete_attr_f08(comm, comm_keyval, ierror)
+    use :: mpi_f08, only : MPI_Comm
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Comm
+    use :: mpi_c_interface, only : MPIR_Comm_delete_attr_c
+
+    implicit none
+
+    type(MPI_Comm), intent(in) :: comm
+    integer, intent(in) :: comm_keyval
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Comm) :: comm_c
+    integer(c_int) :: comm_keyval_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Comm_delete_attr_c(comm%MPI_VAL, comm_keyval)
+    else
+        comm_c = comm%MPI_VAL
+        comm_keyval_c = comm_keyval
+        ierror_c = MPIR_Comm_delete_attr_c(comm_c, comm_keyval_c)
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Comm_delete_attr_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/comm_disconnect_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/comm_disconnect_f08ts.F90
new file mode 100644
index 0000000..dba3cd6
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/comm_disconnect_f08ts.F90
@@ -0,0 +1,30 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Comm_disconnect_f08(comm, ierror)
+    use :: mpi_f08, only : MPI_Comm
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Comm
+    use :: mpi_c_interface, only : MPIR_Comm_disconnect_c
+
+    implicit none
+
+    type(MPI_Comm), intent(inout) :: comm
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Comm) :: comm_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Comm_disconnect_c(comm%MPI_VAL)
+    else
+        comm_c = comm%MPI_VAL
+        ierror_c = MPIR_Comm_disconnect_c(comm_c)
+        comm%MPI_VAL = comm_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Comm_disconnect_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/comm_dup_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/comm_dup_f08ts.F90
new file mode 100644
index 0000000..9a03c4f
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/comm_dup_f08ts.F90
@@ -0,0 +1,32 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Comm_dup_f08(comm, newcomm, ierror)
+    use :: mpi_f08, only : MPI_Comm
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Comm
+    use :: mpi_c_interface, only : MPIR_Comm_dup_c
+
+    implicit none
+
+    type(MPI_Comm), intent(in) :: comm
+    type(MPI_Comm), intent(out) :: newcomm
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Comm) :: comm_c
+    integer(c_Comm) :: newcomm_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Comm_dup_c(comm%MPI_VAL, newcomm%MPI_VAL)
+    else
+        comm_c = comm%MPI_VAL
+        ierror_c = MPIR_Comm_dup_c(comm_c, newcomm_c)
+        newcomm%MPI_VAL = newcomm_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Comm_dup_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/comm_dup_with_info_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/comm_dup_with_info_f08ts.F90
new file mode 100644
index 0000000..f2c303a
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/comm_dup_with_info_f08ts.F90
@@ -0,0 +1,35 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Comm_dup_with_info_f08(comm, info, newcomm, ierror)
+    use :: mpi_f08, only : MPI_Comm, MPI_Info
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Comm, c_Info
+    use :: mpi_c_interface, only : MPIR_Comm_dup_with_info_c
+
+    implicit none
+
+    type(MPI_Comm), intent(in) :: comm
+    type(MPI_Info), intent(in) :: info
+    type(MPI_Comm), intent(out) :: newcomm
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Comm) :: comm_c
+    integer(c_Info) :: info_c
+    integer(c_Comm) :: newcomm_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Comm_dup_with_info_c(comm%MPI_VAL, info%MPI_VAL, newcomm%MPI_VAL)
+    else
+        comm_c = comm%MPI_VAL
+        info_c = info%MPI_VAL
+        ierror_c = MPIR_Comm_dup_with_info_c(comm_c, info_c, newcomm_c)
+        newcomm%MPI_VAL = newcomm_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Comm_dup_with_info_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/comm_free_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/comm_free_f08ts.F90
new file mode 100644
index 0000000..d77fd64
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/comm_free_f08ts.F90
@@ -0,0 +1,30 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Comm_free_f08(comm, ierror)
+    use :: mpi_f08, only : MPI_Comm
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Comm
+    use :: mpi_c_interface, only : MPIR_Comm_free_c
+
+    implicit none
+
+    type(MPI_Comm), intent(inout) :: comm
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Comm) :: comm_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Comm_free_c(comm%MPI_VAL)
+    else
+        comm_c = comm%MPI_VAL
+        ierror_c = MPIR_Comm_free_c(comm_c)
+        comm%MPI_VAL = comm_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Comm_free_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/comm_free_keyval_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/comm_free_keyval_f08ts.F90
new file mode 100644
index 0000000..1a6d4fe
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/comm_free_keyval_f08ts.F90
@@ -0,0 +1,28 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Comm_free_keyval_f08(comm_keyval, ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : MPIR_Comm_free_keyval_c
+
+    implicit none
+
+    integer, intent(inout) :: comm_keyval
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: comm_keyval_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Comm_free_keyval_c(comm_keyval)
+    else
+        comm_keyval_c = comm_keyval
+        ierror_c = MPIR_Comm_free_keyval_c(comm_keyval_c)
+        comm_keyval = comm_keyval_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Comm_free_keyval_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/comm_get_attr_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/comm_get_attr_f08ts.F90
new file mode 100644
index 0000000..2d0686f
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/comm_get_attr_f08ts.F90
@@ -0,0 +1,38 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Comm_get_attr_f08(comm, comm_keyval, attribute_val, flag, ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_f08, only : MPI_Comm
+    use :: mpi_f08, only : MPI_ADDRESS_KIND
+    use :: mpi_c_interface, only : c_Comm
+    use :: mpi_c_interface, only : MPIR_Comm_get_attr_c
+    use :: mpi_c_interface, only : MPIR_ATTR_AINT
+
+    implicit none
+
+    type(MPI_Comm), intent(in) :: comm
+    integer, intent(in) :: comm_keyval
+    integer(MPI_ADDRESS_KIND), intent(out) :: attribute_val
+    logical, intent(out) :: flag
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Comm) :: comm_c
+    integer(c_int) :: comm_keyval_c
+    integer(c_int) :: flag_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Comm_get_attr_c(comm%MPI_VAL, comm_keyval, attribute_val, flag_c, MPIR_ATTR_AINT)
+    else
+        comm_c = comm%MPI_VAL
+        comm_keyval_c = comm_keyval
+        ierror_c = MPIR_Comm_get_attr_c(comm_c, comm_keyval_c, attribute_val, flag_c, MPIR_ATTR_AINT)
+    end if
+
+    flag = (flag_c /= 0)
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Comm_get_attr_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/comm_get_errhandler_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/comm_get_errhandler_f08ts.F90
new file mode 100644
index 0000000..655c652
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/comm_get_errhandler_f08ts.F90
@@ -0,0 +1,32 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Comm_get_errhandler_f08(comm, errhandler, ierror)
+    use :: mpi_f08, only : MPI_Comm, MPI_Errhandler
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Comm, c_Errhandler
+    use :: mpi_c_interface, only : MPIR_Comm_get_errhandler_c
+
+    implicit none
+
+    type(MPI_Comm), intent(in) :: comm
+    type(MPI_Errhandler), intent(out) :: errhandler
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Comm) :: comm_c
+    integer(c_Errhandler) :: errhandler_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Comm_get_errhandler_c(comm%MPI_VAL, errhandler%MPI_VAL)
+    else
+        comm_c = comm%MPI_VAL
+        ierror_c = MPIR_Comm_get_errhandler_c(comm_c, errhandler_c)
+        errhandler%MPI_VAL = errhandler_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Comm_get_errhandler_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/comm_get_name_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/comm_get_name_f08ts.F90
new file mode 100644
index 0000000..e5ebe20
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/comm_get_name_f08ts.F90
@@ -0,0 +1,38 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Comm_get_name_f08(comm, comm_name, resultlen, ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_char
+    use :: mpi_f08, only : MPI_Comm
+    use :: mpi_f08, only : MPI_MAX_OBJECT_NAME
+    use :: mpi_c_interface, only : c_Comm
+    use :: mpi_c_interface, only : MPIR_Comm_get_name_c
+    use :: mpi_c_interface, only : MPIR_Fortran_string_c2f
+
+    implicit none
+
+    type(MPI_Comm), intent(in) :: comm
+    character(len=MPI_MAX_OBJECT_NAME), intent(out) :: comm_name
+    integer, intent(out) :: resultlen
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Comm) :: comm_c
+    character(kind=c_char) :: comm_name_c(MPI_MAX_OBJECT_NAME+1)
+    integer(c_int) :: resultlen_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Comm_get_name_c(comm%MPI_VAL, comm_name_c, resultlen)
+    else
+        comm_c = comm%MPI_VAL
+        ierror_c = MPIR_Comm_get_name_c(comm_c, comm_name_c, resultlen_c)
+        resultlen = resultlen_c
+    end if
+
+    call MPIR_Fortran_string_c2f(comm_name_c, comm_name)
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Comm_get_name_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/comm_get_parent_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/comm_get_parent_f08ts.F90
new file mode 100644
index 0000000..2883878
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/comm_get_parent_f08ts.F90
@@ -0,0 +1,29 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Comm_get_parent_f08(parent, ierror)
+    use :: mpi_f08, only : MPI_Comm
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Comm
+    use :: mpi_c_interface, only : MPIR_Comm_get_parent_c
+
+    implicit none
+
+    type(MPI_Comm), intent(out) :: parent
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Comm) :: parent_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Comm_get_parent_c(parent%MPI_VAL)
+    else
+        ierror_c = MPIR_Comm_get_parent_c(parent_c)
+        parent%MPI_VAL = parent_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Comm_get_parent_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/comm_group_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/comm_group_f08ts.F90
new file mode 100644
index 0000000..f71ec2a
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/comm_group_f08ts.F90
@@ -0,0 +1,32 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Comm_group_f08(comm, group, ierror)
+    use :: mpi_f08, only : MPI_Comm, MPI_Group
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Comm, c_Group
+    use :: mpi_c_interface, only : MPIR_Comm_group_c
+
+    implicit none
+
+    type(MPI_Comm), intent(in) :: comm
+    type(MPI_Group), intent(out) :: group
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Comm) :: comm_c
+    integer(c_Group) :: group_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Comm_group_c(comm%MPI_VAL, group%MPI_VAL)
+    else
+        comm_c = comm%MPI_VAL
+        ierror_c = MPIR_Comm_group_c(comm_c, group_c)
+        group%MPI_VAL = group_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Comm_group_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/comm_idup_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/comm_idup_f08ts.F90
new file mode 100644
index 0000000..278cf0b
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/comm_idup_f08ts.F90
@@ -0,0 +1,35 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Comm_idup_f08(comm, newcomm, request, ierror)
+    use :: mpi_f08, only : MPI_Comm, MPI_Request
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Comm, c_Request
+    use :: mpi_c_interface, only : MPIR_Comm_idup_c
+
+    implicit none
+
+    type(MPI_Comm), intent(in) :: comm
+    type(MPI_Comm), intent(out) :: newcomm
+    type(MPI_Request), intent(out) :: request
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Comm) :: comm_c
+    integer(c_Comm) :: newcomm_c
+    integer(c_Request) :: request_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Comm_idup_c(comm%MPI_VAL, newcomm%MPI_VAL, request%MPI_VAL)
+    else
+        comm_c = comm%MPI_VAL
+        ierror_c = MPIR_Comm_idup_c(comm_c, newcomm_c, request_c)
+        newcomm%MPI_VAL = newcomm_c
+        request%MPI_VAL = request_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Comm_idup_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/comm_join_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/comm_join_f08ts.F90
new file mode 100644
index 0000000..8e8983b
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/comm_join_f08ts.F90
@@ -0,0 +1,32 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Comm_join_f08(fd, intercomm, ierror)
+    use :: mpi_f08, only : MPI_Comm
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Comm
+    use :: mpi_c_interface, only : MPIR_Comm_join_c
+
+    implicit none
+
+    integer, intent(in) :: fd
+    type(MPI_Comm), intent(out) :: intercomm
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: fd_c
+    integer(c_Comm) :: intercomm_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Comm_join_c(fd, intercomm%MPI_VAL)
+    else
+        fd_c = fd
+        ierror_c = MPIR_Comm_join_c(fd_c, intercomm_c)
+        intercomm%MPI_VAL = intercomm_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Comm_join_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/comm_rank_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/comm_rank_f08ts.F90
new file mode 100644
index 0000000..58d914a
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/comm_rank_f08ts.F90
@@ -0,0 +1,32 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Comm_rank_f08(comm, rank, ierror)
+    use :: mpi_f08, only : MPI_Comm
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Comm
+    use :: mpi_c_interface, only : MPIR_Comm_rank_c
+
+    implicit none
+
+    type(MPI_Comm), intent(in) :: comm
+    integer, intent(out) :: rank
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Comm) :: comm_c
+    integer(c_int) :: rank_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Comm_rank_c(comm%MPI_VAL, rank)
+    else
+        comm_c = comm%MPI_VAL
+        ierror_c = MPIR_Comm_rank_c(comm_c, rank_c)
+        rank = rank_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Comm_rank_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/comm_remote_group_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/comm_remote_group_f08ts.F90
new file mode 100644
index 0000000..7eb4cf2
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/comm_remote_group_f08ts.F90
@@ -0,0 +1,32 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Comm_remote_group_f08(comm, group, ierror)
+    use :: mpi_f08, only : MPI_Comm, MPI_Group
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Comm, c_Group
+    use :: mpi_c_interface, only : MPIR_Comm_remote_group_c
+
+    implicit none
+
+    type(MPI_Comm), intent(in) :: comm
+    type(MPI_Group), intent(out) :: group
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Comm) :: comm_c
+    integer(c_Group) :: group_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Comm_remote_group_c(comm%MPI_VAL, group%MPI_VAL)
+    else
+        comm_c = comm%MPI_VAL
+        ierror_c = MPIR_Comm_remote_group_c(comm_c, group_c)
+        group%MPI_VAL = group_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Comm_remote_group_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/comm_remote_size_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/comm_remote_size_f08ts.F90
new file mode 100644
index 0000000..5b8b204
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/comm_remote_size_f08ts.F90
@@ -0,0 +1,32 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Comm_remote_size_f08(comm, size, ierror)
+    use :: mpi_f08, only : MPI_Comm
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Comm
+    use :: mpi_c_interface, only : MPIR_Comm_remote_size_c
+
+    implicit none
+
+    type(MPI_Comm), intent(in) :: comm
+    integer, intent(out) :: size
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Comm) :: comm_c
+    integer(c_int) :: size_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Comm_remote_size_c(comm%MPI_VAL, size)
+    else
+        comm_c = comm%MPI_VAL
+        ierror_c = MPIR_Comm_remote_size_c(comm_c, size_c)
+        size = size_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Comm_remote_size_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/comm_set_attr_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/comm_set_attr_f08ts.F90
new file mode 100644
index 0000000..ca152d2
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/comm_set_attr_f08ts.F90
@@ -0,0 +1,35 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Comm_set_attr_f08(comm, comm_keyval, attribute_val, ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_f08, only : MPI_Comm
+    use :: mpi_f08, only : MPI_ADDRESS_KIND
+    use :: mpi_c_interface, only : c_Comm
+    use :: mpi_c_interface, only : MPIR_Comm_set_attr_c
+    use :: mpi_c_interface, only : MPIR_ATTR_AINT
+
+    implicit none
+
+    type(MPI_Comm), intent(in) :: comm
+    integer, intent(in) :: comm_keyval
+    integer(MPI_ADDRESS_KIND), intent(in) :: attribute_val
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Comm) :: comm_c
+    integer(c_int) :: comm_keyval_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Comm_set_attr_c(comm%MPI_VAL, comm_keyval, attribute_val, MPIR_ATTR_AINT)
+    else
+        comm_c = comm%MPI_VAL
+        comm_keyval_c = comm_keyval
+        ierror_c = MPIR_Comm_set_attr_c(comm_c, comm_keyval_c, attribute_val, MPIR_ATTR_AINT)
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Comm_set_attr_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/comm_set_errhandler_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/comm_set_errhandler_f08ts.F90
new file mode 100644
index 0000000..4b480d7
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/comm_set_errhandler_f08ts.F90
@@ -0,0 +1,32 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Comm_set_errhandler_f08(comm, errhandler, ierror)
+    use :: mpi_f08, only : MPI_Comm, MPI_Errhandler
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Comm, c_Errhandler
+    use :: mpi_c_interface, only : MPIR_Comm_set_errhandler_c
+
+    implicit none
+
+    type(MPI_Comm), intent(in) :: comm
+    type(MPI_Errhandler), intent(in) :: errhandler
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Comm) :: comm_c
+    integer(c_Errhandler) :: errhandler_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Comm_set_errhandler_c(comm%MPI_VAL, errhandler%MPI_VAL)
+    else
+        comm_c = comm%MPI_VAL
+        errhandler_c = errhandler%MPI_VAL
+        ierror_c = MPIR_Comm_set_errhandler_c(comm_c, errhandler_c)
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Comm_set_errhandler_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/comm_set_name_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/comm_set_name_f08ts.F90
new file mode 100644
index 0000000..12ec2f5
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/comm_set_name_f08ts.F90
@@ -0,0 +1,34 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Comm_set_name_f08(comm, comm_name, ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_char
+    use :: mpi_f08, only : MPI_Comm
+    use :: mpi_c_interface, only : c_Comm
+    use :: mpi_c_interface, only : MPIR_Comm_set_name_c
+    use :: mpi_c_interface, only : MPIR_Fortran_string_f2c
+
+    implicit none
+
+    type(MPI_Comm), intent(in) :: comm
+    character(len=*), intent(in) :: comm_name
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Comm) :: comm_c
+    character(kind=c_char) :: comm_name_c(len_trim(comm_name)+1)
+    integer(c_int) :: ierror_c
+
+    call MPIR_Fortran_string_f2c(comm_name, comm_name_c)
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Comm_set_name_c(comm%MPI_VAL, comm_name_c)
+    else
+        comm_c = comm%MPI_VAL
+        ierror_c = MPIR_Comm_set_name_c(comm_c, comm_name_c)
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Comm_set_name_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/comm_size_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/comm_size_f08ts.F90
new file mode 100644
index 0000000..1bde4ff
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/comm_size_f08ts.F90
@@ -0,0 +1,32 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Comm_size_f08(comm, size, ierror)
+    use :: mpi_f08, only : MPI_Comm
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Comm
+    use :: mpi_c_interface, only : MPIR_Comm_size_c
+
+    implicit none
+
+    type(MPI_Comm), intent(in) :: comm
+    integer, intent(out) :: size
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Comm) :: comm_c
+    integer(c_int) :: size_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Comm_size_c(comm%MPI_VAL, size)
+    else
+        comm_c = comm%MPI_VAL
+        ierror_c = MPIR_Comm_size_c(comm_c, size_c)
+        size = size_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Comm_size_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/comm_spawn_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/comm_spawn_f08ts.F90
new file mode 100644
index 0000000..2ebc844
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/comm_spawn_f08ts.F90
@@ -0,0 +1,77 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Comm_spawn_f08(command, argv, maxprocs, info, root, comm, intercomm, &
+    array_of_errcodes, ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_char, c_ptr, c_loc, c_associated
+    use :: mpi_f08, only : MPI_Info, MPI_Comm
+    use :: mpi_f08, only : MPI_ARGV_NULL, MPI_ERRCODES_IGNORE
+    use :: mpi_f08, only : MPIR_C_MPI_ARGV_NULL, MPIR_C_MPI_ERRCODES_IGNORE
+    use :: mpi_c_interface, only : c_Info, c_Comm
+    use :: mpi_c_interface, only : MPIR_Comm_spawn_c
+    use :: mpi_c_interface, only : MPIR_Fortran_string_f2c
+
+    implicit none
+
+    character(len=*), intent(in) :: command
+    character(len=*), intent(in), target :: argv(*)
+    integer, intent(in) :: maxprocs
+    integer, intent(in) :: root
+    type(MPI_Info), intent(in) :: info
+    type(MPI_Comm), intent(in) :: comm
+    type(MPI_Comm), intent(out) :: intercomm
+    integer, target :: array_of_errcodes(*)
+    integer, optional, intent(out) :: ierror
+
+    character(kind=c_char) :: command_c(len_trim(command)+1)
+    integer(c_int) :: maxprocs_c
+    integer(c_int) :: root_c
+    integer(c_Info) :: info_c
+    integer(c_Comm) :: comm_c
+    integer(c_Comm) :: intercomm_c
+    integer(c_int), target :: array_of_errcodes_c(maxprocs) ! Use automatic array to avoid memory allocation
+    integer(c_int) :: ierror_c
+    type(c_ptr) :: argv_cptr
+    type(c_ptr) :: array_of_errcodes_cptr
+    logical :: has_errcodes_ignore = .false.
+
+    call MPIR_Fortran_string_f2c(command, command_c)
+
+    argv_cptr = c_loc(argv)
+    if (c_associated(argv_cptr, c_loc(MPI_ARGV_NULL))) then
+        argv_cptr = MPIR_C_MPI_ARGV_NULL
+    end if
+
+    array_of_errcodes_cptr = c_loc(array_of_errcodes)
+    if (c_associated(array_of_errcodes_cptr, c_loc(MPI_ERRCODES_IGNORE))) then
+        array_of_errcodes_cptr = MPIR_C_MPI_ERRCODES_IGNORE
+        has_errcodes_ignore = .true.
+    end if
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Comm_spawn_c(command_c, argv_cptr, maxprocs, info%MPI_VAL, root, &
+                                     comm%MPI_VAL, intercomm%MPI_VAL, array_of_errcodes_cptr, len(argv))
+    else
+        maxprocs_c = maxprocs
+        info_c = info%MPI_VAL
+        root_c = root
+        comm_c = comm%MPI_VAL
+
+        if (.not. has_errcodes_ignore) then
+            array_of_errcodes_cptr = c_loc(array_of_errcodes_c)
+        end if
+
+        ierror_c = MPIR_Comm_spawn_c(command_c, argv_cptr, maxprocs_c, info_c, root_c, &
+                                     comm_c, intercomm_c, array_of_errcodes_cptr, len(argv))
+
+        if (.not. has_errcodes_ignore) then
+            array_of_errcodes(1:maxprocs) = array_of_errcodes_c(1:maxprocs)
+        end if
+
+        intercomm%MPI_VAL = intercomm_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+end subroutine MPI_Comm_spawn_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/comm_spawn_multiple_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/comm_spawn_multiple_f08ts.F90
new file mode 100644
index 0000000..ff6d80c
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/comm_spawn_multiple_f08ts.F90
@@ -0,0 +1,81 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Comm_spawn_multiple_f08(count, array_of_commands, array_of_argv, array_of_maxprocs, &
+    array_of_info, root, comm, intercomm, array_of_errcodes, ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_char, c_ptr, c_loc, c_associated
+    use :: mpi_f08, only : MPI_Info, MPI_Comm
+    use :: mpi_f08, only : MPI_ARGVS_NULL, MPI_ERRCODES_IGNORE
+    use :: mpi_f08, only : MPIR_C_MPI_ARGVS_NULL, MPIR_C_MPI_ERRCODES_IGNORE
+    use :: mpi_c_interface, only : c_Info, c_Comm
+    use :: mpi_c_interface, only : MPIR_Comm_spawn_multiple_c
+
+    implicit none
+
+    integer, intent(in) :: count
+    character(len=*), intent(in), target :: array_of_commands(*)
+    character(len=*), intent(in), target :: array_of_argv(count, *)
+    integer, intent(in) :: array_of_maxprocs(*)
+    type(MPI_Info), intent(in) :: array_of_info(*)
+    integer, intent(in) :: root
+    type(MPI_Comm), intent(in) :: comm
+    type(MPI_Comm), intent(out) :: intercomm
+    integer, target :: array_of_errcodes(*)
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: count_c
+    integer(c_int) :: array_of_maxprocs_c(count)
+    integer(c_Info) :: array_of_info_c(count)
+    integer(c_int) :: root_c
+    integer(c_Comm) :: comm_c
+    integer(c_Comm) :: intercomm_c
+    integer(c_int), target :: array_of_errcodes_c(sum(array_of_maxprocs(1:count)))
+    integer(c_int) :: ierror_c
+    integer :: length
+    type(c_ptr) :: array_of_argv_cptr
+    type(c_ptr) :: array_of_errcodes_cptr
+    logical :: has_errcodes_ignore = .false.
+
+    array_of_argv_cptr = c_loc(array_of_argv)
+    if (c_associated(array_of_argv_cptr, c_loc(MPI_ARGVS_NULL))) then
+        array_of_argv_cptr = MPIR_C_MPI_ARGVS_NULL
+    end if
+
+    array_of_errcodes_cptr = c_loc(array_of_errcodes)
+    if (c_associated(array_of_errcodes_cptr, c_loc(MPI_ERRCODES_IGNORE))) then
+        array_of_errcodes_cptr = MPIR_C_MPI_ERRCODES_IGNORE
+        has_errcodes_ignore = .true.
+    end if
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Comm_spawn_multiple_c(count, c_loc(array_of_commands), array_of_argv_cptr, &
+            array_of_maxprocs, array_of_info(1:count)%MPI_VAL, root, comm%MPI_VAL, intercomm%MPI_VAL, &
+            array_of_errcodes_cptr, len(array_of_commands), len(array_of_argv))
+    else
+        count_c = count
+        array_of_maxprocs_c(1:count) = array_of_maxprocs(1:count)
+        array_of_info_c = array_of_info(1:count)%MPI_VAL
+        root_c = root
+        comm_c = comm%MPI_VAL
+
+        if (.not. has_errcodes_ignore) then
+            array_of_errcodes_cptr = c_loc(array_of_errcodes_c)
+        end if
+
+        ierror_c = MPIR_Comm_spawn_multiple_c(count_c, c_loc(array_of_commands), array_of_argv_cptr, &
+             array_of_maxprocs_c, array_of_info_c, root_c, comm_c, intercomm_c, array_of_errcodes_cptr, &
+             len(array_of_commands), len(array_of_argv))
+
+        if (.not. has_errcodes_ignore) then
+            length = sum(array_of_maxprocs(1:count))
+            array_of_errcodes(1:length) = array_of_errcodes_c
+        end if
+
+        intercomm%MPI_VAL = intercomm_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Comm_spawn_multiple_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/comm_split_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/comm_split_f08ts.F90
new file mode 100644
index 0000000..3bbba73
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/comm_split_f08ts.F90
@@ -0,0 +1,38 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Comm_split_f08(comm, color, key, newcomm, ierror)
+    use :: mpi_f08, only : MPI_Comm
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Comm
+    use :: mpi_c_interface, only : MPIR_Comm_split_c
+
+    implicit none
+
+    type(MPI_Comm), intent(in) :: comm
+    integer, intent(in) :: color
+    integer, intent(in) :: key
+    type(MPI_Comm), intent(out) :: newcomm
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Comm) :: comm_c
+    integer(c_int) :: color_c
+    integer(c_int) :: key_c
+    integer(c_Comm) :: newcomm_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Comm_split_c(comm%MPI_VAL, color, key, newcomm%MPI_VAL)
+    else
+        comm_c = comm%MPI_VAL
+        color_c = color
+        key_c = key
+        ierror_c = MPIR_Comm_split_c(comm_c, color_c, key_c, newcomm_c)
+        newcomm%MPI_VAL = newcomm_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Comm_split_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/comm_split_type_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/comm_split_type_f08ts.F90
new file mode 100644
index 0000000..ce3acce
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/comm_split_type_f08ts.F90
@@ -0,0 +1,41 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Comm_split_type_f08(comm, split_type, key, info, newcomm, ierror)
+    use :: mpi_f08, only : MPI_Comm, MPI_Info
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Comm, c_Info
+    use :: mpi_c_interface, only : MPIR_Comm_split_type_c
+
+    implicit none
+
+    type(MPI_Comm), intent(in) :: comm
+    integer, intent(in) :: split_type
+    integer, intent(in) :: key
+    type(MPI_Info), intent(in) :: info
+    type(MPI_Comm), intent(out) :: newcomm
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Comm) :: comm_c
+    integer(c_int) :: split_type_c
+    integer(c_int) :: key_c
+    integer(c_Info) :: info_c
+    integer(c_Comm) :: newcomm_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Comm_split_type_c(comm%MPI_VAL, split_type, key, info%MPI_VAL, newcomm%MPI_VAL)
+    else
+        comm_c = comm%MPI_VAL
+        split_type_c = split_type
+        key_c = key
+        info_c = info%MPI_VAL
+        ierror_c = MPIR_Comm_split_type_c(comm_c, split_type_c, key_c, info_c, newcomm_c)
+        newcomm%MPI_VAL = newcomm_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Comm_split_type_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/comm_test_inter_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/comm_test_inter_f08ts.F90
new file mode 100644
index 0000000..f96ef0a
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/comm_test_inter_f08ts.F90
@@ -0,0 +1,32 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Comm_test_inter_f08(comm, flag, ierror)
+    use :: mpi_f08, only : MPI_Comm
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Comm
+    use :: mpi_c_interface, only : MPIR_Comm_test_inter_c
+
+    implicit none
+
+    type(MPI_Comm), intent(in) :: comm
+    logical, intent(out) :: flag
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Comm) :: comm_c
+    integer(c_int) :: flag_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Comm_test_inter_c(comm%MPI_VAL, flag_c)
+    else
+        comm_c = comm%MPI_VAL
+        ierror_c = MPIR_Comm_test_inter_c(comm_c, flag_c)
+    end if
+
+    flag = (flag_c /= 0)
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Comm_test_inter_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/dims_create_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/dims_create_f08ts.F90
new file mode 100644
index 0000000..8431ffd
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/dims_create_f08ts.F90
@@ -0,0 +1,34 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Dims_create_f08(nnodes, ndims, dims, ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : MPIR_Dims_create_c
+
+    implicit none
+
+    integer, intent(in) :: nnodes
+    integer, intent(in) :: ndims
+    integer, intent(inout) :: dims(ndims)
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: nnodes_c
+    integer(c_int) :: ndims_c
+    integer(c_int) :: dims_c(ndims)
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Dims_create_c(nnodes, ndims, dims)
+    else
+        nnodes_c = nnodes
+        ndims_c = ndims
+        dims_c = dims
+        ierror_c = MPIR_Dims_create_c(nnodes_c, ndims_c, dims_c)
+        dims = dims_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Dims_create_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/dist_graph_create_adjacent_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/dist_graph_create_adjacent_f08ts.F90
new file mode 100644
index 0000000..2968d13
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/dist_graph_create_adjacent_f08ts.F90
@@ -0,0 +1,97 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Dist_graph_create_adjacent_f08(comm_old, indegree, sources, sourceweights, &
+    outdegree, destinations, destweights, info, reorder, comm_dist_graph, ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_ptr, c_loc, c_associated
+    use :: mpi_f08, only : MPI_Comm, MPI_Info
+    use :: mpi_f08, only : MPI_UNWEIGHTED, MPI_WEIGHTS_EMPTY, MPIR_C_MPI_UNWEIGHTED, MPIR_C_MPI_WEIGHTS_EMPTY
+    use :: mpi_c_interface, only : c_Comm, c_Info
+    use :: mpi_c_interface, only : MPIR_Dist_graph_create_adjacent_c
+
+    implicit none
+
+    type(MPI_Comm), intent(in) :: comm_old
+    integer, intent(in) :: indegree
+    integer, intent(in) :: sources(indegree)
+    integer, intent(in), target :: sourceweights(indegree)
+    integer, intent(in) :: outdegree
+    integer, intent(in) :: destinations(outdegree)
+    integer, intent(in), target :: destweights(outdegree)
+    type(MPI_Info), intent(in) :: info
+    logical, intent(in) :: reorder
+    type(MPI_Comm), intent(out) :: comm_dist_graph
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Comm) :: comm_old_c
+    integer(c_int) :: indegree_c
+    integer(c_int) :: sources_c(indegree)
+    integer(c_int), target :: sourceweights_c(indegree)
+    integer(c_int) :: outdegree_c
+    integer(c_int) :: destinations_c(outdegree)
+    integer(c_int), target :: destweights_c(outdegree)
+    integer(c_Info) :: info_c
+    integer(c_int) :: reorder_c
+    integer(c_Comm) :: comm_dist_graph_c
+    integer(c_int) :: ierror_c
+
+    type(c_ptr) :: sourceweights_cptr, destweights_cptr
+
+    reorder_c = merge(1, 0, reorder)
+
+    if (c_int == kind(0)) then
+        if (c_associated(c_loc(sourceweights), c_loc(MPI_UNWEIGHTED))) then
+            sourceweights_cptr = MPIR_C_MPI_UNWEIGHTED
+        else if (c_associated(c_loc(sourceweights), c_loc(MPI_WEIGHTS_EMPTY))) then
+            sourceweights_cptr = MPIR_C_MPI_WEIGHTS_EMPTY
+        else
+            sourceweights_cptr = c_loc(sourceweights)
+        end if
+
+        if (c_associated(c_loc(destweights), c_loc(MPI_UNWEIGHTED))) then
+            destweights_cptr = MPIR_C_MPI_UNWEIGHTED
+        else if (c_associated(c_loc(destweights), c_loc(MPI_WEIGHTS_EMPTY))) then
+            destweights_cptr = MPIR_C_MPI_WEIGHTS_EMPTY
+        else
+            destweights_cptr = c_loc(destweights)
+        end if
+
+        ierror_c = MPIR_Dist_graph_create_adjacent_c(comm_old%MPI_VAL, indegree, sources, sourceweights_cptr, outdegree, &
+                destinations, destweights_cptr, info%MPI_VAL, reorder_c, comm_dist_graph%MPI_VAL)
+    else
+        comm_old_c = comm_old%MPI_VAL
+        indegree_c = indegree
+        sources_c = sources
+        outdegree_c = outdegree
+        destinations_c = destinations
+        info_c = info%MPI_VAL
+
+        if (c_associated(c_loc(sourceweights), c_loc(MPI_UNWEIGHTED))) then
+            sourceweights_cptr = MPIR_C_MPI_UNWEIGHTED
+        else if (c_associated(c_loc(sourceweights), c_loc(MPI_WEIGHTS_EMPTY))) then
+            sourceweights_cptr = MPIR_C_MPI_WEIGHTS_EMPTY
+        else
+            sourceweights_c = sourceweights
+            sourceweights_cptr = c_loc(sourceweights_c)
+        end if
+
+        if (c_associated(c_loc(destweights), c_loc(MPI_UNWEIGHTED))) then
+            destweights_cptr = MPIR_C_MPI_UNWEIGHTED
+        else if (c_associated(c_loc(destweights), c_loc(MPI_WEIGHTS_EMPTY))) then
+            destweights_cptr = MPIR_C_MPI_WEIGHTS_EMPTY
+        else
+            destweights_c = destweights
+            destweights_cptr = c_loc(destweights_c)
+        end if
+
+        ierror_c = MPIR_Dist_graph_create_adjacent_c(comm_old_c, indegree_c, sources_c, sourceweights_cptr, outdegree_c, &
+                destinations_c, destweights_cptr, info_c, reorder_c, comm_dist_graph_c)
+
+        comm_dist_graph%MPI_VAL = comm_dist_graph_c
+    endif
+
+    if(present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Dist_graph_create_adjacent_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/dist_graph_create_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/dist_graph_create_f08ts.F90
new file mode 100644
index 0000000..bb09f99
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/dist_graph_create_f08ts.F90
@@ -0,0 +1,78 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Dist_graph_create_f08(comm_old, n,sources, degrees, destinations, weights, &
+    info, reorder, comm_dist_graph, ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_ptr, c_loc, c_associated
+    use :: mpi_f08, only : MPI_Comm, MPI_Info
+    use :: mpi_f08, only : MPI_UNWEIGHTED, MPI_WEIGHTS_EMPTY, MPIR_C_MPI_UNWEIGHTED, MPIR_C_MPI_WEIGHTS_EMPTY
+    use :: mpi_c_interface, only : c_Comm, c_Info
+    use :: mpi_c_interface, only : MPIR_Dist_graph_create_c
+
+    implicit none
+
+    type(MPI_Comm), intent(in) :: comm_old
+    integer, intent(in) :: n
+    integer, intent(in) :: sources(n)
+    integer, intent(in) :: degrees(n)
+    integer, intent(in) :: destinations(*)
+    integer, intent(in), target :: weights(*)
+    type(MPI_Info), intent(in) :: info
+    logical, intent(in) :: reorder
+    type(MPI_Comm), intent(out) :: comm_dist_graph
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Comm) :: comm_old_c
+    integer(c_int) :: n_c
+    integer(c_int) :: sources_c(n)
+    integer(c_int) :: degrees_c(n)
+    integer(c_int) :: destinations_c(sum(degrees))
+    integer(c_int), target :: weights_c(sum(degrees))
+    integer(c_Info) :: info_c
+    integer(c_int) :: reorder_c
+    integer(c_Comm) :: comm_dist_graph_c
+    integer(c_int) :: ierror_c
+
+    type(c_ptr) :: weights_cptr
+
+    reorder_c = merge(1, 0, reorder)
+
+    if (c_int == kind(0)) then
+        if (c_associated(c_loc(weights), c_loc(MPI_UNWEIGHTED))) then
+            weights_cptr = MPIR_C_MPI_UNWEIGHTED
+        else if (c_associated(c_loc(weights), c_loc(MPI_WEIGHTS_EMPTY))) then
+            weights_cptr = MPIR_C_MPI_WEIGHTS_EMPTY
+        else
+            weights_cptr = c_loc(weights)
+        end if
+
+        ierror_c = MPIR_Dist_graph_create_c(comm_old%MPI_VAL, n, sources, degrees, destinations, weights_cptr, &
+            info%MPI_VAL, reorder_c, comm_dist_graph%MPI_VAL)
+    else
+        comm_old_c = comm_old%MPI_VAL
+        n_c = n
+        info_c = info%MPI_VAL
+        sources_c = sources
+        degrees_c = degrees
+
+        if (c_associated(c_loc(weights), c_loc(MPI_UNWEIGHTED))) then
+            weights_cptr = MPIR_C_MPI_UNWEIGHTED
+        else if (c_associated(c_loc(weights), c_loc(MPI_WEIGHTS_EMPTY))) then
+            weights_cptr = MPIR_C_MPI_WEIGHTS_EMPTY
+        else
+            weights_c = weights(1:sum(degrees))
+            weights_cptr = c_loc(weights_c)
+        end if
+
+        destinations_c = destinations(1:sum(degrees))
+        ierror_c = MPIR_Dist_graph_create_c(comm_old_c, n_c, sources_c, degrees_c, destinations_c, weights_cptr, &
+            info_c, reorder_c, comm_dist_graph_c)
+
+        comm_dist_graph%MPI_VAL = comm_dist_graph_c
+    end if
+
+    if(present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Dist_graph_create_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/dist_graph_neighbors_count_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/dist_graph_neighbors_count_f08ts.F90
new file mode 100644
index 0000000..4e34322
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/dist_graph_neighbors_count_f08ts.F90
@@ -0,0 +1,38 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Dist_graph_neighbors_count_f08(comm, indegree, outdegree, weighted, ierror)
+    use :: mpi_f08, only : MPI_Comm
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Comm
+    use :: mpi_c_interface, only : MPIR_Dist_graph_neighbors_count_c
+
+    implicit none
+
+    type(MPI_Comm), intent(in) :: comm
+    integer, intent(out) :: indegree
+    integer, intent(out) :: outdegree
+    logical, intent(out) :: weighted
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Comm) :: comm_c
+    integer(c_int) :: indegree_c
+    integer(c_int) :: outdegree_c
+    integer(c_int) :: weighted_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Dist_graph_neighbors_count_c(comm%MPI_VAL, indegree, outdegree, weighted_c)
+    else
+        comm_c = comm%MPI_VAL
+        ierror_c = MPIR_Dist_graph_neighbors_count_c(comm_c, indegree_c, outdegree_c, weighted_c)
+        indegree = indegree_c
+        outdegree = outdegree_c
+    end if
+
+    weighted = (weighted_c /= 0)
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Dist_graph_neighbors_count_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/dist_graph_neighbors_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/dist_graph_neighbors_f08ts.F90
new file mode 100644
index 0000000..f64946c
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/dist_graph_neighbors_f08ts.F90
@@ -0,0 +1,50 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Dist_graph_neighbors_f08(comm, maxindegree, sources, sourceweights, &
+    maxoutdegree, destinations, destweights, ierror)
+    use :: mpi_f08, only : MPI_Comm
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Comm
+    use :: mpi_c_interface, only : MPIR_Dist_graph_neighbors_c
+
+    implicit none
+
+    type(MPI_Comm), intent(in) :: comm
+    integer, intent(in) :: maxindegree
+    integer, intent(in) :: maxoutdegree
+    integer, intent(out) :: sources(maxindegree)
+    integer, intent(out) :: destinations(maxoutdegree)
+    integer, intent(out) :: sourceweights(maxindegree)
+    integer, intent(out) :: destweights(maxoutdegree)
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Comm) :: comm_c
+    integer(c_int) :: maxindegree_c
+    integer(c_int) :: maxoutdegree_c
+    integer(c_int) :: sources_c(maxindegree)
+    integer(c_int) :: destinations_c(maxoutdegree)
+    integer(c_int) :: sourceweights_c(maxindegree)
+    integer(c_int) :: destweights_c(maxoutdegree)
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Dist_graph_neighbors_c(comm%MPI_VAL, maxindegree, sources, sourceweights, maxoutdegree, &
+            destinations, destweights)
+    else
+        comm_c = comm%MPI_VAL
+        maxindegree_c = maxindegree
+        maxoutdegree_c = maxoutdegree
+        ierror_c = MPIR_Dist_graph_neighbors_c(comm_c, maxindegree_c, sources_c, sourceweights_c, maxoutdegree_c, &
+            destinations_c, destweights_c)
+        sources = sources_c
+        sourceweights = sourceweights_c
+        destinations = destinations_c
+        destweights = destweights_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Dist_graph_neighbors_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/errhandler_free_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/errhandler_free_f08ts.F90
new file mode 100644
index 0000000..41535d5
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/errhandler_free_f08ts.F90
@@ -0,0 +1,30 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Errhandler_free_f08(errhandler, ierror)
+    use :: mpi_f08, only : MPI_Errhandler
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Errhandler
+    use :: mpi_c_interface, only : MPIR_Errhandler_free_c
+
+    implicit none
+
+    type(MPI_Errhandler), intent(inout) :: errhandler
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Errhandler) :: errhandler_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Errhandler_free_c(errhandler%MPI_VAL)
+    else
+        errhandler_c = errhandler%MPI_VAL
+        ierror_c = MPIR_Errhandler_free_c(errhandler_c)
+        errhandler%MPI_VAL = errhandler_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Errhandler_free_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/error_class_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/error_class_f08ts.F90
new file mode 100644
index 0000000..8fb860b
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/error_class_f08ts.F90
@@ -0,0 +1,30 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Error_class_f08(errorcode, errorclass, ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : MPIR_Error_class_c
+
+    implicit none
+
+    integer, intent(in) :: errorcode
+    integer, intent(out) :: errorclass
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: errorcode_c
+    integer(c_int) :: errorclass_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Error_class_c(errorcode, errorclass)
+    else
+        errorcode_c = errorcode
+        ierror_c = MPIR_Error_class_c(errorcode_c, errorclass_c)
+        errorclass = errorclass_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Error_class_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/error_string_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/error_string_f08ts.F90
new file mode 100644
index 0000000..e8bb1b9
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/error_string_f08ts.F90
@@ -0,0 +1,37 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Error_string_f08(errorcode, string, resultlen, ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_char
+    use :: mpi_f08, only : MPI_MAX_ERROR_STRING
+    use :: mpi_f08, only : MPI_MAX_ERROR_STRING
+    use :: mpi_c_interface, only : MPIR_Error_string_c
+    use :: mpi_c_interface, only : MPIR_Fortran_string_c2f
+
+    implicit none
+
+    integer, intent(in) :: errorcode
+    character(len=MPI_MAX_ERROR_STRING), intent(out) :: string
+    integer, intent(out) :: resultlen
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: errorcode_c
+    character(kind=c_char) :: string_c(MPI_MAX_ERROR_STRING+1)
+    integer(c_int) :: resultlen_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Error_string_c(errorcode, string_c, resultlen)
+    else
+        errorcode_c = errorcode
+        ierror_c = MPIR_Error_string_c(errorcode_c, string_c, resultlen_c)
+        resultlen = resultlen_c
+    end if
+
+    call MPIR_Fortran_string_c2f(string_c, string)
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Error_string_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/exscan_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/exscan_f08ts.F90
new file mode 100644
index 0000000..5e3788b
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/exscan_f08ts.F90
@@ -0,0 +1,40 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Exscan_f08ts(sendbuf, recvbuf, count, datatype, op, comm, ierror)
+    use :: mpi_f08, only : MPI_Datatype, MPI_Op, MPI_Comm
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Datatype, c_Op, c_Comm
+    use :: mpi_c_interface, only : MPIR_Exscan_cdesc
+
+    implicit none
+
+    type(*), dimension(..), intent(in) :: sendbuf
+    type(*), dimension(..) :: recvbuf
+    integer, intent(in) :: count
+    type(MPI_Datatype), intent(in) :: datatype
+    type(MPI_Op), intent(in) :: op
+    type(MPI_Comm), intent(in) :: comm
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: count_c
+    integer(c_Datatype) :: datatype_c
+    integer(c_Op) :: op_c
+    integer(c_Comm) :: comm_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Exscan_cdesc(sendbuf, recvbuf, count, datatype%MPI_VAL, op%MPI_VAL, comm%MPI_VAL)
+    else
+        count_c = count
+        datatype_c = datatype%MPI_VAL
+        op_c = op%MPI_VAL
+        comm_c = comm%MPI_VAL
+        ierror_c = MPIR_Exscan_cdesc(sendbuf, recvbuf, count_c, datatype_c, op_c, comm_c)
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Exscan_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/f_sync_reg_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/f_sync_reg_f08ts.F90
new file mode 100644
index 0000000..a57f44c
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/f_sync_reg_f08ts.F90
@@ -0,0 +1,18 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_F_sync_reg_f08ts(buf)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : MPIR_F_sync_reg_cdesc
+
+    implicit none
+
+    type(*), dimension(..) :: buf
+
+    integer(c_int) :: ierror_c
+
+    ierror_c = MPIR_F_sync_reg_cdesc(buf)
+
+end subroutine MPI_F_sync_reg_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/file_call_errhandler_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/file_call_errhandler_f08ts.F90
new file mode 100644
index 0000000..576d8e3
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/file_call_errhandler_f08ts.F90
@@ -0,0 +1,33 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_File_call_errhandler_f08(fh, errorcode, ierror)
+    use :: mpi_f08, only : MPI_File
+    use :: mpi_f08, only : MPI_File_f2c, MPI_File_c2f
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_File
+    use :: mpi_c_interface, only : MPIR_File_call_errhandler_c
+
+    implicit none
+
+    type(MPI_File), intent(in) :: fh
+    integer, intent(in) :: errorcode
+    integer, optional, intent(out) :: ierror
+
+    integer(c_File) :: fh_c
+    integer(c_int) :: errorcode_c
+    integer(c_int) :: ierror_c
+
+    fh_c = MPI_File_f2c(fh%MPI_VAL)
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_File_call_errhandler_c(fh_c, errorcode)
+    else
+        errorcode_c = errorcode
+        ierror_c = MPIR_File_call_errhandler_c(fh_c, errorcode_c)
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_File_call_errhandler_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/file_close_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/file_close_f08ts.F90
new file mode 100644
index 0000000..56d02c8
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/file_close_f08ts.F90
@@ -0,0 +1,27 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_File_close_f08(fh, ierror)
+    use :: mpi_f08, only : MPI_File
+    use :: mpi_f08, only : MPI_File_f2c, MPI_File_c2f
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_File
+    use :: mpi_c_interface, only : MPIR_File_close_c
+
+    implicit none
+
+    type(MPI_File), intent(inout) :: fh
+    integer, optional, intent(out) :: ierror
+
+    integer(c_File) :: fh_c
+    integer(c_int) :: ierror_c
+
+    fh_c = MPI_File_f2c(fh%MPI_VAL)
+    ierror_c = MPIR_File_close_c(fh_c)
+
+    fh%MPI_VAL = MPI_File_c2f(fh_c)
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_File_close_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/file_create_errhandler_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/file_create_errhandler_f08ts.F90
new file mode 100644
index 0000000..55455da
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/file_create_errhandler_f08ts.F90
@@ -0,0 +1,34 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_File_create_errhandler_f08(file_errhandler_fn, errhandler, ierror)
+    use :: mpi_f08, only : MPI_Errhandler
+    use :: mpi_f08, only : MPI_File_errhandler_function
+    use, intrinsic :: iso_c_binding, only : c_funloc
+    use, intrinsic :: iso_c_binding, only : c_int, c_funptr
+    use :: mpi_c_interface, only : c_Errhandler
+    use :: mpi_c_interface, only : MPIR_File_create_errhandler_c
+
+    implicit none
+
+    procedure(MPI_File_errhandler_function) :: file_errhandler_fn
+    type(MPI_Errhandler), intent(out) :: errhandler
+    integer, optional, intent(out) :: ierror
+
+    type(c_funptr) :: file_errhandler_fn_c
+    integer(c_Errhandler) :: errhandler_c
+    integer(c_int) :: ierror_c
+
+    file_errhandler_fn_c = c_funloc(file_errhandler_fn)
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_File_create_errhandler_c(file_errhandler_fn_c, errhandler%MPI_VAL)
+    else
+        ierror_c = MPIR_File_create_errhandler_c(file_errhandler_fn_c, errhandler_c)
+        errhandler%MPI_VAL = errhandler_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_File_create_errhandler_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/file_delete_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/file_delete_f08ts.F90
new file mode 100644
index 0000000..e938498
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/file_delete_f08ts.F90
@@ -0,0 +1,34 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_File_delete_f08(filename, info, ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_char
+    use :: mpi_f08, only : MPI_Info
+    use :: mpi_c_interface, only : c_Info
+    use :: mpi_c_interface, only : MPIR_File_delete_c
+    use :: mpi_c_interface, only : MPIR_Fortran_string_f2c
+
+    implicit none
+
+    character(len=*), intent(in) :: filename
+    type(MPI_Info), intent(in) :: info
+    integer, optional, intent(out) :: ierror
+
+    character(kind=c_char) :: filename_c(len_trim(filename)+1)
+    integer(c_Info) :: info_c
+    integer(c_int) :: ierror_c
+
+    call MPIR_Fortran_string_f2c(filename, filename_c)
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_File_delete_c(filename_c, info%MPI_VAL)
+    else
+        info_c = info%MPI_VAL
+        ierror_c = MPIR_File_delete_c(filename_c, info_c)
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_File_delete_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/file_get_amode_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/file_get_amode_f08ts.F90
new file mode 100644
index 0000000..31f335d
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/file_get_amode_f08ts.F90
@@ -0,0 +1,33 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_File_get_amode_f08(fh, amode, ierror)
+    use :: mpi_f08, only : MPI_File
+    use :: mpi_f08, only : MPI_File_f2c, MPI_File_c2f
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_File
+    use :: mpi_c_interface, only : MPIR_File_get_amode_c
+
+    implicit none
+
+    type(MPI_File), intent(in) :: fh
+    integer, intent(out) :: amode
+    integer, optional, intent(out) :: ierror
+
+    integer(c_File) :: fh_c
+    integer(c_int) :: amode_c
+    integer(c_int) :: ierror_c
+
+    fh_c = MPI_File_f2c(fh%MPI_VAL)
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_File_get_amode_c(fh_c, amode)
+    else
+        ierror_c = MPIR_File_get_amode_c(fh_c, amode_c)
+        amode = amode_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_File_get_amode_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/file_get_atomicity_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/file_get_atomicity_f08ts.F90
new file mode 100644
index 0000000..2487794
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/file_get_atomicity_f08ts.F90
@@ -0,0 +1,29 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_File_get_atomicity_f08(fh, flag, ierror)
+    use :: mpi_f08, only : MPI_File
+    use :: mpi_f08, only : MPI_File_f2c, MPI_File_c2f
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_File
+    use :: mpi_c_interface, only : MPIR_File_get_atomicity_c
+
+    implicit none
+
+    type(MPI_File), intent(in) :: fh
+    logical, intent(out) :: flag
+    integer, optional, intent(out) :: ierror
+
+    integer(c_File) :: fh_c
+    integer(c_int) :: flag_c
+    integer(c_int) :: ierror_c
+
+    fh_c = MPI_File_f2c(fh%MPI_VAL)
+    ierror_c = MPIR_File_get_atomicity_c(fh_c, flag_c)
+
+    flag = (flag_c /= 0)
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_File_get_atomicity_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/file_get_byte_offset_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/file_get_byte_offset_f08ts.F90
new file mode 100644
index 0000000..cab37f2
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/file_get_byte_offset_f08ts.F90
@@ -0,0 +1,37 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_File_get_byte_offset_f08(fh, offset, disp, ierror)
+    use :: mpi_f08, only : MPI_File
+    use :: mpi_f08, only : MPI_OFFSET_KIND
+    use :: mpi_f08, only : MPI_File_f2c, MPI_File_c2f
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_File
+    use :: mpi_c_interface, only : MPIR_File_get_byte_offset_c
+
+    implicit none
+
+    type(MPI_File), intent(in) :: fh
+    integer(MPI_OFFSET_KIND), intent(in) :: offset
+    integer(MPI_OFFSET_KIND), intent(out) :: disp
+    integer, optional, intent(out) :: ierror
+
+    integer(c_File) :: fh_c
+    integer(MPI_OFFSET_KIND) :: offset_c
+    integer(MPI_OFFSET_KIND) :: disp_c
+    integer(c_int) :: ierror_c
+
+    fh_c = MPI_File_f2c(fh%MPI_VAL)
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_File_get_byte_offset_c(fh_c, offset, disp)
+    else
+        offset_c = offset
+        ierror_c = MPIR_File_get_byte_offset_c(fh_c, offset_c, disp_c)
+        disp = disp_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_File_get_byte_offset_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/file_get_errhandler_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/file_get_errhandler_f08ts.F90
new file mode 100644
index 0000000..af242d1
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/file_get_errhandler_f08ts.F90
@@ -0,0 +1,33 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_File_get_errhandler_f08(file, errhandler, ierror)
+    use :: mpi_f08, only : MPI_File, MPI_Errhandler
+    use :: mpi_f08, only : MPI_File_f2c, MPI_File_c2f
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_File, c_Errhandler
+    use :: mpi_c_interface, only : MPIR_File_get_errhandler_c
+
+    implicit none
+
+    type(MPI_File), intent(in) :: file
+    type(MPI_Errhandler), intent(out) :: errhandler
+    integer, optional, intent(out) :: ierror
+
+    integer(c_File) :: file_c
+    integer(c_Errhandler) :: errhandler_c
+    integer(c_int) :: ierror_c
+
+    file_c = MPI_File_f2c(file%MPI_VAL)
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_File_get_errhandler_c(file_c, errhandler%MPI_VAL)
+    else
+        ierror_c = MPIR_File_get_errhandler_c(file_c, errhandler_c)
+        errhandler%MPI_VAL = errhandler_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_File_get_errhandler_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/file_get_group_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/file_get_group_f08ts.F90
new file mode 100644
index 0000000..63eb927
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/file_get_group_f08ts.F90
@@ -0,0 +1,33 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_File_get_group_f08(fh, group, ierror)
+    use :: mpi_f08, only : MPI_File, MPI_Group
+    use :: mpi_f08, only : MPI_File_f2c, MPI_File_c2f
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_File, c_Group
+    use :: mpi_c_interface, only : MPIR_File_get_group_c
+
+    implicit none
+
+    type(MPI_File), intent(in) :: fh
+    type(MPI_Group), intent(out) :: group
+    integer, optional, intent(out) :: ierror
+
+    integer(c_File) :: fh_c
+    integer(c_Group) :: group_c
+    integer(c_int) :: ierror_c
+
+    fh_c = MPI_File_f2c(fh%MPI_VAL)
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_File_get_group_c(fh_c, group%MPI_VAL)
+    else
+        ierror_c = MPIR_File_get_group_c(fh_c, group_c)
+        group%MPI_VAL = group_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_File_get_group_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/file_get_info_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/file_get_info_f08ts.F90
new file mode 100644
index 0000000..7748d46
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/file_get_info_f08ts.F90
@@ -0,0 +1,33 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_File_get_info_f08(fh, info_used, ierror)
+    use :: mpi_f08, only : MPI_File, MPI_Info
+    use :: mpi_f08, only : MPI_File_f2c, MPI_File_c2f
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_File, c_Info
+    use :: mpi_c_interface, only : MPIR_File_get_info_c
+
+    implicit none
+
+    type(MPI_File), intent(in) :: fh
+    type(MPI_Info), intent(out) :: info_used
+    integer, optional, intent(out) :: ierror
+
+    integer(c_File) :: fh_c
+    integer(c_Info) :: info_used_c
+    integer(c_int) :: ierror_c
+
+    fh_c = MPI_File_f2c(fh%MPI_VAL)
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_File_get_info_c(fh_c, info_used%MPI_VAL)
+    else
+        ierror_c = MPIR_File_get_info_c(fh_c, info_used_c)
+        info_used%MPI_VAL = info_used_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_File_get_info_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/file_get_position_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/file_get_position_f08ts.F90
new file mode 100644
index 0000000..bc80af8
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/file_get_position_f08ts.F90
@@ -0,0 +1,34 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_File_get_position_f08(fh, offset, ierror)
+    use :: mpi_f08, only : MPI_File
+    use :: mpi_f08, only : MPI_OFFSET_KIND
+    use :: mpi_f08, only : MPI_File_f2c, MPI_File_c2f
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_File
+    use :: mpi_c_interface, only : MPIR_File_get_position_c
+
+    implicit none
+
+    type(MPI_File), intent(in) :: fh
+    integer(MPI_OFFSET_KIND), intent(out) :: offset
+    integer, optional, intent(out) :: ierror
+
+    integer(c_File) :: fh_c
+    integer(MPI_OFFSET_KIND) :: offset_c
+    integer(c_int) :: ierror_c
+
+    fh_c = MPI_File_f2c(fh%MPI_VAL)
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_File_get_position_c(fh_c, offset)
+    else
+        ierror_c = MPIR_File_get_position_c(fh_c, offset_c)
+        offset = offset_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_File_get_position_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/file_get_position_shared_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/file_get_position_shared_f08ts.F90
new file mode 100644
index 0000000..dde09bc
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/file_get_position_shared_f08ts.F90
@@ -0,0 +1,34 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_File_get_position_shared_f08(fh, offset, ierror)
+    use :: mpi_f08, only : MPI_File
+    use :: mpi_f08, only : MPI_OFFSET_KIND
+    use :: mpi_f08, only : MPI_File_f2c, MPI_File_c2f
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_File
+    use :: mpi_c_interface, only : MPIR_File_get_position_shared_c
+
+    implicit none
+
+    type(MPI_File), intent(in) :: fh
+    integer(MPI_OFFSET_KIND), intent(out) :: offset
+    integer, optional, intent(out) :: ierror
+
+    integer(c_File) :: fh_c
+    integer(MPI_OFFSET_KIND) :: offset_c
+    integer(c_int) :: ierror_c
+
+    fh_c = MPI_File_f2c(fh%MPI_VAL)
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_File_get_position_shared_c(fh_c, offset)
+    else
+        ierror_c = MPIR_File_get_position_shared_c(fh_c, offset_c)
+        offset = offset_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_File_get_position_shared_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/file_get_size_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/file_get_size_f08ts.F90
new file mode 100644
index 0000000..648daa1
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/file_get_size_f08ts.F90
@@ -0,0 +1,34 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_File_get_size_f08(fh, size, ierror)
+    use :: mpi_f08, only : MPI_File
+    use :: mpi_f08, only : MPI_OFFSET_KIND
+    use :: mpi_f08, only : MPI_File_f2c, MPI_File_c2f
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_File
+    use :: mpi_c_interface, only : MPIR_File_get_size_c
+
+    implicit none
+
+    type(MPI_File), intent(in) :: fh
+    integer(MPI_OFFSET_KIND), intent(out) :: size
+    integer, optional, intent(out) :: ierror
+
+    integer(c_File) :: fh_c
+    integer(MPI_OFFSET_KIND) :: size_c
+    integer(c_int) :: ierror_c
+
+    fh_c = MPI_File_f2c(fh%MPI_VAL)
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_File_get_size_c(fh_c, size)
+    else
+        ierror_c = MPIR_File_get_size_c(fh_c, size_c)
+        size = size_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_File_get_size_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/file_get_type_extent_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/file_get_type_extent_f08ts.F90
new file mode 100644
index 0000000..9e4c7d7
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/file_get_type_extent_f08ts.F90
@@ -0,0 +1,37 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_File_get_type_extent_f08(fh, datatype, extent, ierror)
+    use :: mpi_f08, only : MPI_File, MPI_Datatype
+    use :: mpi_f08, only : MPI_File_f2c, MPI_File_c2f
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_f08, only : MPI_ADDRESS_KIND
+    use :: mpi_c_interface, only : c_File, c_Datatype
+    use :: mpi_c_interface, only : MPIR_File_get_type_extent_c
+
+    implicit none
+
+    type(MPI_File), intent(in) :: fh
+    type(MPI_Datatype), intent(in) :: datatype
+    integer(MPI_ADDRESS_KIND), intent(out) :: extent
+    integer, optional, intent(out) :: ierror
+
+    integer(c_File) :: fh_c
+    integer(c_Datatype) :: datatype_c
+    integer(MPI_ADDRESS_KIND) :: extent_c
+    integer(c_int) :: ierror_c
+
+    fh_c = MPI_File_f2c(fh%MPI_VAL)
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_File_get_type_extent_c(fh_c, datatype%MPI_VAL, extent)
+    else
+        datatype_c = datatype%MPI_VAL
+        ierror_c = MPIR_File_get_type_extent_c(fh_c, datatype_c, extent_c)
+        extent = extent_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_File_get_type_extent_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/file_get_view_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/file_get_view_f08ts.F90
new file mode 100644
index 0000000..162d598
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/file_get_view_f08ts.F90
@@ -0,0 +1,45 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_File_get_view_f08(fh, disp, etype, filetype, datarep, ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_char
+    use :: mpi_f08, only : MPI_File, MPI_Datatype
+    use :: mpi_f08, only : MPI_OFFSET_KIND
+    use :: mpi_f08, only : MPI_File_f2c, MPI_File_c2f
+    use :: mpi_c_interface, only : c_File, c_Datatype
+    use :: mpi_c_interface, only : MPIR_File_get_view_c
+    use :: mpi_c_interface, only : MPIR_Fortran_string_c2f
+
+    implicit none
+
+    type(MPI_File), intent(in) :: fh
+    integer(MPI_OFFSET_KIND), intent(out) :: disp
+    type(MPI_Datatype), intent(out) :: etype
+    type(MPI_Datatype), intent(out) :: filetype
+    character(len=*), intent(out) :: datarep
+    integer, optional, intent(out) :: ierror
+
+    integer(c_File) :: fh_c
+    integer(MPI_OFFSET_KIND) :: disp_c
+    integer(c_Datatype) :: etype_c
+    integer(c_Datatype) :: filetype_c
+    character(kind=c_char) :: datarep_c(len(datarep)+1)
+    integer(c_int) :: ierror_c
+
+    fh_c = MPI_File_f2c(fh%MPI_VAL)
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_File_get_view_c(fh_c, disp, etype%MPI_VAL, filetype%MPI_VAL, datarep_c)
+    else
+        ierror_c = MPIR_File_get_view_c(fh_c, disp_c, etype_c, filetype_c, datarep_c)
+        disp = disp_c
+        etype%MPI_VAL = etype_c
+        filetype%MPI_VAL = filetype_c
+    end if
+
+    call MPIR_Fortran_string_c2f(datarep_c, datarep)
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_File_get_view_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/file_iread_at_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/file_iread_at_f08ts.F90
new file mode 100644
index 0000000..6c3f1ab
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/file_iread_at_f08ts.F90
@@ -0,0 +1,44 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_File_iread_at_f08ts(fh, offset, buf, count, datatype, request, ierror)
+    use :: mpi_f08, only : MPI_File, MPI_Datatype, MPI_Request
+    use :: mpi_f08, only : MPI_OFFSET_KIND
+    use :: mpi_f08, only : MPI_File_f2c, MPI_File_c2f
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_File, c_Datatype, c_Request
+    use :: mpi_c_interface, only : MPIR_File_iread_at_cdesc
+
+    implicit none
+
+    type(MPI_File), intent(in) :: fh
+    integer(MPI_OFFSET_KIND), intent(in) :: offset
+    type(*), dimension(..), asynchronous :: buf
+    integer, intent(in) :: count
+    type(MPI_Datatype), intent(in) :: datatype
+    type(MPI_Request), intent(out) :: request
+    integer, optional, intent(out) :: ierror
+
+    integer(c_File) :: fh_c
+    integer(MPI_OFFSET_KIND) :: offset_c
+    integer(c_int) :: count_c
+    integer(c_Datatype) :: datatype_c
+    integer(c_Request) :: request_c
+    integer(c_int) :: ierror_c
+
+    fh_c = MPI_File_f2c(fh%MPI_VAL)
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_File_iread_at_cdesc(fh_c, offset, buf, count, datatype%MPI_VAL, request%MPI_VAL)
+    else
+        offset_c = offset
+        count_c = count
+        datatype_c = datatype%MPI_VAL
+        ierror_c = MPIR_File_iread_at_cdesc(fh_c, offset_c, buf, count_c, datatype_c, request_c)
+        request%MPI_VAL = request_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_File_iread_at_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/file_iread_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/file_iread_f08ts.F90
new file mode 100644
index 0000000..1e20517
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/file_iread_f08ts.F90
@@ -0,0 +1,40 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_File_iread_f08ts(fh, buf, count, datatype, request, ierror)
+    use :: mpi_f08, only : MPI_File, MPI_Datatype, MPI_Request
+    use :: mpi_f08, only : MPI_File_f2c, MPI_File_c2f
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_File, c_Datatype, c_Request
+    use :: mpi_c_interface, only : MPIR_File_iread_cdesc
+
+    implicit none
+
+    type(MPI_File), intent(in) :: fh
+    type(*), dimension(..), asynchronous :: buf
+    integer, intent(in) :: count
+    type(MPI_Datatype), intent(in) :: datatype
+    type(MPI_Request), intent(out) :: request
+    integer, optional, intent(out) :: ierror
+
+    integer(c_File) :: fh_c
+    integer(c_int) :: count_c
+    integer(c_Datatype) :: datatype_c
+    integer(c_Request) :: request_c
+    integer(c_int) :: ierror_c
+
+    fh_c = MPI_File_f2c(fh%MPI_VAL)
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_File_iread_cdesc(fh_c, buf, count, datatype%MPI_VAL, request%MPI_VAL)
+    else
+        count_c = count
+        datatype_c = datatype%MPI_VAL
+        ierror_c = MPIR_File_iread_cdesc(fh_c, buf, count_c, datatype_c, request_c)
+        request%MPI_VAL = request_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_File_iread_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/file_iread_shared_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/file_iread_shared_f08ts.F90
new file mode 100644
index 0000000..5641753
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/file_iread_shared_f08ts.F90
@@ -0,0 +1,40 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_File_iread_shared_f08ts(fh, buf, count, datatype, request, ierror)
+    use :: mpi_f08, only : MPI_File, MPI_Datatype, MPI_Request
+    use :: mpi_f08, only : MPI_File_f2c, MPI_File_c2f
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_File, c_Datatype, c_Request
+    use :: mpi_c_interface, only : MPIR_File_iread_shared_cdesc
+
+    implicit none
+
+    type(MPI_File), intent(in) :: fh
+    type(*), dimension(..), asynchronous :: buf
+    integer, intent(in) :: count
+    type(MPI_Datatype), intent(in) :: datatype
+    type(MPI_Request), intent(out) :: request
+    integer, optional, intent(out) :: ierror
+
+    integer(c_File) :: fh_c
+    integer(c_int) :: count_c
+    integer(c_Datatype) :: datatype_c
+    integer(c_Request) :: request_c
+    integer(c_int) :: ierror_c
+
+    fh_c = MPI_File_f2c(fh%MPI_VAL)
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_File_iread_shared_cdesc(fh_c, buf, count, datatype%MPI_VAL, request%MPI_VAL)
+    else
+        count_c = count
+        datatype_c = datatype%MPI_VAL
+        ierror_c = MPIR_File_iread_shared_cdesc(fh_c, buf, count_c, datatype_c, request_c)
+        request%MPI_VAL = request_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_File_iread_shared_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/file_iwrite_at_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/file_iwrite_at_f08ts.F90
new file mode 100644
index 0000000..0575d05
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/file_iwrite_at_f08ts.F90
@@ -0,0 +1,44 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_File_iwrite_at_f08ts(fh, offset, buf, count, datatype, request, ierror)
+    use :: mpi_f08, only : MPI_File, MPI_Datatype, MPI_Request
+    use :: mpi_f08, only : MPI_OFFSET_KIND
+    use :: mpi_f08, only : MPI_File_f2c, MPI_File_c2f
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_File, c_Datatype, c_Request
+    use :: mpi_c_interface, only : MPIR_File_iwrite_at_cdesc
+
+    implicit none
+
+    type(MPI_File), intent(in) :: fh
+    integer(MPI_OFFSET_KIND), intent(in) :: offset
+    type(*), dimension(..), intent(in), asynchronous :: buf
+    integer, intent(in) :: count
+    type(MPI_Datatype), intent(in) :: datatype
+    type(MPI_Request), intent(out) :: request
+    integer, optional, intent(out) :: ierror
+
+    integer(c_File) :: fh_c
+    integer(MPI_OFFSET_KIND) :: offset_c
+    integer(c_int) :: count_c
+    integer(c_Datatype) :: datatype_c
+    integer(c_Request) :: request_c
+    integer(c_int) :: ierror_c
+
+    fh_c = MPI_File_f2c(fh%MPI_VAL)
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_File_iwrite_at_cdesc(fh_c, offset, buf, count, datatype%MPI_VAL, request%MPI_VAL)
+    else
+        offset_c = offset
+        count_c = count
+        datatype_c = datatype%MPI_VAL
+        ierror_c = MPIR_File_iwrite_at_cdesc(fh_c, offset_c, buf, count_c, datatype_c, request_c)
+        request%MPI_VAL = request_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_File_iwrite_at_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/file_iwrite_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/file_iwrite_f08ts.F90
new file mode 100644
index 0000000..1972174
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/file_iwrite_f08ts.F90
@@ -0,0 +1,40 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_File_iwrite_f08ts(fh, buf, count, datatype, request, ierror)
+    use :: mpi_f08, only : MPI_File, MPI_Datatype, MPI_Request
+    use :: mpi_f08, only : MPI_File_f2c, MPI_File_c2f
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_File, c_Datatype, c_Request
+    use :: mpi_c_interface, only : MPIR_File_iwrite_cdesc
+
+    implicit none
+
+    type(MPI_File), intent(in) :: fh
+    type(*), dimension(..), intent(in), asynchronous :: buf
+    integer, intent(in) :: count
+    type(MPI_Datatype), intent(in) :: datatype
+    type(MPI_Request), intent(out) :: request
+    integer, optional, intent(out) :: ierror
+
+    integer(c_File) :: fh_c
+    integer(c_int) :: count_c
+    integer(c_Datatype) :: datatype_c
+    integer(c_Request) :: request_c
+    integer(c_int) :: ierror_c
+
+    fh_c = MPI_File_f2c(fh%MPI_VAL)
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_File_iwrite_cdesc(fh_c, buf, count, datatype%MPI_VAL, request%MPI_VAL)
+    else
+        count_c = count
+        datatype_c = datatype%MPI_VAL
+        ierror_c = MPIR_File_iwrite_cdesc(fh_c, buf, count_c, datatype_c, request_c)
+        request%MPI_VAL = request_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_File_iwrite_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/file_iwrite_shared_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/file_iwrite_shared_f08ts.F90
new file mode 100644
index 0000000..947a655
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/file_iwrite_shared_f08ts.F90
@@ -0,0 +1,40 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_File_iwrite_shared_f08ts(fh, buf, count, datatype, request, ierror)
+    use :: mpi_f08, only : MPI_File, MPI_Datatype, MPI_Request
+    use :: mpi_f08, only : MPI_File_f2c, MPI_File_c2f
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_File, c_Datatype, c_Request
+    use :: mpi_c_interface, only : MPIR_File_iwrite_shared_cdesc
+
+    implicit none
+
+    type(*), dimension(..), intent(in), asynchronous :: buf
+    type(MPI_File), intent(in) :: fh
+    integer, intent(in) :: count
+    type(MPI_Datatype), intent(in) :: datatype
+    type(MPI_Request), intent(out) :: request
+    integer, optional, intent(out) :: ierror
+
+    integer(c_File) :: fh_c
+    integer(c_int) :: count_c
+    integer(c_Datatype) :: datatype_c
+    integer(c_Request) :: request_c
+    integer(c_int) :: ierror_c
+
+    fh_c = MPI_File_f2c(fh%MPI_VAL)
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_File_iwrite_shared_cdesc(fh_c, buf, count, datatype%MPI_VAL, request%MPI_VAL)
+    else
+        count_c = count
+        datatype_c = datatype%MPI_VAL
+        ierror_c = MPIR_File_iwrite_shared_cdesc(fh_c, buf, count_c, datatype_c, request_c)
+        request%MPI_VAL = request_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_File_iwrite_shared_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/file_open_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/file_open_f08ts.F90
new file mode 100644
index 0000000..37fa4a6
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/file_open_f08ts.F90
@@ -0,0 +1,44 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_File_open_f08(comm, filename, amode, info, fh, ierror)
+    use :: mpi_f08, only : MPI_Comm, MPI_Info, MPI_File
+    use :: mpi_f08, only : MPI_File_f2c, MPI_File_c2f
+    use, intrinsic :: iso_c_binding, only : c_int, c_char
+    use :: mpi_c_interface, only : c_Comm, c_Info, c_File
+    use :: mpi_c_interface, only : MPIR_File_open_c
+
+    use :: mpi_c_interface, only : MPIR_Fortran_string_f2c
+    implicit none
+
+    type(MPI_Comm), intent(in) :: comm
+    character(len=*), intent(in) :: filename
+    integer, intent(in) :: amode
+    type(MPI_Info), intent(in) :: info
+    type(MPI_File), intent(out) :: fh
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Comm) :: comm_c
+    character(kind=c_char) :: filename_c(len_trim(filename)+1)
+    integer(c_int) :: amode_c
+    integer(c_Info) :: info_c
+    integer(c_File) :: fh_c
+    integer(c_int) :: ierror_c
+
+    call MPIR_Fortran_string_f2c(filename, filename_c)
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_File_open_c(comm%MPI_VAL, filename_c, amode, info%MPI_VAL, fh_c)
+    else
+        comm_c = comm%MPI_VAL
+        amode_c = amode
+        info_c = info%MPI_VAL
+        ierror_c = MPIR_File_open_c(comm_c, filename_c, amode_c, info_c, fh_c)
+    end if
+
+    fh%MPI_VAL = MPI_File_c2f(fh_c)
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_File_open_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/file_preallocate_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/file_preallocate_f08ts.F90
new file mode 100644
index 0000000..ca296de
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/file_preallocate_f08ts.F90
@@ -0,0 +1,34 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_File_preallocate_f08(fh, size, ierror)
+    use :: mpi_f08, only : MPI_File
+    use :: mpi_f08, only : MPI_OFFSET_KIND
+    use :: mpi_f08, only : MPI_File_f2c, MPI_File_c2f
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_File
+    use :: mpi_c_interface, only : MPIR_File_preallocate_c
+
+    implicit none
+
+    type(MPI_File), intent(in) :: fh
+    integer(MPI_OFFSET_KIND), intent(in) :: size
+    integer, optional, intent(out) :: ierror
+
+    integer(c_File) :: fh_c
+    integer(MPI_OFFSET_KIND) :: size_c
+    integer(c_int) :: ierror_c
+
+    fh_c = MPI_File_f2c(fh%MPI_VAL)
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_File_preallocate_c(fh_c, size)
+    else
+        size_c = size
+        ierror_c = MPIR_File_preallocate_c(fh_c, size_c)
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_File_preallocate_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/file_read_all_begin_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/file_read_all_begin_f08ts.F90
new file mode 100644
index 0000000..e43c2ca
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/file_read_all_begin_f08ts.F90
@@ -0,0 +1,37 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_File_read_all_begin_f08ts(fh, buf, count, datatype, ierror)
+    use :: mpi_f08, only : MPI_File, MPI_Datatype
+    use :: mpi_f08, only : MPI_File_f2c, MPI_File_c2f
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_File, c_Datatype
+    use :: mpi_c_interface, only : MPIR_File_read_all_begin_cdesc
+
+    implicit none
+
+    type(MPI_File), intent(in) :: fh
+    type(*), dimension(..) :: buf
+    integer, intent(in) :: count
+    type(MPI_Datatype), intent(in) :: datatype
+    integer, optional, intent(out) :: ierror
+
+    integer(c_File) :: fh_c
+    integer(c_int) :: count_c
+    integer(c_Datatype) :: datatype_c
+    integer(c_int) :: ierror_c
+
+    fh_c = MPI_File_f2c(fh%MPI_VAL)
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_File_read_all_begin_cdesc(fh_c, buf, count, datatype%MPI_VAL)
+    else
+        count_c = count
+        datatype_c = datatype%MPI_VAL
+        ierror_c = MPIR_File_read_all_begin_cdesc(fh_c, buf, count_c, datatype_c)
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_File_read_all_begin_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/file_read_all_end_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/file_read_all_end_f08ts.F90
new file mode 100644
index 0000000..09e1b47
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/file_read_all_end_f08ts.F90
@@ -0,0 +1,37 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_File_read_all_end_f08ts(fh, buf, status, ierror)
+    use :: mpi_f08, only : MPI_File, MPI_Status
+    use, intrinsic :: iso_c_binding, only : c_loc, c_associated
+    use :: mpi_f08, only : MPI_STATUS_IGNORE, MPIR_C_MPI_STATUS_IGNORE, assignment(=)
+    use :: mpi_f08, only : MPI_File_f2c, MPI_File_c2f
+    use, intrinsic :: iso_c_binding, only : c_int, c_ptr
+    use :: mpi_c_interface, only : c_File
+    use :: mpi_c_interface, only : c_Status
+    use :: mpi_c_interface, only : MPIR_File_read_all_end_cdesc
+
+    implicit none
+
+    type(MPI_File), intent(in) :: fh
+    type(*), dimension(..) :: buf
+    type(MPI_Status), target :: status
+    integer, optional, intent(out) :: ierror
+
+    integer(c_File) :: fh_c
+    type(c_Status), target :: status_c
+    integer(c_int) :: ierror_c
+
+    fh_c = MPI_File_f2c(fh%MPI_VAL)
+    if (c_associated(c_loc(status), c_loc(MPI_STATUS_IGNORE))) then
+        ierror_c = MPIR_File_read_all_end_cdesc(fh_c, buf, MPIR_C_MPI_STATUS_IGNORE)
+    else
+        ierror_c = MPIR_File_read_all_end_cdesc(fh_c, buf, c_loc(status_c))
+        status = status_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_File_read_all_end_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/file_read_all_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/file_read_all_f08ts.F90
new file mode 100644
index 0000000..508ff94
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/file_read_all_f08ts.F90
@@ -0,0 +1,51 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_File_read_all_f08ts(fh, buf, count, datatype, status, ierror)
+    use :: mpi_f08, only : MPI_File, MPI_Datatype, MPI_Status
+    use, intrinsic :: iso_c_binding, only : c_loc, c_associated
+    use :: mpi_f08, only : MPI_STATUS_IGNORE, MPIR_C_MPI_STATUS_IGNORE, assignment(=)
+    use :: mpi_f08, only : MPI_File_f2c, MPI_File_c2f
+    use, intrinsic :: iso_c_binding, only : c_int, c_ptr
+    use :: mpi_c_interface, only : c_File, c_Datatype
+    use :: mpi_c_interface, only : c_Status
+    use :: mpi_c_interface, only : MPIR_File_read_all_cdesc
+
+    implicit none
+
+    type(MPI_File), intent(in) :: fh
+    type(*), dimension(..) :: buf
+    integer, intent(in) :: count
+    type(MPI_Datatype), intent(in) :: datatype
+    type(MPI_Status), target :: status
+    integer, optional, intent(out) :: ierror
+
+    integer(c_File) :: fh_c
+    integer(c_int) :: count_c
+    integer(c_Datatype) :: datatype_c
+    type(c_Status), target :: status_c
+    integer(c_int) :: ierror_c
+
+    fh_c = MPI_File_f2c(fh%MPI_VAL)
+    if (c_int == kind(0)) then
+        if (c_associated(c_loc(status), c_loc(MPI_STATUS_IGNORE))) then
+            ierror_c = MPIR_File_read_all_cdesc(fh_c, buf, count, datatype%MPI_VAL, MPIR_C_MPI_STATUS_IGNORE)
+        else
+            ierror_c = MPIR_File_read_all_cdesc(fh_c, buf, count, datatype%MPI_VAL, c_loc(status))
+        end if
+    else
+        count_c = count
+        datatype_c = datatype%MPI_VAL
+        if (c_associated(c_loc(status), c_loc(MPI_STATUS_IGNORE))) then
+            ierror_c = MPIR_File_read_all_cdesc(fh_c, buf, count_c, datatype_c, MPIR_C_MPI_STATUS_IGNORE)
+        else
+            ierror_c = MPIR_File_read_all_cdesc(fh_c, buf, count_c, datatype_c, c_loc(status_c))
+            status = status_c
+        end if
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_File_read_all_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/file_read_at_all_begin_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/file_read_at_all_begin_f08ts.F90
new file mode 100644
index 0000000..b59ade5
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/file_read_at_all_begin_f08ts.F90
@@ -0,0 +1,41 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_File_read_at_all_begin_f08ts(fh, offset, buf, count, datatype, ierror)
+    use :: mpi_f08, only : MPI_File, MPI_Datatype
+    use :: mpi_f08, only : MPI_OFFSET_KIND
+    use :: mpi_f08, only : MPI_File_f2c, MPI_File_c2f
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_File, c_Datatype
+    use :: mpi_c_interface, only : MPIR_File_read_at_all_begin_cdesc
+
+    implicit none
+
+    type(MPI_File), intent(in) :: fh
+    integer(MPI_OFFSET_KIND), intent(in) :: offset
+    type(*), dimension(..) :: buf
+    integer, intent(in) :: count
+    type(MPI_Datatype), intent(in) :: datatype
+    integer, optional, intent(out) :: ierror
+
+    integer(c_File) :: fh_c
+    integer(MPI_OFFSET_KIND) :: offset_c
+    integer(c_int) :: count_c
+    integer(c_Datatype) :: datatype_c
+    integer(c_int) :: ierror_c
+
+    fh_c = MPI_File_f2c(fh%MPI_VAL)
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_File_read_at_all_begin_cdesc(fh_c, offset, buf, count, datatype%MPI_VAL)
+    else
+        offset_c = offset
+        count_c = count
+        datatype_c = datatype%MPI_VAL
+        ierror_c = MPIR_File_read_at_all_begin_cdesc(fh_c, offset_c, buf, count_c, datatype_c)
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_File_read_at_all_begin_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/file_read_at_all_end_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/file_read_at_all_end_f08ts.F90
new file mode 100644
index 0000000..f2b0c11
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/file_read_at_all_end_f08ts.F90
@@ -0,0 +1,37 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_File_read_at_all_end_f08ts(fh, buf, status, ierror)
+    use :: mpi_f08, only : MPI_File, MPI_Status
+    use, intrinsic :: iso_c_binding, only : c_loc, c_associated
+    use :: mpi_f08, only : MPI_STATUS_IGNORE, MPIR_C_MPI_STATUS_IGNORE, assignment(=)
+    use :: mpi_f08, only : MPI_File_f2c, MPI_File_c2f
+    use, intrinsic :: iso_c_binding, only : c_int, c_ptr
+    use :: mpi_c_interface, only : c_File
+    use :: mpi_c_interface, only : c_Status
+    use :: mpi_c_interface, only : MPIR_File_read_at_all_end_cdesc
+
+    implicit none
+
+    type(MPI_File), intent(in) :: fh
+    type(*), dimension(..) :: buf
+    type(MPI_Status), target :: status
+    integer, optional, intent(out) :: ierror
+
+    integer(c_File) :: fh_c
+    type(c_Status), target :: status_c
+    integer(c_int) :: ierror_c
+
+    fh_c = MPI_File_f2c(fh%MPI_VAL)
+    if (c_associated(c_loc(status), c_loc(MPI_STATUS_IGNORE))) then
+        ierror_c = MPIR_File_read_at_all_end_cdesc(fh_c, buf, MPIR_C_MPI_STATUS_IGNORE)
+    else
+        ierror_c = MPIR_File_read_at_all_end_cdesc(fh_c, buf, c_loc(status_c))
+        status = status_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_File_read_at_all_end_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/file_read_at_all_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/file_read_at_all_f08ts.F90
new file mode 100644
index 0000000..7b50819
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/file_read_at_all_f08ts.F90
@@ -0,0 +1,55 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_File_read_at_all_f08ts(fh, offset, buf, count, datatype, status, ierror)
+    use :: mpi_f08, only : MPI_File, MPI_Datatype, MPI_Status
+    use :: mpi_f08, only : MPI_OFFSET_KIND
+    use, intrinsic :: iso_c_binding, only : c_loc, c_associated
+    use :: mpi_f08, only : MPI_STATUS_IGNORE, MPIR_C_MPI_STATUS_IGNORE, assignment(=)
+    use :: mpi_f08, only : MPI_File_f2c, MPI_File_c2f
+    use, intrinsic :: iso_c_binding, only : c_int, c_ptr
+    use :: mpi_c_interface, only : c_File, c_Datatype
+    use :: mpi_c_interface, only : c_Status
+    use :: mpi_c_interface, only : MPIR_File_read_at_all_cdesc
+
+    implicit none
+
+    type(MPI_File), intent(in) :: fh
+    integer(MPI_OFFSET_KIND), intent(in) :: offset
+    type(*), dimension(..) :: buf
+    integer, intent(in) :: count
+    type(MPI_Datatype), intent(in) :: datatype
+    type(MPI_Status), target :: status
+    integer, optional, intent(out) :: ierror
+
+    integer(c_File) :: fh_c
+    integer(MPI_OFFSET_KIND) :: offset_c
+    integer(c_int) :: count_c
+    integer(c_Datatype) :: datatype_c
+    type(c_Status), target :: status_c
+    integer(c_int) :: ierror_c
+
+    fh_c = MPI_File_f2c(fh%MPI_VAL)
+    if (c_int == kind(0)) then
+        if (c_associated(c_loc(status), c_loc(MPI_STATUS_IGNORE))) then
+            ierror_c = MPIR_File_read_at_all_cdesc(fh_c, offset, buf, count, datatype%MPI_VAL, MPIR_C_MPI_STATUS_IGNORE)
+        else
+            ierror_c = MPIR_File_read_at_all_cdesc(fh_c, offset, buf, count, datatype%MPI_VAL, c_loc(status))
+        end if
+    else
+        offset_c = offset
+        count_c = count
+        datatype_c = datatype%MPI_VAL
+        if (c_associated(c_loc(status), c_loc(MPI_STATUS_IGNORE))) then
+            ierror_c = MPIR_File_read_at_all_cdesc(fh_c, offset_c, buf, count_c, datatype_c, MPIR_C_MPI_STATUS_IGNORE)
+        else
+            ierror_c = MPIR_File_read_at_all_cdesc(fh_c, offset_c, buf, count_c, datatype_c, c_loc(status_c))
+            status = status_c
+        end if
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_File_read_at_all_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/file_read_at_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/file_read_at_f08ts.F90
new file mode 100644
index 0000000..6e287a9
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/file_read_at_f08ts.F90
@@ -0,0 +1,55 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_File_read_at_f08ts(fh, offset, buf, count, datatype, status, ierror)
+    use :: mpi_f08, only : MPI_File, MPI_Datatype, MPI_Status
+    use :: mpi_f08, only : MPI_OFFSET_KIND
+    use, intrinsic :: iso_c_binding, only : c_loc, c_associated
+    use :: mpi_f08, only : MPI_STATUS_IGNORE, MPIR_C_MPI_STATUS_IGNORE, assignment(=)
+    use :: mpi_f08, only : MPI_File_f2c, MPI_File_c2f
+    use, intrinsic :: iso_c_binding, only : c_int, c_ptr
+    use :: mpi_c_interface, only : c_File, c_Datatype
+    use :: mpi_c_interface, only : c_Status
+    use :: mpi_c_interface, only : MPIR_File_read_at_cdesc
+
+    implicit none
+
+    type(MPI_File), intent(in) :: fh
+    integer(MPI_OFFSET_KIND), intent(in) :: offset
+    type(*), dimension(..) :: buf
+    integer, intent(in) :: count
+    type(MPI_Datatype), intent(in) :: datatype
+    type(MPI_Status), target :: status
+    integer, optional, intent(out) :: ierror
+
+    integer(c_File) :: fh_c
+    integer(MPI_OFFSET_KIND) :: offset_c
+    integer(c_int) :: count_c
+    integer(c_Datatype) :: datatype_c
+    type(c_Status), target :: status_c
+    integer(c_int) :: ierror_c
+
+    fh_c = MPI_File_f2c(fh%MPI_VAL)
+    if (c_int == kind(0)) then
+        if (c_associated(c_loc(status), c_loc(MPI_STATUS_IGNORE))) then
+            ierror_c = MPIR_File_read_at_cdesc(fh_c, offset, buf, count, datatype%MPI_VAL, MPIR_C_MPI_STATUS_IGNORE)
+        else
+            ierror_c = MPIR_File_read_at_cdesc(fh_c, offset, buf, count, datatype%MPI_VAL, c_loc(status))
+        end if
+    else
+        offset_c = offset
+        count_c = count
+        datatype_c = datatype%MPI_VAL
+        if (c_associated(c_loc(status), c_loc(MPI_STATUS_IGNORE))) then
+            ierror_c = MPIR_File_read_at_cdesc(fh_c, offset_c, buf, count_c, datatype_c, MPIR_C_MPI_STATUS_IGNORE)
+        else
+            ierror_c = MPIR_File_read_at_cdesc(fh_c, offset_c, buf, count_c, datatype_c, c_loc(status_c))
+            status = status_c
+        end if
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_File_read_at_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/file_read_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/file_read_f08ts.F90
new file mode 100644
index 0000000..84a14c9
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/file_read_f08ts.F90
@@ -0,0 +1,51 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_File_read_f08ts(fh, buf, count, datatype, status, ierror)
+    use :: mpi_f08, only : MPI_File, MPI_Datatype, MPI_Status
+    use, intrinsic :: iso_c_binding, only : c_loc, c_associated
+    use :: mpi_f08, only : MPI_STATUS_IGNORE, MPIR_C_MPI_STATUS_IGNORE, assignment(=)
+    use :: mpi_f08, only : MPI_File_f2c, MPI_File_c2f
+    use, intrinsic :: iso_c_binding, only : c_int, c_ptr
+    use :: mpi_c_interface, only : c_File, c_Datatype
+    use :: mpi_c_interface, only : c_Status
+    use :: mpi_c_interface, only : MPIR_File_read_cdesc
+
+    implicit none
+
+    type(MPI_File), intent(in) :: fh
+    type(*), dimension(..) :: buf
+    integer, intent(in) :: count
+    type(MPI_Datatype), intent(in) :: datatype
+    type(MPI_Status), target :: status
+    integer, optional, intent(out) :: ierror
+
+    integer(c_File) :: fh_c
+    integer(c_int) :: count_c
+    integer(c_Datatype) :: datatype_c
+    type(c_Status), target :: status_c
+    integer(c_int) :: ierror_c
+
+    fh_c = MPI_File_f2c(fh%MPI_VAL)
+    if (c_int == kind(0)) then
+        if (c_associated(c_loc(status), c_loc(MPI_STATUS_IGNORE))) then
+            ierror_c = MPIR_File_read_cdesc(fh_c, buf, count, datatype%MPI_VAL, MPIR_C_MPI_STATUS_IGNORE)
+        else
+            ierror_c = MPIR_File_read_cdesc(fh_c, buf, count, datatype%MPI_VAL, c_loc(status))
+        end if
+    else
+        count_c = count
+        datatype_c = datatype%MPI_VAL
+        if (c_associated(c_loc(status), c_loc(MPI_STATUS_IGNORE))) then
+            ierror_c = MPIR_File_read_cdesc(fh_c, buf, count_c, datatype_c, MPIR_C_MPI_STATUS_IGNORE)
+        else
+            ierror_c = MPIR_File_read_cdesc(fh_c, buf, count_c, datatype_c, c_loc(status_c))
+            status = status_c
+        end if
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_File_read_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/file_read_ordered_begin_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/file_read_ordered_begin_f08ts.F90
new file mode 100644
index 0000000..77c4d57
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/file_read_ordered_begin_f08ts.F90
@@ -0,0 +1,37 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_File_read_ordered_begin_f08ts(fh, buf, count, datatype, ierror)
+    use :: mpi_f08, only : MPI_File, MPI_Datatype
+    use :: mpi_f08, only : MPI_File_f2c, MPI_File_c2f
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_File, c_Datatype
+    use :: mpi_c_interface, only : MPIR_File_read_ordered_begin_cdesc
+
+    implicit none
+
+    type(MPI_File), intent(in) :: fh
+    type(*), dimension(..) :: buf
+    integer, intent(in) :: count
+    type(MPI_Datatype), intent(in) :: datatype
+    integer, optional, intent(out) :: ierror
+
+    integer(c_File) :: fh_c
+    integer(c_int) :: count_c
+    integer(c_Datatype) :: datatype_c
+    integer(c_int) :: ierror_c
+
+    fh_c = MPI_File_f2c(fh%MPI_VAL)
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_File_read_ordered_begin_cdesc(fh_c, buf, count, datatype%MPI_VAL)
+    else
+        count_c = count
+        datatype_c = datatype%MPI_VAL
+        ierror_c = MPIR_File_read_ordered_begin_cdesc(fh_c, buf, count_c, datatype_c)
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_File_read_ordered_begin_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/file_read_ordered_end_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/file_read_ordered_end_f08ts.F90
new file mode 100644
index 0000000..10f02a3
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/file_read_ordered_end_f08ts.F90
@@ -0,0 +1,37 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_File_read_ordered_end_f08ts(fh, buf, status, ierror)
+    use :: mpi_f08, only : MPI_File, MPI_Status
+    use, intrinsic :: iso_c_binding, only : c_loc, c_associated
+    use :: mpi_f08, only : MPI_STATUS_IGNORE, MPIR_C_MPI_STATUS_IGNORE, assignment(=)
+    use :: mpi_f08, only : MPI_File_f2c, MPI_File_c2f
+    use, intrinsic :: iso_c_binding, only : c_int, c_ptr
+    use :: mpi_c_interface, only : c_File
+    use :: mpi_c_interface, only : c_Status
+    use :: mpi_c_interface, only : MPIR_File_read_ordered_end_cdesc
+
+    implicit none
+
+    type(MPI_File), intent(in) :: fh
+    type(*), dimension(..) :: buf
+    type(MPI_Status), target :: status
+    integer, optional, intent(out) :: ierror
+
+    integer(c_File) :: fh_c
+    type(c_Status), target :: status_c
+    integer(c_int) :: ierror_c
+
+    fh_c = MPI_File_f2c(fh%MPI_VAL)
+    if (c_associated(c_loc(status), c_loc(MPI_STATUS_IGNORE))) then
+        ierror_c = MPIR_File_read_ordered_end_cdesc(fh_c, buf, MPIR_C_MPI_STATUS_IGNORE)
+    else
+        ierror_c = MPIR_File_read_ordered_end_cdesc(fh_c, buf, c_loc(status_c))
+        status = status_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_File_read_ordered_end_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/file_read_ordered_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/file_read_ordered_f08ts.F90
new file mode 100644
index 0000000..55066a9
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/file_read_ordered_f08ts.F90
@@ -0,0 +1,51 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_File_read_ordered_f08ts(fh, buf, count, datatype, status, ierror)
+    use :: mpi_f08, only : MPI_File, MPI_Datatype, MPI_Status
+    use, intrinsic :: iso_c_binding, only : c_loc, c_associated
+    use :: mpi_f08, only : MPI_STATUS_IGNORE, MPIR_C_MPI_STATUS_IGNORE, assignment(=)
+    use :: mpi_f08, only : MPI_File_f2c, MPI_File_c2f
+    use, intrinsic :: iso_c_binding, only : c_int, c_ptr
+    use :: mpi_c_interface, only : c_File, c_Datatype
+    use :: mpi_c_interface, only : c_Status
+    use :: mpi_c_interface, only : MPIR_File_read_ordered_cdesc
+
+    implicit none
+
+    type(MPI_File), intent(in) :: fh
+    type(*), dimension(..) :: buf
+    integer, intent(in) :: count
+    type(MPI_Datatype), intent(in) :: datatype
+    type(MPI_Status), target :: status
+    integer, optional, intent(out) :: ierror
+
+    integer(c_File) :: fh_c
+    integer(c_int) :: count_c
+    integer(c_Datatype) :: datatype_c
+    type(c_Status), target :: status_c
+    integer(c_int) :: ierror_c
+
+    fh_c = MPI_File_f2c(fh%MPI_VAL)
+    if (c_int == kind(0)) then
+        if (c_associated(c_loc(status), c_loc(MPI_STATUS_IGNORE))) then
+            ierror_c = MPIR_File_read_ordered_cdesc(fh_c, buf, count, datatype%MPI_VAL, MPIR_C_MPI_STATUS_IGNORE)
+        else
+            ierror_c = MPIR_File_read_ordered_cdesc(fh_c, buf, count, datatype%MPI_VAL, c_loc(status))
+        end if
+    else
+        count_c = count
+        datatype_c = datatype%MPI_VAL
+        if (c_associated(c_loc(status), c_loc(MPI_STATUS_IGNORE))) then
+            ierror_c = MPIR_File_read_ordered_cdesc(fh_c, buf, count_c, datatype_c, MPIR_C_MPI_STATUS_IGNORE)
+        else
+            ierror_c = MPIR_File_read_ordered_cdesc(fh_c, buf, count_c, datatype_c, c_loc(status_c))
+            status = status_c
+        end if
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_File_read_ordered_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/file_read_shared_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/file_read_shared_f08ts.F90
new file mode 100644
index 0000000..779c65b
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/file_read_shared_f08ts.F90
@@ -0,0 +1,51 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_File_read_shared_f08ts(fh, buf, count, datatype, status, ierror)
+    use :: mpi_f08, only : MPI_File, MPI_Datatype, MPI_Status
+    use, intrinsic :: iso_c_binding, only : c_loc, c_associated
+    use :: mpi_f08, only : MPI_STATUS_IGNORE, MPIR_C_MPI_STATUS_IGNORE, assignment(=)
+    use :: mpi_f08, only : MPI_File_f2c, MPI_File_c2f
+    use, intrinsic :: iso_c_binding, only : c_int, c_ptr
+    use :: mpi_c_interface, only : c_File, c_Datatype
+    use :: mpi_c_interface, only : c_Status
+    use :: mpi_c_interface, only : MPIR_File_read_shared_cdesc
+
+    implicit none
+
+    type(MPI_File), intent(in) :: fh
+    type(*), dimension(..) :: buf
+    integer, intent(in) :: count
+    type(MPI_Datatype), intent(in) :: datatype
+    type(MPI_Status), target :: status
+    integer, optional, intent(out) :: ierror
+
+    integer(c_File) :: fh_c
+    integer(c_int) :: count_c
+    integer(c_Datatype) :: datatype_c
+    type(c_Status), target :: status_c
+    integer(c_int) :: ierror_c
+
+    fh_c = MPI_File_f2c(fh%MPI_VAL)
+    if (c_int == kind(0)) then
+        if (c_associated(c_loc(status), c_loc(MPI_STATUS_IGNORE))) then
+            ierror_c = MPIR_File_read_shared_cdesc(fh_c, buf, count, datatype%MPI_VAL, MPIR_C_MPI_STATUS_IGNORE)
+        else
+            ierror_c = MPIR_File_read_shared_cdesc(fh_c, buf, count, datatype%MPI_VAL, c_loc(status))
+        end if
+    else
+        count_c = count
+        datatype_c = datatype%MPI_VAL
+        if (c_associated(c_loc(status), c_loc(MPI_STATUS_IGNORE))) then
+            ierror_c = MPIR_File_read_shared_cdesc(fh_c, buf, count_c, datatype_c, MPIR_C_MPI_STATUS_IGNORE)
+        else
+            ierror_c = MPIR_File_read_shared_cdesc(fh_c, buf, count_c, datatype_c, c_loc(status_c))
+            status = status_c
+        end if
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_File_read_shared_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/file_seek_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/file_seek_f08ts.F90
new file mode 100644
index 0000000..7d6cab7
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/file_seek_f08ts.F90
@@ -0,0 +1,37 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_File_seek_f08(fh, offset, whence, ierror)
+    use :: mpi_f08, only : MPI_File
+    use :: mpi_f08, only : MPI_OFFSET_KIND
+    use :: mpi_f08, only : MPI_File_f2c, MPI_File_c2f
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_File
+    use :: mpi_c_interface, only : MPIR_File_seek_c
+
+    implicit none
+
+    type(MPI_File), intent(in) :: fh
+    integer(MPI_OFFSET_KIND), intent(in) :: offset
+    integer, intent(in) :: whence
+    integer, optional, intent(out) :: ierror
+
+    integer(c_File) :: fh_c
+    integer(MPI_OFFSET_KIND) :: offset_c
+    integer(c_int) :: whence_c
+    integer(c_int) :: ierror_c
+
+    fh_c = MPI_File_f2c(fh%MPI_VAL)
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_File_seek_c(fh_c, offset, whence)
+    else
+        offset_c = offset
+        whence_c = whence
+        ierror_c = MPIR_File_seek_c(fh_c, offset_c, whence_c)
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_File_seek_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/file_seek_shared_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/file_seek_shared_f08ts.F90
new file mode 100644
index 0000000..b4d4d64
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/file_seek_shared_f08ts.F90
@@ -0,0 +1,37 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_File_seek_shared_f08(fh, offset, whence, ierror)
+    use :: mpi_f08, only : MPI_File
+    use :: mpi_f08, only : MPI_OFFSET_KIND
+    use :: mpi_f08, only : MPI_File_f2c, MPI_File_c2f
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_File
+    use :: mpi_c_interface, only : MPIR_File_seek_shared_c
+
+    implicit none
+
+    type(MPI_File), intent(in) :: fh
+    integer(MPI_OFFSET_KIND), intent(in) :: offset
+    integer, intent(in) :: whence
+    integer, optional, intent(out) :: ierror
+
+    integer(c_File) :: fh_c
+    integer(MPI_OFFSET_KIND) :: offset_c
+    integer(c_int) :: whence_c
+    integer(c_int) :: ierror_c
+
+    fh_c = MPI_File_f2c(fh%MPI_VAL)
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_File_seek_shared_c(fh_c, offset, whence)
+    else
+        offset_c = offset
+        whence_c = whence
+        ierror_c = MPIR_File_seek_shared_c(fh_c, offset_c, whence_c)
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_File_seek_shared_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/file_set_atomicity_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/file_set_atomicity_f08ts.F90
new file mode 100644
index 0000000..7ac95c2
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/file_set_atomicity_f08ts.F90
@@ -0,0 +1,29 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_File_set_atomicity_f08(fh, flag, ierror)
+    use :: mpi_f08, only : MPI_File
+    use :: mpi_f08, only : MPI_File_f2c, MPI_File_c2f
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_File
+    use :: mpi_c_interface, only : MPIR_File_set_atomicity_c
+
+    implicit none
+
+    type(MPI_File), intent(in) :: fh
+    logical, intent(in) :: flag
+    integer, optional, intent(out) :: ierror
+
+    integer(c_File) :: fh_c
+    integer(c_int) :: flag_c
+    integer(c_int) :: ierror_c
+
+    fh_c = MPI_File_f2c(fh%MPI_VAL)
+    flag_c = merge(1, 0, flag)
+    ierror_c = MPIR_File_set_atomicity_c(fh_c, flag_c)
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_File_set_atomicity_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/file_set_errhandler_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/file_set_errhandler_f08ts.F90
new file mode 100644
index 0000000..0489ee2
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/file_set_errhandler_f08ts.F90
@@ -0,0 +1,33 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_File_set_errhandler_f08(file, errhandler, ierror)
+    use :: mpi_f08, only : MPI_File, MPI_Errhandler
+    use :: mpi_f08, only : MPI_File_f2c, MPI_File_c2f
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_File, c_Errhandler
+    use :: mpi_c_interface, only : MPIR_File_set_errhandler_c
+
+    implicit none
+
+    type(MPI_File), intent(in) :: file
+    type(MPI_Errhandler), intent(in) :: errhandler
+    integer, optional, intent(out) :: ierror
+
+    integer(c_File) :: file_c
+    integer(c_Errhandler) :: errhandler_c
+    integer(c_int) :: ierror_c
+
+    file_c = MPI_File_f2c(file%MPI_VAL)
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_File_set_errhandler_c(file_c, errhandler%MPI_VAL)
+    else
+        errhandler_c = errhandler%MPI_VAL
+        ierror_c = MPIR_File_set_errhandler_c(file_c, errhandler_c)
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_File_set_errhandler_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/file_set_info_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/file_set_info_f08ts.F90
new file mode 100644
index 0000000..71934a6
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/file_set_info_f08ts.F90
@@ -0,0 +1,33 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_File_set_info_f08(fh, info, ierror)
+    use :: mpi_f08, only : MPI_File, MPI_Info
+    use :: mpi_f08, only : MPI_File_f2c, MPI_File_c2f
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_File, c_Info
+    use :: mpi_c_interface, only : MPIR_File_set_info_c
+
+    implicit none
+
+    type(MPI_File), intent(in) :: fh
+    type(MPI_Info), intent(in) :: info
+    integer, optional, intent(out) :: ierror
+
+    integer(c_File) :: fh_c
+    integer(c_Info) :: info_c
+    integer(c_int) :: ierror_c
+
+    fh_c = MPI_File_f2c(fh%MPI_VAL)
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_File_set_info_c(fh_c, info%MPI_VAL)
+    else
+        info_c = info%MPI_VAL
+        ierror_c = MPIR_File_set_info_c(fh_c, info_c)
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_File_set_info_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/file_set_size_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/file_set_size_f08ts.F90
new file mode 100644
index 0000000..cbe3b38
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/file_set_size_f08ts.F90
@@ -0,0 +1,34 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_File_set_size_f08(fh, size, ierror)
+    use :: mpi_f08, only : MPI_File
+    use :: mpi_f08, only : MPI_OFFSET_KIND
+    use :: mpi_f08, only : MPI_File_f2c, MPI_File_c2f
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_File
+    use :: mpi_c_interface, only : MPIR_File_set_size_c
+
+    implicit none
+
+    type(MPI_File), intent(in) :: fh
+    integer(MPI_OFFSET_KIND), intent(in) :: size
+    integer, optional, intent(out) :: ierror
+
+    integer(c_File) :: fh_c
+    integer(MPI_OFFSET_KIND) :: size_c
+    integer(c_int) :: ierror_c
+
+    fh_c = MPI_File_f2c(fh%MPI_VAL)
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_File_set_size_c(fh_c, size)
+    else
+        size_c = size
+        ierror_c = MPIR_File_set_size_c(fh_c, size_c)
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_File_set_size_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/file_set_view_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/file_set_view_f08ts.F90
new file mode 100644
index 0000000..95e73a4
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/file_set_view_f08ts.F90
@@ -0,0 +1,48 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_File_set_view_f08(fh, disp, etype, filetype, datarep, info, ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_char
+    use :: mpi_f08, only : MPI_File, MPI_Datatype, MPI_Info
+    use :: mpi_f08, only : MPI_OFFSET_KIND
+    use :: mpi_f08, only : MPI_File_f2c, MPI_File_c2f
+    use :: mpi_c_interface, only : c_File, c_Datatype, c_Info
+    use :: mpi_c_interface, only : MPIR_File_set_view_c
+    use :: mpi_c_interface, only : MPIR_Fortran_string_f2c
+
+    implicit none
+
+    type(MPI_File), intent(in) :: fh
+    integer(MPI_OFFSET_KIND), intent(in) :: disp
+    type(MPI_Datatype), intent(in) :: etype
+    type(MPI_Datatype), intent(in) :: filetype
+    character(len=*), intent(in) :: datarep
+    type(MPI_Info), intent(in) :: info
+    integer, optional, intent(out) :: ierror
+
+    integer(c_File) :: fh_c
+    integer(MPI_OFFSET_KIND) :: disp_c
+    integer(c_Datatype) :: etype_c
+    integer(c_Datatype) :: filetype_c
+    character(kind=c_char) :: datarep_c(len_trim(datarep)+1)
+    integer(c_Info) :: info_c
+    integer(c_int) :: ierror_c
+
+    fh_c = MPI_File_f2c(fh%MPI_VAL)
+    call MPIR_Fortran_string_f2c(datarep, datarep_c)
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_File_set_view_c(fh_c, disp, etype%MPI_VAL, filetype%MPI_VAL, datarep_c, info%MPI_VAL)
+    else
+        disp_c = disp
+        etype_c = etype%MPI_VAL
+        filetype_c = filetype%MPI_VAL
+        info_c = info%MPI_VAL
+        ierror_c = MPIR_File_set_view_c(fh_c, disp_c, etype_c, filetype_c, datarep_c, info_c)
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_File_set_view_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/file_sync_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/file_sync_f08ts.F90
new file mode 100644
index 0000000..ce54256
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/file_sync_f08ts.F90
@@ -0,0 +1,26 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_File_sync_f08(fh, ierror)
+    use :: mpi_f08, only : MPI_File
+    use :: mpi_f08, only : MPI_File_f2c, MPI_File_c2f
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_File
+    use :: mpi_c_interface, only : MPIR_File_sync_c
+
+    implicit none
+
+    type(MPI_File), intent(in) :: fh
+    integer, optional, intent(out) :: ierror
+
+    integer(c_File) :: fh_c
+    integer(c_int) :: ierror_c
+
+    fh_c = MPI_File_f2c(fh%MPI_VAL)
+    ierror_c = MPIR_File_sync_c(fh_c)
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_File_sync_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/file_write_all_begin_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/file_write_all_begin_f08ts.F90
new file mode 100644
index 0000000..8df8d83
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/file_write_all_begin_f08ts.F90
@@ -0,0 +1,37 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_File_write_all_begin_f08ts(fh, buf, count, datatype, ierror)
+    use :: mpi_f08, only : MPI_File, MPI_Datatype
+    use :: mpi_f08, only : MPI_File_f2c, MPI_File_c2f
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_File, c_Datatype
+    use :: mpi_c_interface, only : MPIR_File_write_all_begin_cdesc
+
+    implicit none
+
+    type(MPI_File), intent(in) :: fh
+    type(*), dimension(..), intent(in) :: buf
+    integer, intent(in) :: count
+    type(MPI_Datatype), intent(in) :: datatype
+    integer, optional, intent(out) :: ierror
+
+    integer(c_File) :: fh_c
+    integer(c_int) :: count_c
+    integer(c_Datatype) :: datatype_c
+    integer(c_int) :: ierror_c
+
+    fh_c = MPI_File_f2c(fh%MPI_VAL)
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_File_write_all_begin_cdesc(fh_c, buf, count, datatype%MPI_VAL)
+    else
+        count_c = count
+        datatype_c = datatype%MPI_VAL
+        ierror_c = MPIR_File_write_all_begin_cdesc(fh_c, buf, count_c, datatype_c)
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_File_write_all_begin_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/file_write_all_end_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/file_write_all_end_f08ts.F90
new file mode 100644
index 0000000..5ca6ada
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/file_write_all_end_f08ts.F90
@@ -0,0 +1,37 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_File_write_all_end_f08ts(fh, buf, status, ierror)
+    use :: mpi_f08, only : MPI_File, MPI_Status
+    use, intrinsic :: iso_c_binding, only : c_loc, c_associated
+    use :: mpi_f08, only : MPI_STATUS_IGNORE, MPIR_C_MPI_STATUS_IGNORE, assignment(=)
+    use :: mpi_f08, only : MPI_File_f2c, MPI_File_c2f
+    use, intrinsic :: iso_c_binding, only : c_int, c_ptr
+    use :: mpi_c_interface, only : c_File
+    use :: mpi_c_interface, only : c_Status
+    use :: mpi_c_interface, only : MPIR_File_write_all_end_cdesc
+
+    implicit none
+
+    type(MPI_File), intent(in) :: fh
+    type(*), dimension(..), intent(in) :: buf
+    type(MPI_Status), target :: status
+    integer, optional, intent(out) :: ierror
+
+    integer(c_File) :: fh_c
+    type(c_Status), target :: status_c
+    integer(c_int) :: ierror_c
+
+    fh_c = MPI_File_f2c(fh%MPI_VAL)
+    if (c_associated(c_loc(status), c_loc(MPI_STATUS_IGNORE))) then
+        ierror_c = MPIR_File_write_all_end_cdesc(fh_c, buf, MPIR_C_MPI_STATUS_IGNORE)
+    else
+        ierror_c = MPIR_File_write_all_end_cdesc(fh_c, buf, c_loc(status_c))
+        status = status_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_File_write_all_end_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/file_write_all_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/file_write_all_f08ts.F90
new file mode 100644
index 0000000..32cc71e
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/file_write_all_f08ts.F90
@@ -0,0 +1,51 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_File_write_all_f08ts(fh, buf, count, datatype, status, ierror)
+    use :: mpi_f08, only : MPI_File, MPI_Datatype, MPI_Status
+    use, intrinsic :: iso_c_binding, only : c_loc, c_associated
+    use :: mpi_f08, only : MPI_STATUS_IGNORE, MPIR_C_MPI_STATUS_IGNORE, assignment(=)
+    use :: mpi_f08, only : MPI_File_f2c, MPI_File_c2f
+    use, intrinsic :: iso_c_binding, only : c_int, c_ptr
+    use :: mpi_c_interface, only : c_File, c_Datatype
+    use :: mpi_c_interface, only : c_Status
+    use :: mpi_c_interface, only : MPIR_File_write_all_cdesc
+
+    implicit none
+
+    type(MPI_File), intent(in) :: fh
+    type(*), dimension(..), intent(in) :: buf
+    integer, intent(in) :: count
+    type(MPI_Datatype), intent(in) :: datatype
+    type(MPI_Status), target :: status
+    integer, optional, intent(out) :: ierror
+
+    integer(c_File) :: fh_c
+    integer(c_int) :: count_c
+    integer(c_Datatype) :: datatype_c
+    type(c_Status), target :: status_c
+    integer(c_int) :: ierror_c
+
+    fh_c = MPI_File_f2c(fh%MPI_VAL)
+    if (c_int == kind(0)) then
+        if (c_associated(c_loc(status), c_loc(MPI_STATUS_IGNORE))) then
+            ierror_c = MPIR_File_write_all_cdesc(fh_c, buf, count, datatype%MPI_VAL, MPIR_C_MPI_STATUS_IGNORE)
+        else
+            ierror_c = MPIR_File_write_all_cdesc(fh_c, buf, count, datatype%MPI_VAL, c_loc(status))
+        end if
+    else
+        count_c = count
+        datatype_c = datatype%MPI_VAL
+        if (c_associated(c_loc(status), c_loc(MPI_STATUS_IGNORE))) then
+            ierror_c = MPIR_File_write_all_cdesc(fh_c, buf, count_c, datatype_c, MPIR_C_MPI_STATUS_IGNORE)
+        else
+            ierror_c = MPIR_File_write_all_cdesc(fh_c, buf, count_c, datatype_c, c_loc(status_c))
+            status = status_c
+        end if
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_File_write_all_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/file_write_at_all_begin_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/file_write_at_all_begin_f08ts.F90
new file mode 100644
index 0000000..913c80e
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/file_write_at_all_begin_f08ts.F90
@@ -0,0 +1,41 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_File_write_at_all_begin_f08ts(fh, offset, buf, count, datatype, ierror)
+    use :: mpi_f08, only : MPI_File, MPI_Datatype
+    use :: mpi_f08, only : MPI_OFFSET_KIND
+    use :: mpi_f08, only : MPI_File_f2c, MPI_File_c2f
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_File, c_Datatype
+    use :: mpi_c_interface, only : MPIR_File_write_at_all_begin_cdesc
+
+    implicit none
+
+    type(MPI_File), intent(in) :: fh
+    integer(MPI_OFFSET_KIND), intent(in) :: offset
+    type(*), dimension(..), intent(in) :: buf
+    integer, intent(in) :: count
+    type(MPI_Datatype), intent(in) :: datatype
+    integer, optional, intent(out) :: ierror
+
+    integer(c_File) :: fh_c
+    integer(MPI_OFFSET_KIND) :: offset_c
+    integer(c_int) :: count_c
+    integer(c_Datatype) :: datatype_c
+    integer(c_int) :: ierror_c
+
+    fh_c = MPI_File_f2c(fh%MPI_VAL)
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_File_write_at_all_begin_cdesc(fh_c, offset, buf, count, datatype%MPI_VAL)
+    else
+        offset_c = offset
+        count_c = count
+        datatype_c = datatype%MPI_VAL
+        ierror_c = MPIR_File_write_at_all_begin_cdesc(fh_c, offset_c, buf, count_c, datatype_c)
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_File_write_at_all_begin_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/file_write_at_all_end_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/file_write_at_all_end_f08ts.F90
new file mode 100644
index 0000000..49ef60f
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/file_write_at_all_end_f08ts.F90
@@ -0,0 +1,37 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_File_write_at_all_end_f08ts(fh, buf, status, ierror)
+    use :: mpi_f08, only : MPI_File, MPI_Status
+    use, intrinsic :: iso_c_binding, only : c_loc, c_associated
+    use :: mpi_f08, only : MPI_STATUS_IGNORE, MPIR_C_MPI_STATUS_IGNORE, assignment(=)
+    use :: mpi_f08, only : MPI_File_f2c, MPI_File_c2f
+    use, intrinsic :: iso_c_binding, only : c_int, c_ptr
+    use :: mpi_c_interface, only : c_File
+    use :: mpi_c_interface, only : c_Status
+    use :: mpi_c_interface, only : MPIR_File_write_at_all_end_cdesc
+
+    implicit none
+
+    type(MPI_File), intent(in) :: fh
+    type(*), dimension(..), intent(in) :: buf
+    type(MPI_Status), target :: status
+    integer, optional, intent(out) :: ierror
+
+    integer(c_File) :: fh_c
+    type(c_Status), target :: status_c
+    integer(c_int) :: ierror_c
+
+    fh_c = MPI_File_f2c(fh%MPI_VAL)
+    if (c_associated(c_loc(status), c_loc(MPI_STATUS_IGNORE))) then
+        ierror_c = MPIR_File_write_at_all_end_cdesc(fh_c, buf, MPIR_C_MPI_STATUS_IGNORE)
+    else
+        ierror_c = MPIR_File_write_at_all_end_cdesc(fh_c, buf, c_loc(status_c))
+        status = status_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_File_write_at_all_end_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/file_write_at_all_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/file_write_at_all_f08ts.F90
new file mode 100644
index 0000000..e83e759
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/file_write_at_all_f08ts.F90
@@ -0,0 +1,55 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_File_write_at_all_f08ts(fh, offset, buf, count, datatype, status, ierror)
+    use :: mpi_f08, only : MPI_File, MPI_Datatype, MPI_Status
+    use :: mpi_f08, only : MPI_OFFSET_KIND
+    use, intrinsic :: iso_c_binding, only : c_loc, c_associated
+    use :: mpi_f08, only : MPI_STATUS_IGNORE, MPIR_C_MPI_STATUS_IGNORE, assignment(=)
+    use :: mpi_f08, only : MPI_File_f2c, MPI_File_c2f
+    use, intrinsic :: iso_c_binding, only : c_int, c_ptr
+    use :: mpi_c_interface, only : c_File, c_Datatype
+    use :: mpi_c_interface, only : c_Status
+    use :: mpi_c_interface, only : MPIR_File_write_at_all_cdesc
+
+    implicit none
+
+    type(MPI_File), intent(in) :: fh
+    integer(MPI_OFFSET_KIND), intent(in) :: offset
+    type(*), dimension(..) :: buf
+    integer, intent(in) :: count
+    type(MPI_Datatype), intent(in) :: datatype
+    type(MPI_Status), target :: status
+    integer, optional, intent(out) :: ierror
+
+    integer(c_File) :: fh_c
+    integer(MPI_OFFSET_KIND) :: offset_c
+    integer(c_int) :: count_c
+    integer(c_Datatype) :: datatype_c
+    type(c_Status), target :: status_c
+    integer(c_int) :: ierror_c
+
+    fh_c = MPI_File_f2c(fh%MPI_VAL)
+    if (c_int == kind(0)) then
+        if (c_associated(c_loc(status), c_loc(MPI_STATUS_IGNORE))) then
+            ierror_c = MPIR_File_write_at_all_cdesc(fh_c, offset, buf, count, datatype%MPI_VAL, MPIR_C_MPI_STATUS_IGNORE)
+        else
+            ierror_c = MPIR_File_write_at_all_cdesc(fh_c, offset, buf, count, datatype%MPI_VAL, c_loc(status))
+        end if
+    else
+        offset_c = offset
+        count_c = count
+        datatype_c = datatype%MPI_VAL
+        if (c_associated(c_loc(status), c_loc(MPI_STATUS_IGNORE))) then
+            ierror_c = MPIR_File_write_at_all_cdesc(fh_c, offset_c, buf, count_c, datatype_c, MPIR_C_MPI_STATUS_IGNORE)
+        else
+            ierror_c = MPIR_File_write_at_all_cdesc(fh_c, offset_c, buf, count_c, datatype_c, c_loc(status_c))
+            status = status_c
+        end if
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_File_write_at_all_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/file_write_at_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/file_write_at_f08ts.F90
new file mode 100644
index 0000000..d3ccc6c
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/file_write_at_f08ts.F90
@@ -0,0 +1,55 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_File_write_at_f08ts(fh, offset, buf, count, datatype, status, ierror)
+    use :: mpi_f08, only : MPI_File, MPI_Datatype, MPI_Status
+    use :: mpi_f08, only : MPI_OFFSET_KIND
+    use, intrinsic :: iso_c_binding, only : c_loc, c_associated
+    use :: mpi_f08, only : MPI_STATUS_IGNORE, MPIR_C_MPI_STATUS_IGNORE, assignment(=)
+    use :: mpi_f08, only : MPI_File_f2c, MPI_File_c2f
+    use, intrinsic :: iso_c_binding, only : c_int, c_ptr
+    use :: mpi_c_interface, only : c_File, c_Datatype
+    use :: mpi_c_interface, only : c_Status
+    use :: mpi_c_interface, only : MPIR_File_write_at_cdesc
+
+    implicit none
+
+    type(MPI_File), intent(in) :: fh
+    integer(MPI_OFFSET_KIND), intent(in) :: offset
+    type(*), dimension(..), intent(in) :: buf
+    integer, intent(in) :: count
+    type(MPI_Datatype), intent(in) :: datatype
+    type(MPI_Status), target :: status
+    integer, optional, intent(out) :: ierror
+
+    integer(c_File) :: fh_c
+    integer(MPI_OFFSET_KIND) :: offset_c
+    integer(c_int) :: count_c
+    integer(c_Datatype) :: datatype_c
+    type(c_Status), target :: status_c
+    integer(c_int) :: ierror_c
+
+    fh_c = MPI_File_f2c(fh%MPI_VAL)
+    if (c_int == kind(0)) then
+        if (c_associated(c_loc(status), c_loc(MPI_STATUS_IGNORE))) then
+            ierror_c = MPIR_File_write_at_cdesc(fh_c, offset, buf, count, datatype%MPI_VAL, MPIR_C_MPI_STATUS_IGNORE)
+        else
+            ierror_c = MPIR_File_write_at_cdesc(fh_c, offset, buf, count, datatype%MPI_VAL, c_loc(status))
+        end if
+    else
+        offset_c = offset
+        count_c = count
+        datatype_c = datatype%MPI_VAL
+        if (c_associated(c_loc(status), c_loc(MPI_STATUS_IGNORE))) then
+            ierror_c = MPIR_File_write_at_cdesc(fh_c, offset_c, buf, count_c, datatype_c, MPIR_C_MPI_STATUS_IGNORE)
+        else
+            ierror_c = MPIR_File_write_at_cdesc(fh_c, offset_c, buf, count_c, datatype_c, c_loc(status_c))
+            status = status_c
+        end if
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_File_write_at_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/file_write_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/file_write_f08ts.F90
new file mode 100644
index 0000000..9e4bd33
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/file_write_f08ts.F90
@@ -0,0 +1,51 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_File_write_f08ts(fh, buf, count, datatype, status, ierror)
+    use :: mpi_f08, only : MPI_File, MPI_Datatype, MPI_Status
+    use, intrinsic :: iso_c_binding, only : c_loc, c_associated
+    use :: mpi_f08, only : MPI_STATUS_IGNORE, MPIR_C_MPI_STATUS_IGNORE, assignment(=)
+    use :: mpi_f08, only : MPI_File_f2c, MPI_File_c2f
+    use, intrinsic :: iso_c_binding, only : c_int, c_ptr
+    use :: mpi_c_interface, only : c_File, c_Datatype
+    use :: mpi_c_interface, only : c_Status
+    use :: mpi_c_interface, only : MPIR_File_write_cdesc
+
+    implicit none
+
+    type(MPI_File), intent(in) :: fh
+    type(*), dimension(..), intent(in) :: buf
+    integer, intent(in) :: count
+    type(MPI_Datatype), intent(in) :: datatype
+    type(MPI_Status), target :: status
+    integer, optional, intent(out) :: ierror
+
+    integer(c_File) :: fh_c
+    integer(c_int) :: count_c
+    integer(c_Datatype) :: datatype_c
+    type(c_Status), target :: status_c
+    integer(c_int) :: ierror_c
+
+    fh_c = MPI_File_f2c(fh%MPI_VAL)
+    if (c_int == kind(0)) then
+        if (c_associated(c_loc(status), c_loc(MPI_STATUS_IGNORE))) then
+            ierror_c = MPIR_File_write_cdesc(fh_c, buf, count, datatype%MPI_VAL, MPIR_C_MPI_STATUS_IGNORE)
+        else
+            ierror_c = MPIR_File_write_cdesc(fh_c, buf, count, datatype%MPI_VAL, c_loc(status))
+        end if
+    else
+        count_c = count
+        datatype_c = datatype%MPI_VAL
+        if (c_associated(c_loc(status), c_loc(MPI_STATUS_IGNORE))) then
+            ierror_c = MPIR_File_write_cdesc(fh_c, buf, count_c, datatype_c, MPIR_C_MPI_STATUS_IGNORE)
+        else
+            ierror_c = MPIR_File_write_cdesc(fh_c, buf, count_c, datatype_c, c_loc(status_c))
+            status = status_c
+        end if
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_File_write_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/file_write_ordered_begin_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/file_write_ordered_begin_f08ts.F90
new file mode 100644
index 0000000..e006e27
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/file_write_ordered_begin_f08ts.F90
@@ -0,0 +1,37 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_File_write_ordered_begin_f08ts(fh, buf, count, datatype, ierror)
+    use :: mpi_f08, only : MPI_File, MPI_Datatype
+    use :: mpi_f08, only : MPI_File_f2c, MPI_File_c2f
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_File, c_Datatype
+    use :: mpi_c_interface, only : MPIR_File_write_ordered_begin_cdesc
+
+    implicit none
+
+    type(MPI_File), intent(in) :: fh
+    type(*), dimension(..), intent(in) :: buf
+    integer, intent(in) :: count
+    type(MPI_Datatype), intent(in) :: datatype
+    integer, optional, intent(out) :: ierror
+
+    integer(c_File) :: fh_c
+    integer(c_int) :: count_c
+    integer(c_Datatype) :: datatype_c
+    integer(c_int) :: ierror_c
+
+    fh_c = MPI_File_f2c(fh%MPI_VAL)
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_File_write_ordered_begin_cdesc(fh_c, buf, count, datatype%MPI_VAL)
+    else
+        count_c = count
+        datatype_c = datatype%MPI_VAL
+        ierror_c = MPIR_File_write_ordered_begin_cdesc(fh_c, buf, count_c, datatype_c)
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_File_write_ordered_begin_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/file_write_ordered_end_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/file_write_ordered_end_f08ts.F90
new file mode 100644
index 0000000..26a0f6a
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/file_write_ordered_end_f08ts.F90
@@ -0,0 +1,37 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_File_write_ordered_end_f08ts(fh, buf, status, ierror)
+    use :: mpi_f08, only : MPI_File, MPI_Status
+    use, intrinsic :: iso_c_binding, only : c_loc, c_associated
+    use :: mpi_f08, only : MPI_STATUS_IGNORE, MPIR_C_MPI_STATUS_IGNORE, assignment(=)
+    use :: mpi_f08, only : MPI_File_f2c, MPI_File_c2f
+    use, intrinsic :: iso_c_binding, only : c_int, c_ptr
+    use :: mpi_c_interface, only : c_File
+    use :: mpi_c_interface, only : c_Status
+    use :: mpi_c_interface, only : MPIR_File_write_ordered_end_cdesc
+
+    implicit none
+
+    type(MPI_File), intent(in) :: fh
+    type(*), dimension(..), intent(in) :: buf
+    type(MPI_Status), target :: status
+    integer, optional, intent(out) :: ierror
+
+    integer(c_File) :: fh_c
+    type(c_Status), target :: status_c
+    integer(c_int) :: ierror_c
+
+    fh_c = MPI_File_f2c(fh%MPI_VAL)
+    if (c_associated(c_loc(status), c_loc(MPI_STATUS_IGNORE))) then
+        ierror_c = MPIR_File_write_ordered_end_cdesc(fh_c, buf, MPIR_C_MPI_STATUS_IGNORE)
+    else
+        ierror_c = MPIR_File_write_ordered_end_cdesc(fh_c, buf, c_loc(status_c))
+        status = status_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_File_write_ordered_end_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/file_write_ordered_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/file_write_ordered_f08ts.F90
new file mode 100644
index 0000000..42dacf7
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/file_write_ordered_f08ts.F90
@@ -0,0 +1,51 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_File_write_ordered_f08ts(fh, buf, count, datatype, status, ierror)
+    use :: mpi_f08, only : MPI_File, MPI_Datatype, MPI_Status
+    use, intrinsic :: iso_c_binding, only : c_loc, c_associated
+    use :: mpi_f08, only : MPI_STATUS_IGNORE, MPIR_C_MPI_STATUS_IGNORE, assignment(=)
+    use :: mpi_f08, only : MPI_File_f2c, MPI_File_c2f
+    use, intrinsic :: iso_c_binding, only : c_int, c_ptr
+    use :: mpi_c_interface, only : c_File, c_Datatype
+    use :: mpi_c_interface, only : c_Status
+    use :: mpi_c_interface, only : MPIR_File_write_ordered_cdesc
+
+    implicit none
+
+    type(MPI_File), intent(in) :: fh
+    type(*), dimension(..), intent(in) :: buf
+    integer, intent(in) :: count
+    type(MPI_Datatype), intent(in) :: datatype
+    type(MPI_Status), target :: status
+    integer, optional, intent(out) :: ierror
+
+    integer(c_File) :: fh_c
+    integer(c_int) :: count_c
+    integer(c_Datatype) :: datatype_c
+    type(c_Status), target :: status_c
+    integer(c_int) :: ierror_c
+
+    fh_c = MPI_File_f2c(fh%MPI_VAL)
+    if (c_int == kind(0)) then
+        if (c_associated(c_loc(status), c_loc(MPI_STATUS_IGNORE))) then
+            ierror_c = MPIR_File_write_ordered_cdesc(fh_c, buf, count, datatype%MPI_VAL, MPIR_C_MPI_STATUS_IGNORE)
+        else
+            ierror_c = MPIR_File_write_ordered_cdesc(fh_c, buf, count, datatype%MPI_VAL, c_loc(status))
+        end if
+    else
+        count_c = count
+        datatype_c = datatype%MPI_VAL
+        if (c_associated(c_loc(status), c_loc(MPI_STATUS_IGNORE))) then
+            ierror_c = MPIR_File_write_ordered_cdesc(fh_c, buf, count_c, datatype_c, MPIR_C_MPI_STATUS_IGNORE)
+        else
+            ierror_c = MPIR_File_write_ordered_cdesc(fh_c, buf, count_c, datatype_c, c_loc(status_c))
+            status = status_c
+        end if
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_File_write_ordered_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/file_write_shared_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/file_write_shared_f08ts.F90
new file mode 100644
index 0000000..1e98f87
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/file_write_shared_f08ts.F90
@@ -0,0 +1,51 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_File_write_shared_f08ts(fh, buf, count, datatype, status, ierror)
+    use :: mpi_f08, only : MPI_File, MPI_Datatype, MPI_Status
+    use, intrinsic :: iso_c_binding, only : c_loc, c_associated
+    use :: mpi_f08, only : MPI_STATUS_IGNORE, MPIR_C_MPI_STATUS_IGNORE, assignment(=)
+    use :: mpi_f08, only : MPI_File_f2c, MPI_File_c2f
+    use, intrinsic :: iso_c_binding, only : c_int, c_ptr
+    use :: mpi_c_interface, only : c_File, c_Datatype
+    use :: mpi_c_interface, only : c_Status
+    use :: mpi_c_interface, only : MPIR_File_write_shared_cdesc
+
+    implicit none
+
+    type(MPI_File), intent(in) :: fh
+    type(*), dimension(..), intent(in) :: buf
+    integer, intent(in) :: count
+    type(MPI_Datatype), intent(in) :: datatype
+    type(MPI_Status), target :: status
+    integer, optional, intent(out) :: ierror
+
+    integer(c_File) :: fh_c
+    integer(c_int) :: count_c
+    integer(c_Datatype) :: datatype_c
+    type(c_Status), target :: status_c
+    integer(c_int) :: ierror_c
+
+    fh_c = MPI_File_f2c(fh%MPI_VAL)
+    if (c_int == kind(0)) then
+        if (c_associated(c_loc(status), c_loc(MPI_STATUS_IGNORE))) then
+            ierror_c = MPIR_File_write_shared_cdesc(fh_c, buf, count, datatype%MPI_VAL, MPIR_C_MPI_STATUS_IGNORE)
+        else
+            ierror_c = MPIR_File_write_shared_cdesc(fh_c, buf, count, datatype%MPI_VAL, c_loc(status))
+        end if
+    else
+        count_c = count
+        datatype_c = datatype%MPI_VAL
+        if (c_associated(c_loc(status), c_loc(MPI_STATUS_IGNORE))) then
+            ierror_c = MPIR_File_write_shared_cdesc(fh_c, buf, count_c, datatype_c, MPIR_C_MPI_STATUS_IGNORE)
+        else
+            ierror_c = MPIR_File_write_shared_cdesc(fh_c, buf, count_c, datatype_c, c_loc(status_c))
+            status = status_c
+        end if
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_File_write_shared_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/finalize_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/finalize_f08ts.F90
new file mode 100644
index 0000000..ee2877c
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/finalize_f08ts.F90
@@ -0,0 +1,20 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Finalize_f08(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : MPIR_Finalize_c
+
+    implicit none
+
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: ierror_c
+
+    ierror_c = MPIR_Finalize_c()
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Finalize_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/finalized_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/finalized_f08ts.F90
new file mode 100644
index 0000000..1dfb01a
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/finalized_f08ts.F90
@@ -0,0 +1,23 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Finalized_f08(flag, ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : MPIR_Finalized_c
+
+    implicit none
+
+    logical, intent(out) :: flag
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: flag_c
+    integer(c_int) :: ierror_c
+
+    ierror_c = MPIR_Finalized_c(flag_c)
+
+    flag = (flag_c /= 0)
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Finalized_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/free_mem_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/free_mem_f08ts.F90
new file mode 100644
index 0000000..c2f16f4
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/free_mem_f08ts.F90
@@ -0,0 +1,21 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Free_mem_f08(base, ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : MPIR_Free_mem_c
+
+    implicit none
+
+    type(*), dimension(..), intent(in), asynchronous :: base
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: ierror_c
+
+    ierror_c = MPIR_Free_mem_c(base)
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Free_mem_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/gather_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/gather_f08ts.F90
new file mode 100644
index 0000000..8b16811
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/gather_f08ts.F90
@@ -0,0 +1,49 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Gather_f08ts(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, &
+    root, comm, ierror)
+    use :: mpi_f08, only : MPI_Datatype, MPI_Comm
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Datatype, c_Comm
+    use :: mpi_c_interface, only : MPIR_Gather_cdesc
+
+    implicit none
+
+    type(*), dimension(..), intent(in) :: sendbuf
+    type(*), dimension(..) :: recvbuf
+    integer, intent(in) :: sendcount
+    integer, intent(in) :: recvcount
+    integer, intent(in) :: root
+    type(MPI_Datatype), intent(in) :: sendtype
+    type(MPI_Datatype), intent(in) :: recvtype
+    type(MPI_Comm), intent(in) :: comm
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: sendcount_c
+    integer(c_int) :: recvcount_c
+    integer(c_int) :: root_c
+    integer(c_Datatype) :: sendtype_c
+    integer(c_Datatype) :: recvtype_c
+    integer(c_Comm) :: comm_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Gather_cdesc(sendbuf, sendcount, sendtype%MPI_VAL, recvbuf, recvcount, recvtype%MPI_VAL, &
+            root, comm%MPI_VAL)
+    else
+        sendcount_c = sendcount
+        sendtype_c = sendtype%MPI_VAL
+        recvcount_c = recvcount
+        recvtype_c = recvtype%MPI_VAL
+        root_c = root
+        comm_c = comm%MPI_VAL
+        ierror_c = MPIR_Gather_cdesc(sendbuf, sendcount_c, sendtype_c, recvbuf, recvcount_c, recvtype_c, &
+            root_c, comm_c)
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Gather_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/gatherv_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/gatherv_f08ts.F90
new file mode 100644
index 0000000..b366534
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/gatherv_f08ts.F90
@@ -0,0 +1,54 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Gatherv_f08ts(sendbuf, sendcount, sendtype, recvbuf, recvcounts, displs, &
+    recvtype, root, comm, ierror)
+    use :: mpi_f08, only : MPI_Datatype, MPI_Comm
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Datatype, c_Comm
+    use :: mpi_c_interface, only : MPIR_Gatherv_cdesc, MPIR_Comm_size_c
+
+    implicit none
+
+    type(*), dimension(..), intent(in) :: sendbuf
+    type(*), dimension(..) :: recvbuf
+    integer, intent(in) :: sendcount
+    integer, intent(in) :: root
+    integer, intent(in) :: recvcounts(*)
+    integer, intent(in) :: displs(*)
+    type(MPI_Datatype), intent(in) :: sendtype
+    type(MPI_Datatype), intent(in) :: recvtype
+    type(MPI_Comm), intent(in) :: comm
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: sendcount_c
+    integer(c_int) :: root_c
+    integer(c_int), allocatable :: recvcounts_c(:)
+    integer(c_int), allocatable :: displs_c(:)
+    integer(c_Datatype) :: sendtype_c
+    integer(c_Datatype) :: recvtype_c
+    integer(c_Comm) :: comm_c
+    integer(c_int) :: ierror_c
+    integer(c_int) :: err, length ! To get length of assumed-size arrays
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Gatherv_cdesc(sendbuf, sendcount, sendtype%MPI_VAL, recvbuf, recvcounts, displs, &
+                    recvtype%MPI_VAL, root, comm%MPI_VAL)
+    else
+        sendcount_c = sendcount
+        sendtype_c = sendtype%MPI_VAL
+        recvtype_c = recvtype%MPI_VAL
+        root_c = root
+        comm_c = comm%MPI_VAL
+        err = MPIR_Comm_size_c(comm_c, length)
+        recvcounts_c = recvcounts(1:length)
+        displs_c = displs(1:length)
+        ierror_c = MPIR_Gatherv_cdesc(sendbuf, sendcount_c, sendtype_c, recvbuf, recvcounts_c, displs_c, &
+                    recvtype_c, root_c, comm_c)
+    end if
+
+    if(present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Gatherv_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/get_address_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/get_address_f08ts.F90
new file mode 100644
index 0000000..53ca210
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/get_address_f08ts.F90
@@ -0,0 +1,23 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Get_address_f08ts(location, address, ierror)
+    use :: mpi_f08, only : MPI_ADDRESS_KIND
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : MPIR_Get_address_cdesc
+
+    implicit none
+
+    type(*), dimension(..), asynchronous :: location
+    integer(MPI_ADDRESS_KIND), intent(out) :: address
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: ierror_c
+
+    ierror_c = MPIR_Get_address_cdesc(location, address)
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Get_address_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/get_count_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/get_count_f08ts.F90
new file mode 100644
index 0000000..ed9cc8a
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/get_count_f08ts.F90
@@ -0,0 +1,38 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Get_count_f08(status, datatype, count, ierror)
+    use :: mpi_f08, only : MPI_Status, MPI_Datatype
+    use, intrinsic :: iso_c_binding, only : c_loc
+    use :: mpi_f08, only : assignment(=)
+    use, intrinsic :: iso_c_binding, only : c_int, c_ptr
+    use :: mpi_c_interface, only : c_Datatype
+    use :: mpi_c_interface, only : c_Status
+    use :: mpi_c_interface, only : MPIR_Get_count_c
+
+    implicit none
+
+    type(MPI_Status), intent(in), target :: status
+    type(MPI_Datatype), intent(in) :: datatype
+    integer, intent(out) :: count
+    integer, optional, intent(out) :: ierror
+
+    type(c_Status), target :: status_c
+    integer(c_Datatype) :: datatype_c
+    integer(c_int) :: count_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Get_count_c(c_loc(status), datatype%MPI_VAL, count)
+    else
+        status_c = status
+        datatype_c = datatype%MPI_VAL
+        ierror_c = MPIR_Get_count_c(c_loc(status_c), datatype_c, count_c)
+        count = count_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Get_count_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/get_elements_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/get_elements_f08ts.F90
new file mode 100644
index 0000000..3951ebd
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/get_elements_f08ts.F90
@@ -0,0 +1,38 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Get_elements_f08(status, datatype, count, ierror)
+    use :: mpi_f08, only : MPI_Status, MPI_Datatype
+    use, intrinsic :: iso_c_binding, only : c_loc
+    use :: mpi_f08, only : assignment(=)
+    use, intrinsic :: iso_c_binding, only : c_int, c_ptr
+    use :: mpi_c_interface, only : c_Datatype
+    use :: mpi_c_interface, only : c_Status
+    use :: mpi_c_interface, only : MPIR_Get_elements_c
+
+    implicit none
+
+    type(MPI_Status), intent(in), target :: status
+    type(MPI_Datatype), intent(in) :: datatype
+    integer, intent(out) :: count
+    integer, optional, intent(out) :: ierror
+
+    type(c_Status), target :: status_c
+    integer(c_Datatype) :: datatype_c
+    integer(c_int) :: count_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Get_elements_c(c_loc(status), datatype%MPI_VAL, count)
+    else
+        status_c = status
+        datatype_c = datatype%MPI_VAL
+        ierror_c = MPIR_Get_elements_c(c_loc(status_c), datatype_c, count_c)
+        count = count_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Get_elements_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/get_elements_x_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/get_elements_x_f08ts.F90
new file mode 100644
index 0000000..db893eb
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/get_elements_x_f08ts.F90
@@ -0,0 +1,39 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Get_elements_x_f08(status, datatype, count, ierror)
+    use :: mpi_f08, only : MPI_Status, MPI_Datatype
+    use :: mpi_f08, only : MPI_COUNT_KIND
+    use, intrinsic :: iso_c_binding, only : c_loc
+    use :: mpi_f08, only : assignment(=)
+    use, intrinsic :: iso_c_binding, only : c_int, c_ptr
+    use :: mpi_c_interface, only : c_Datatype
+    use :: mpi_c_interface, only : c_Status
+    use :: mpi_c_interface, only : MPIR_Get_elements_x_c
+
+    implicit none
+
+    type(MPI_Status), intent(in), target :: status
+    type(MPI_Datatype), intent(in) :: datatype
+    integer(MPI_COUNT_KIND), intent(out) :: count
+    integer, optional, intent(out) :: ierror
+
+    type(c_Status), target :: status_c
+    integer(c_Datatype) :: datatype_c
+    integer(MPI_COUNT_KIND) :: count_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Get_elements_x_c(c_loc(status), datatype%MPI_VAL, count)
+    else
+        status_c = status
+        datatype_c = datatype%MPI_VAL
+        ierror_c = MPIR_Get_elements_x_c(c_loc(status_c), datatype_c, count_c)
+        count = count_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Get_elements_x_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/get_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/get_f08ts.F90
new file mode 100644
index 0000000..dc4c7d3
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/get_f08ts.F90
@@ -0,0 +1,52 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Get_f08ts(origin_addr, origin_count, origin_datatype, target_rank, &
+    target_disp, target_count, target_datatype, win, ierror)
+    use :: mpi_f08, only : MPI_Datatype, MPI_Win
+    use :: mpi_f08, only : MPI_ADDRESS_KIND
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Datatype, c_Win
+    use :: mpi_c_interface, only : MPIR_Get_cdesc
+
+    implicit none
+
+    type(*), dimension(..), asynchronous :: origin_addr
+    integer, intent(in) :: origin_count
+    integer, intent(in) :: target_rank
+    integer, intent(in) :: target_count
+    type(MPI_Datatype), intent(in) :: origin_datatype
+    integer(MPI_ADDRESS_KIND), intent(in) :: target_disp
+    type(MPI_Datatype), intent(in) :: target_datatype
+    type(MPI_Win), intent(in) :: win
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: origin_count_c
+    integer(c_int) :: target_rank_c
+    integer(c_int) :: target_count_c
+    integer(c_Datatype) :: origin_datatype_c
+    integer(MPI_ADDRESS_KIND) :: target_disp_c
+    integer(c_Datatype) :: target_datatype_c
+    integer(c_Win) :: win_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Get_cdesc(origin_addr, origin_count, origin_datatype%MPI_VAL, target_rank, target_disp, &
+            target_count, target_datatype%MPI_VAL, win%MPI_VAL)
+    else
+        origin_count_c = origin_count
+        origin_datatype_c = origin_datatype%MPI_VAL
+        target_rank_c = target_rank
+        target_disp_c = target_disp
+        target_count_c = target_count
+        target_datatype_c = target_datatype%MPI_VAL
+        win_c = win%MPI_VAL
+        ierror_c = MPIR_Get_cdesc(origin_addr, origin_count_c, origin_datatype_c, target_rank_c, target_disp_c, &
+            target_count_c, target_datatype_c, win_c)
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Get_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/get_library_version_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/get_library_version_f08ts.F90
new file mode 100644
index 0000000..dd63db0
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/get_library_version_f08ts.F90
@@ -0,0 +1,33 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Get_library_version_f08(version, resultlen, ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_char
+    use :: mpi_f08, only : MPI_MAX_LIBRARY_VERSION_STRING
+    use :: mpi_c_interface, only : MPIR_Get_library_version_c
+    use :: mpi_c_interface, only : MPIR_Fortran_string_c2f
+
+    implicit none
+
+    character(len=MPI_MAX_LIBRARY_VERSION_STRING), intent(out) :: version
+    integer, intent(out) :: resultlen
+    integer, optional, intent(out) :: ierror
+
+    character(kind=c_char) :: version_c(MPI_MAX_LIBRARY_VERSION_STRING+1)
+    integer(c_int) :: resultlen_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Get_library_version_c(version_c, resultlen)
+    else
+        ierror_c = MPIR_Get_library_version_c(version_c, resultlen_c)
+        resultlen = resultlen_c
+    end if
+
+    call MPIR_Fortran_string_c2f(version_c, version)
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Get_library_version_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/get_processor_name_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/get_processor_name_f08ts.F90
new file mode 100644
index 0000000..57e32a1
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/get_processor_name_f08ts.F90
@@ -0,0 +1,33 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Get_processor_name_f08(name, resultlen, ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_char
+    use :: mpi_f08, only : MPI_MAX_PROCESSOR_NAME
+    use :: mpi_c_interface, only : MPIR_Get_processor_name_c
+    use :: mpi_c_interface, only : MPIR_Fortran_string_c2f
+
+    implicit none
+
+    character(len=MPI_MAX_PROCESSOR_NAME), intent(out) :: name
+    integer, intent(out) :: resultlen
+    integer, optional, intent(out) :: ierror
+
+    character(kind=c_char) :: name_c(MPI_MAX_PROCESSOR_NAME+1)
+    integer(c_int) :: resultlen_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Get_processor_name_c(name_c, resultlen)
+    else
+        ierror_c = MPIR_Get_processor_name_c(name_c, resultlen_c)
+        resultlen = resultlen_c
+    end if
+
+    call MPIR_Fortran_string_c2f(name_c, name)
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Get_processor_name_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/get_version_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/get_version_f08ts.F90
new file mode 100644
index 0000000..65384d3
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/get_version_f08ts.F90
@@ -0,0 +1,30 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Get_version_f08(version, subversion, ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : MPIR_Get_version_c
+
+    implicit none
+
+    integer, intent(out) :: version
+    integer, intent(out) :: subversion
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: version_c
+    integer(c_int) :: subversion_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Get_version_c(version, subversion)
+    else
+        ierror_c = MPIR_Get_version_c(version_c, subversion_c)
+        version = version_c
+        subversion = subversion_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Get_version_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/graph_create_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/graph_create_f08ts.F90
new file mode 100644
index 0000000..65ad5e6
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/graph_create_f08ts.F90
@@ -0,0 +1,46 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Graph_create_f08(comm_old, nnodes, index, edges, reorder, comm_graph, ierror)
+    use :: mpi_f08, only : MPI_Comm
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Comm
+    use :: mpi_c_interface, only : MPIR_Graph_create_c
+
+    implicit none
+
+    type(MPI_Comm), intent(in) :: comm_old
+    integer, intent(in) :: nnodes
+    integer, intent(in) :: index(nnodes)
+    integer, intent(in) :: edges(*)
+    logical, intent(in) :: reorder
+    type(MPI_Comm), intent(out) :: comm_graph
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Comm) :: comm_old_c
+    integer(c_int) :: nnodes_c
+    integer(c_int) :: index_c(nnodes)
+    integer(c_int), allocatable, dimension(:) :: edges_c
+    integer(c_int) :: reorder_c
+    integer(c_Comm) :: comm_graph_c
+    integer(c_int) :: ierror_c
+    integer(c_int) :: length ! To get length of assumed-size arrays
+
+    reorder_c = merge(1, 0, reorder)
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Graph_create_c(comm_old%MPI_VAL, nnodes, index, edges, reorder_c, comm_graph%MPI_VAL)
+    else
+        length = index(nnodes)
+        comm_old_c = comm_old%MPI_VAL
+        nnodes_c = nnodes
+        index_c = index
+        edges_c(1:length) = edges(1:length)
+        ierror_c = MPIR_Graph_create_c(comm_old_c, nnodes_c, index_c, edges_c, reorder_c, comm_graph_c)
+        comm_graph%MPI_VAL = comm_graph_c
+    end if
+
+    if(present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Graph_create_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/graph_get_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/graph_get_f08ts.F90
new file mode 100644
index 0000000..96584f0
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/graph_get_f08ts.F90
@@ -0,0 +1,41 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Graph_get_f08(comm, maxindex, maxedges, index, edges, ierror)
+    use :: mpi_f08, only : MPI_Comm
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Comm
+    use :: mpi_c_interface, only : MPIR_Graph_get_c
+
+    implicit none
+
+    type(MPI_Comm), intent(in) :: comm
+    integer, intent(in) :: maxindex
+    integer, intent(in) :: maxedges
+    integer, intent(out) :: index(maxindex)
+    integer, intent(out) :: edges(maxedges)
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Comm) :: comm_c
+    integer(c_int) :: maxindex_c
+    integer(c_int) :: maxedges_c
+    integer(c_int) :: index_c(maxindex)
+    integer(c_int) :: edges_c(maxedges)
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Graph_get_c(comm%MPI_VAL, maxindex, maxedges, index, edges)
+    else
+        comm_c = comm%MPI_VAL
+        maxindex_c = maxindex
+        maxedges_c = maxedges
+        ierror_c = MPIR_Graph_get_c(comm_c, maxindex_c, maxedges_c, index_c, edges_c)
+        index = index_c
+        edges = edges_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Graph_get_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/graph_map_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/graph_map_f08ts.F90
new file mode 100644
index 0000000..4ace89a
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/graph_map_f08ts.F90
@@ -0,0 +1,42 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Graph_map_f08(comm, nnodes, index, edges, newrank, ierror)
+    use :: mpi_f08, only : MPI_Comm
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Comm
+    use :: mpi_c_interface, only : MPIR_Graph_map_c
+
+    implicit none
+
+    type(MPI_Comm), intent(in)  :: comm
+    integer, intent(in)  :: nnodes
+    integer, intent(in)  :: index(nnodes)
+    integer, intent(in)  :: edges(*)
+    integer, intent(out)  :: newrank
+    integer, optional, intent(out)  :: ierror
+
+    integer(c_Comm) :: comm_c
+    integer(c_int) :: nnodes_c
+    integer(c_int) :: index_c(nnodes)
+    integer(c_int) :: edges_c(index(nnodes))
+    integer(c_int) :: newrank_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Graph_map_c(comm%MPI_VAL, nnodes, index, edges, newrank)
+    else
+        comm_c = comm%MPI_VAL
+        nnodes_c = nnodes
+        index_c = index
+        edges_c = edges(1:index(nnodes))
+
+        ierror_c = MPIR_Graph_map_c(comm_c, nnodes_c, index_c, edges_c, newrank_c)
+        newrank = newrank_c
+    end if
+
+    if(present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Graph_map_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/graph_neighbors_count_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/graph_neighbors_count_f08ts.F90
new file mode 100644
index 0000000..5aeb21e
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/graph_neighbors_count_f08ts.F90
@@ -0,0 +1,35 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Graph_neighbors_count_f08(comm, rank, nneighbors, ierror)
+    use :: mpi_f08, only : MPI_Comm
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Comm
+    use :: mpi_c_interface, only : MPIR_Graph_neighbors_count_c
+
+    implicit none
+
+    type(MPI_Comm), intent(in) :: comm
+    integer, intent(in) :: rank
+    integer, intent(out) :: nneighbors
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Comm) :: comm_c
+    integer(c_int) :: rank_c
+    integer(c_int) :: nneighbors_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Graph_neighbors_count_c(comm%MPI_VAL, rank, nneighbors)
+    else
+        comm_c = comm%MPI_VAL
+        rank_c = rank
+        ierror_c = MPIR_Graph_neighbors_count_c(comm_c, rank_c, nneighbors_c)
+        nneighbors = nneighbors_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Graph_neighbors_count_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/graph_neighbors_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/graph_neighbors_f08ts.F90
new file mode 100644
index 0000000..09df0d9
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/graph_neighbors_f08ts.F90
@@ -0,0 +1,38 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Graph_neighbors_f08(comm, rank, maxneighbors, neighbors, ierror)
+    use :: mpi_f08, only : MPI_Comm
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Comm
+    use :: mpi_c_interface, only : MPIR_Graph_neighbors_c
+
+    implicit none
+
+    type(MPI_Comm), intent(in) :: comm
+    integer, intent(in) :: rank
+    integer, intent(in) :: maxneighbors
+    integer, intent(out) :: neighbors(maxneighbors)
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Comm) :: comm_c
+    integer(c_int) :: rank_c
+    integer(c_int) :: maxneighbors_c
+    integer(c_int) :: neighbors_c(maxneighbors)
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Graph_neighbors_c(comm%MPI_VAL, rank, maxneighbors, neighbors)
+    else
+        comm_c = comm%MPI_VAL
+        rank_c = rank
+        maxneighbors_c = maxneighbors
+        ierror_c = MPIR_Graph_neighbors_c(comm_c, rank_c, maxneighbors_c, neighbors_c)
+        neighbors = neighbors_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Graph_neighbors_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/graphdims_get_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/graphdims_get_f08ts.F90
new file mode 100644
index 0000000..3b6725c
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/graphdims_get_f08ts.F90
@@ -0,0 +1,35 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Graphdims_get_f08(comm, nnodes, nedges, ierror)
+    use :: mpi_f08, only : MPI_Comm
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Comm
+    use :: mpi_c_interface, only : MPIR_Graphdims_get_c
+
+    implicit none
+
+    type(MPI_Comm), intent(in) :: comm
+    integer, intent(out) :: nnodes
+    integer, intent(out) :: nedges
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Comm) :: comm_c
+    integer(c_int) :: nnodes_c
+    integer(c_int) :: nedges_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Graphdims_get_c(comm%MPI_VAL, nnodes, nedges)
+    else
+        comm_c = comm%MPI_VAL
+        ierror_c = MPIR_Graphdims_get_c(comm_c, nnodes_c, nedges_c)
+        nnodes = nnodes_c
+        nedges = nedges_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Graphdims_get_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/grequest_complete_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/grequest_complete_f08ts.F90
new file mode 100644
index 0000000..8bde054
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/grequest_complete_f08ts.F90
@@ -0,0 +1,29 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Grequest_complete_f08(request, ierror)
+    use :: mpi_f08, only : MPI_Request
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Request
+    use :: mpi_c_interface, only : MPIR_Grequest_complete_c
+
+    implicit none
+
+    type(MPI_Request), intent(in) :: request
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Request) :: request_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Grequest_complete_c(request%MPI_VAL)
+    else
+        request_c = request%MPI_VAL
+        ierror_c = MPIR_Grequest_complete_c(request_c)
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Grequest_complete_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/grequest_start_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/grequest_start_f08ts.F90
new file mode 100644
index 0000000..a9c1dfc
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/grequest_start_f08ts.F90
@@ -0,0 +1,46 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Grequest_start_f08(query_fn, free_fn, cancel_fn, extra_state, request, ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use, intrinsic :: iso_c_binding, only : c_funloc, c_funptr
+    use :: mpi_f08, only : MPI_Request
+    use :: mpi_f08, only : MPI_SUCCESS, MPI_ADDRESS_KIND
+    use :: mpi_f08, only : MPI_Grequest_query_function
+    use :: mpi_f08, only : MPI_Grequest_free_function
+    use :: mpi_f08, only : MPI_Grequest_cancel_function
+    use :: mpi_c_interface, only : c_Request
+    use :: mpi_c_interface, only : MPIR_Grequest_start_c
+    use :: mpi_c_interface, only : MPIR_Grequest_set_lang_fortran
+
+    implicit none
+
+    procedure(MPI_Grequest_query_function) :: query_fn
+    procedure(MPI_Grequest_free_function) :: free_fn
+    procedure(MPI_Grequest_cancel_function) :: cancel_fn
+    integer(MPI_ADDRESS_KIND), intent(in) :: extra_state
+    type(MPI_Request), intent(out) :: request
+    integer, optional, intent(out) :: ierror
+
+    type(c_funptr) :: query_fn_c
+    type(c_funptr) :: free_fn_c
+    type(c_funptr) :: cancel_fn_c
+    integer(c_Request) :: request_c
+    integer(c_int) :: ierror_c
+
+    query_fn_c = c_funloc(query_fn)
+    free_fn_c = c_funloc(free_fn)
+    cancel_fn_c = c_funloc(cancel_fn)
+
+    ierror_c = MPIR_Grequest_start_c(query_fn_c, free_fn_c, cancel_fn_c, extra_state, request_c)
+
+    if (ierror_c == MPI_SUCCESS) then
+        call MPIR_Grequest_set_lang_fortran(request_c)
+    end if
+
+    request%MPI_VAL = request_c
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Grequest_start_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/group_compare_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/group_compare_f08ts.F90
new file mode 100644
index 0000000..f2a3489
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/group_compare_f08ts.F90
@@ -0,0 +1,35 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Group_compare_f08(group1,group2,result, ierror)
+    use :: mpi_f08, only : MPI_Group
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Group
+    use :: mpi_c_interface, only : MPIR_Group_compare_c
+
+    implicit none
+
+    type(MPI_Group), intent(in) :: group1
+    type(MPI_Group), intent(in) :: group2
+    integer, intent(out) :: result
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Group) :: group1_c
+    integer(c_Group) :: group2_c
+    integer(c_int) :: result_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Group_compare_c(group1%MPI_VAL, group2%MPI_VAL, result)
+    else
+        group1_c = group1%MPI_VAL
+        group2_c = group2%MPI_VAL
+        ierror_c = MPIR_Group_compare_c(group1_c, group2_c, result_c)
+        result = result_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Group_compare_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/group_difference_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/group_difference_f08ts.F90
new file mode 100644
index 0000000..b807cab
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/group_difference_f08ts.F90
@@ -0,0 +1,35 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Group_difference_f08(group1,group2,newgroup, ierror)
+    use :: mpi_f08, only : MPI_Group
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Group
+    use :: mpi_c_interface, only : MPIR_Group_difference_c
+
+    implicit none
+
+    type(MPI_Group), intent(in) :: group1
+    type(MPI_Group), intent(in) :: group2
+    type(MPI_Group), intent(out) :: newgroup
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Group) :: group1_c
+    integer(c_Group) :: group2_c
+    integer(c_Group) :: newgroup_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Group_difference_c(group1%MPI_VAL, group2%MPI_VAL, newgroup%MPI_VAL)
+    else
+        group1_c = group1%MPI_VAL
+        group2_c = group2%MPI_VAL
+        ierror_c = MPIR_Group_difference_c(group1_c, group2_c, newgroup_c)
+        newgroup%MPI_VAL = newgroup_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Group_difference_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/group_excl_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/group_excl_f08ts.F90
new file mode 100644
index 0000000..699a36c
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/group_excl_f08ts.F90
@@ -0,0 +1,38 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Group_excl_f08(group, n,ranks, newgroup, ierror)
+    use :: mpi_f08, only : MPI_Group
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Group
+    use :: mpi_c_interface, only : MPIR_Group_excl_c
+
+    implicit none
+
+    type(MPI_Group), intent(in) :: group
+    integer, intent(in) :: n
+    integer, intent(in) :: ranks(n)
+    type(MPI_Group), intent(out) :: newgroup
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Group) :: group_c
+    integer(c_int) :: n_c
+    integer(c_int) :: ranks_c(n)
+    integer(c_Group) :: newgroup_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Group_excl_c(group%MPI_VAL, n, ranks, newgroup%MPI_VAL)
+    else
+        group_c = group%MPI_VAL
+        n_c = n
+        ranks_c = ranks
+        ierror_c = MPIR_Group_excl_c(group_c, n_c, ranks_c, newgroup_c)
+        newgroup%MPI_VAL = newgroup_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Group_excl_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/group_free_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/group_free_f08ts.F90
new file mode 100644
index 0000000..adc2181
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/group_free_f08ts.F90
@@ -0,0 +1,30 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Group_free_f08(group, ierror)
+    use :: mpi_f08, only : MPI_Group
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Group
+    use :: mpi_c_interface, only : MPIR_Group_free_c
+
+    implicit none
+
+    type(MPI_Group), intent(inout) :: group
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Group) :: group_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Group_free_c(group%MPI_VAL)
+    else
+        group_c = group%MPI_VAL
+        ierror_c = MPIR_Group_free_c(group_c)
+        group%MPI_VAL = group_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Group_free_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/group_incl_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/group_incl_f08ts.F90
new file mode 100644
index 0000000..daa5aa6
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/group_incl_f08ts.F90
@@ -0,0 +1,38 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Group_incl_f08(group, n,ranks, newgroup, ierror)
+    use :: mpi_f08, only : MPI_Group
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Group
+    use :: mpi_c_interface, only : MPIR_Group_incl_c
+
+    implicit none
+
+    integer, intent(in) :: n
+    integer, intent(in) :: ranks(n)
+    type(MPI_Group), intent(in) :: group
+    type(MPI_Group), intent(out) :: newgroup
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: n_c
+    integer(c_int) :: ranks_c(n)
+    integer(c_Group) :: group_c
+    integer(c_Group) :: newgroup_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Group_incl_c(group%MPI_VAL, n, ranks, newgroup%MPI_VAL)
+    else
+        group_c = group%MPI_VAL
+        n_c = n
+        ranks_c = ranks
+        ierror_c = MPIR_Group_incl_c(group_c, n_c, ranks_c, newgroup_c)
+        newgroup%MPI_VAL = newgroup_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Group_incl_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/group_intersection_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/group_intersection_f08ts.F90
new file mode 100644
index 0000000..b3496f9
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/group_intersection_f08ts.F90
@@ -0,0 +1,35 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Group_intersection_f08(group1,group2,newgroup, ierror)
+    use :: mpi_f08, only : MPI_Group
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Group
+    use :: mpi_c_interface, only : MPIR_Group_intersection_c
+
+    implicit none
+
+    type(MPI_Group), intent(in) :: group1
+    type(MPI_Group), intent(in) :: group2
+    type(MPI_Group), intent(out) :: newgroup
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Group) :: group1_c
+    integer(c_Group) :: group2_c
+    integer(c_Group) :: newgroup_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Group_intersection_c(group1%MPI_VAL, group2%MPI_VAL, newgroup%MPI_VAL)
+    else
+        group1_c = group1%MPI_VAL
+        group2_c = group2%MPI_VAL
+        ierror_c = MPIR_Group_intersection_c(group1_c, group2_c, newgroup_c)
+        newgroup%MPI_VAL = newgroup_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Group_intersection_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/group_range_excl_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/group_range_excl_f08ts.F90
new file mode 100644
index 0000000..ce0d78b
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/group_range_excl_f08ts.F90
@@ -0,0 +1,39 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Group_range_excl_f08(group, n,ranges, newgroup, ierror)
+    use :: mpi_f08, only : MPI_Group
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Group
+    use :: mpi_c_interface, only : MPIR_Group_range_excl_c
+
+    implicit none
+
+    type(MPI_Group), intent(in)  :: group
+    integer, intent(in)  :: n
+    integer, intent(in)  :: ranges(3, n)
+    type(MPI_Group), intent(out)  :: newgroup
+    integer, optional, intent(out)  :: ierror
+
+    integer(c_Group) :: group_c
+    integer(c_int) :: n_c
+    integer(c_int) :: ranges_c(3, n)
+    integer(c_Group) :: newgroup_c
+    integer(c_int) :: ierror_c
+
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Group_range_excl_c(group%MPI_VAL, n, ranges, newgroup%MPI_VAL)
+    else
+        n_c = n
+        group_c = group%MPI_VAL
+        ranges_c = ranges
+        ierror_c = MPIR_Group_range_excl_c(group_c, n_c, ranges_c, newgroup_c)
+        newgroup%MPI_VAL = newgroup_c
+    endif
+
+    if(present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Group_range_excl_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/group_range_incl_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/group_range_incl_f08ts.F90
new file mode 100644
index 0000000..89cb32b
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/group_range_incl_f08ts.F90
@@ -0,0 +1,39 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Group_range_incl_f08(group, n,ranges, newgroup, ierror)
+    use :: mpi_f08, only : MPI_Group
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Group
+    use :: mpi_c_interface, only : MPIR_Group_range_incl_c
+
+    implicit none
+
+    type(MPI_Group), intent(in)  :: group
+    integer, intent(in)  :: n
+    integer, intent(in)  :: ranges(3, n)
+    type(MPI_Group), intent(out)  :: newgroup
+    integer, optional, intent(out)  :: ierror
+
+    integer(c_Group) :: group_c
+    integer(c_int) :: n_c
+    integer(c_int) :: ranges_c(3, n)
+    integer(c_Group) :: newgroup_c
+    integer(c_int) :: ierror_c
+
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Group_range_incl_c(group%MPI_VAL, n, ranges, newgroup%MPI_VAL)
+    else
+        group_c = group%MPI_VAL
+        n_c = n
+        ranges_c = ranges
+        ierror_c = MPIR_Group_range_incl_c(group_c, n_c, ranges_c, newgroup_c)
+        newgroup%MPI_VAL = newgroup_c
+    endif
+
+    if(present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Group_range_incl_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/group_rank_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/group_rank_f08ts.F90
new file mode 100644
index 0000000..32a7cfa
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/group_rank_f08ts.F90
@@ -0,0 +1,32 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Group_rank_f08(group, rank, ierror)
+    use :: mpi_f08, only : MPI_Group
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Group
+    use :: mpi_c_interface, only : MPIR_Group_rank_c
+
+    implicit none
+
+    type(MPI_Group), intent(in) :: group
+    integer, intent(out) :: rank
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Group) :: group_c
+    integer(c_int) :: rank_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Group_rank_c(group%MPI_VAL, rank)
+    else
+        group_c = group%MPI_VAL
+        ierror_c = MPIR_Group_rank_c(group_c, rank_c)
+        rank = rank_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Group_rank_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/group_size_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/group_size_f08ts.F90
new file mode 100644
index 0000000..049dfec
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/group_size_f08ts.F90
@@ -0,0 +1,32 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Group_size_f08(group, size, ierror)
+    use :: mpi_f08, only : MPI_Group
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Group
+    use :: mpi_c_interface, only : MPIR_Group_size_c
+
+    implicit none
+
+    type(MPI_Group), intent(in) :: group
+    integer, intent(out) :: size
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Group) :: group_c
+    integer(c_int) :: size_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Group_size_c(group%MPI_VAL, size)
+    else
+        group_c = group%MPI_VAL
+        ierror_c = MPIR_Group_size_c(group_c, size_c)
+        size = size_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Group_size_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/group_translate_ranks_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/group_translate_ranks_f08ts.F90
new file mode 100644
index 0000000..328252f
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/group_translate_ranks_f08ts.F90
@@ -0,0 +1,41 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Group_translate_ranks_f08(group1,n, ranks1,group2,ranks2,ierror)
+    use :: mpi_f08, only : MPI_Group
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Group
+    use :: mpi_c_interface, only : MPIR_Group_translate_ranks_c
+
+    implicit none
+
+    type(MPI_Group), intent(in) :: group1
+    type(MPI_Group), intent(in) :: group2
+    integer, intent(in) :: n
+    integer, intent(in) :: ranks1(n)
+    integer, intent(out) :: ranks2(n)
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Group) :: group1_c
+    integer(c_Group) :: group2_c
+    integer(c_int) :: n_c
+    integer(c_int) :: ranks1_c(n)
+    integer(c_int) :: ranks2_c(n)
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Group_translate_ranks_c(group1%MPI_VAL, n, ranks1, group2%MPI_VAL, ranks2)
+    else
+        group1_c = group1%MPI_VAL
+        n_c = n
+        ranks1_c = ranks1
+        group2_c = group2%MPI_VAL
+        ierror_c = MPIR_Group_translate_ranks_c(group1_c, n_c, ranks1_c, group2_c, ranks2_c)
+        ranks2 = ranks2_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Group_translate_ranks_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/group_union_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/group_union_f08ts.F90
new file mode 100644
index 0000000..9749935
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/group_union_f08ts.F90
@@ -0,0 +1,35 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Group_union_f08(group1,group2,newgroup, ierror)
+    use :: mpi_f08, only : MPI_Group
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Group
+    use :: mpi_c_interface, only : MPIR_Group_union_c
+
+    implicit none
+
+    type(MPI_Group), intent(in) :: group1
+    type(MPI_Group), intent(in) :: group2
+    type(MPI_Group), intent(out) :: newgroup
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Group) :: group1_c
+    integer(c_Group) :: group2_c
+    integer(c_Group) :: newgroup_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Group_union_c(group1%MPI_VAL, group2%MPI_VAL, newgroup%MPI_VAL)
+    else
+        group1_c = group1%MPI_VAL
+        group2_c = group2%MPI_VAL
+        ierror_c = MPIR_Group_union_c(group1_c, group2_c, newgroup_c)
+        newgroup%MPI_VAL = newgroup_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Group_union_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/iallgather_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/iallgather_f08ts.F90
new file mode 100644
index 0000000..431d9f2
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/iallgather_f08ts.F90
@@ -0,0 +1,49 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Iallgather_f08ts(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, &
+    comm, request, ierror)
+    use :: mpi_f08, only : MPI_Datatype, MPI_Comm, MPI_Request
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Datatype, c_Comm, c_Request
+    use :: mpi_c_interface, only : MPIR_Iallgather_cdesc
+
+    implicit none
+
+    type(*), dimension(..), intent(in), asynchronous :: sendbuf
+    type(*), dimension(..), asynchronous :: recvbuf
+    integer, intent(in) :: sendcount
+    integer, intent(in) :: recvcount
+    type(MPI_Datatype), intent(in) :: sendtype
+    type(MPI_Datatype), intent(in) :: recvtype
+    type(MPI_Comm), intent(in) :: comm
+    type(MPI_Request), intent(out) :: request
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: sendcount_c
+    integer(c_int) :: recvcount_c
+    integer(c_Datatype) :: sendtype_c
+    integer(c_Datatype) :: recvtype_c
+    integer(c_Comm) :: comm_c
+    integer(c_Request) :: request_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Iallgather_cdesc(sendbuf, sendcount, sendtype%MPI_VAL, recvbuf, recvcount, recvtype%MPI_VAL, &
+            comm%MPI_VAL, request%MPI_VAL)
+    else
+        sendcount_c = sendcount
+        sendtype_c = sendtype%MPI_VAL
+        recvcount_c = recvcount
+        recvtype_c = recvtype%MPI_VAL
+        comm_c = comm%MPI_VAL
+        ierror_c = MPIR_Iallgather_cdesc(sendbuf, sendcount_c, sendtype_c, recvbuf, recvcount_c, recvtype_c, &
+            comm_c, request_c)
+        request%MPI_VAL = request_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Iallgather_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/iallgatherv_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/iallgatherv_f08ts.F90
new file mode 100644
index 0000000..82cca83
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/iallgatherv_f08ts.F90
@@ -0,0 +1,55 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Iallgatherv_f08ts(sendbuf, sendcount, sendtype, recvbuf, recvcounts, displs, &
+    recvtype, comm, request, ierror)
+    use :: mpi_f08, only : MPI_Datatype, MPI_Comm, MPI_Request
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Datatype, c_Comm, c_Request
+    use :: mpi_c_interface, only : MPIR_Iallgatherv_cdesc, MPIR_Comm_size_c
+
+    implicit none
+
+    type(*), dimension(..), intent(in), asynchronous :: sendbuf
+    type(*), dimension(..), asynchronous :: recvbuf
+    integer, intent(in)  :: sendcount
+    integer, intent(in)  :: recvcounts(*)
+    integer, intent(in)  :: displs(*)
+    type(MPI_Datatype), intent(in)  :: sendtype
+    type(MPI_Datatype), intent(in)  :: recvtype
+    type(MPI_Comm), intent(in)  :: comm
+    type(MPI_Request), intent(out)  :: request
+    integer, optional, intent(out)  :: ierror
+
+    integer(c_int) :: sendcount_c
+    integer(c_int), allocatable :: recvcounts_c(:)
+    integer(c_int), allocatable :: displs_c(:)
+    integer(c_Datatype) :: sendtype_c
+    integer(c_Datatype) :: recvtype_c
+    integer(c_Comm) :: comm_c
+    integer(c_Request) :: request_c
+    integer(c_int) :: ierror_c
+    integer(c_int) :: err, length ! To get length of assumed-size arrays
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Iallgatherv_cdesc(sendbuf, sendcount, sendtype%MPI_VAL, recvbuf, recvcounts, displs, &
+                     recvtype%MPI_VAL, comm%MPI_VAL, request%MPI_VAL)
+    else
+        sendcount_c = sendcount
+        sendtype_c = sendtype%MPI_VAL
+        recvtype_c = recvtype%MPI_VAL
+        comm_c = comm%MPI_VAL
+        err = MPIR_Comm_size_c(comm_c, length)
+        recvcounts_c = recvcounts(1:length)
+        displs_c = displs(1:length)
+
+        ierror_c = MPIR_Iallgatherv_cdesc(sendbuf, sendcount_c, sendtype_c, recvbuf, recvcounts_c, displs_c, &
+                     recvtype_c, comm_c, request_c)
+         request%MPI_VAL = request_c
+    end if
+
+    if(present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Iallgatherv_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/iallreduce_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/iallreduce_f08ts.F90
new file mode 100644
index 0000000..cce000f
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/iallreduce_f08ts.F90
@@ -0,0 +1,44 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Iallreduce_f08ts(sendbuf, recvbuf, count, datatype, op, comm, request, ierror)
+    use :: mpi_f08, only : MPI_Datatype, MPI_Op, MPI_Comm, MPI_Request
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Datatype, c_Op, c_Comm, c_Request
+    use :: mpi_c_interface, only : MPIR_Iallreduce_cdesc
+
+    implicit none
+
+    type(*), dimension(..), intent(in), asynchronous :: sendbuf
+    type(*), dimension(..), asynchronous :: recvbuf
+    integer, intent(in) :: count
+    type(MPI_Datatype), intent(in) :: datatype
+    type(MPI_Op), intent(in) :: op
+    type(MPI_Comm), intent(in) :: comm
+    type(MPI_Request), intent(out) :: request
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: count_c
+    integer(c_Datatype) :: datatype_c
+    integer(c_Op) :: op_c
+    integer(c_Comm) :: comm_c
+    integer(c_Request) :: request_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Iallreduce_cdesc(sendbuf, recvbuf, count, datatype%MPI_VAL, op%MPI_VAL, comm%MPI_VAL, &
+            request%MPI_VAL)
+    else
+        count_c = count
+        datatype_c = datatype%MPI_VAL
+        op_c = op%MPI_VAL
+        comm_c = comm%MPI_VAL
+        ierror_c = MPIR_Iallreduce_cdesc(sendbuf, recvbuf, count_c, datatype_c, op_c, comm_c, request_c)
+        request%MPI_VAL = request_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Iallreduce_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/ialltoall_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/ialltoall_f08ts.F90
new file mode 100644
index 0000000..431fbbf
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/ialltoall_f08ts.F90
@@ -0,0 +1,49 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Ialltoall_f08ts(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, &
+    comm, request, ierror)
+    use :: mpi_f08, only : MPI_Datatype, MPI_Comm, MPI_Request
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Datatype, c_Comm, c_Request
+    use :: mpi_c_interface, only : MPIR_Ialltoall_cdesc
+
+    implicit none
+
+    type(*), dimension(..), intent(in), asynchronous :: sendbuf
+    type(*), dimension(..), asynchronous :: recvbuf
+    integer, intent(in) :: sendcount
+    integer, intent(in) :: recvcount
+    type(MPI_Datatype), intent(in) :: sendtype
+    type(MPI_Datatype), intent(in) :: recvtype
+    type(MPI_Comm), intent(in) :: comm
+    type(MPI_Request), intent(out) :: request
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: sendcount_c
+    integer(c_int) :: recvcount_c
+    integer(c_Datatype) :: sendtype_c
+    integer(c_Datatype) :: recvtype_c
+    integer(c_Comm) :: comm_c
+    integer(c_Request) :: request_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Ialltoall_cdesc(sendbuf, sendcount, sendtype%MPI_VAL, recvbuf, recvcount, recvtype%MPI_VAL, &
+            comm%MPI_VAL, request%MPI_VAL)
+    else
+        sendcount_c = sendcount
+        sendtype_c = sendtype%MPI_VAL
+        recvcount_c = recvcount
+        recvtype_c = recvtype%MPI_VAL
+        comm_c = comm%MPI_VAL
+        ierror_c = MPIR_Ialltoall_cdesc(sendbuf, sendcount_c, sendtype_c, recvbuf, recvcount_c, recvtype_c, &
+            comm_c, request_c)
+        request%MPI_VAL = request_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Ialltoall_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/ialltoallv_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/ialltoallv_f08ts.F90
new file mode 100644
index 0000000..1fbc70c
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/ialltoallv_f08ts.F90
@@ -0,0 +1,59 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Ialltoallv_f08ts(sendbuf, sendcounts, sdispls, sendtype, recvbuf, recvcounts, &
+    rdispls, recvtype, comm, request, ierror)
+    use :: mpi_f08, only : MPI_Datatype, MPI_Comm, MPI_Request
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Datatype, c_Comm, c_Request
+    use :: mpi_c_interface, only : MPIR_Ialltoallv_cdesc, MPIR_Comm_size_c
+
+    implicit none
+
+    type(*), dimension(..), intent(in), asynchronous :: sendbuf
+    type(*), dimension(..), asynchronous :: recvbuf
+    integer, intent(in)  :: sendcounts(*)
+    integer, intent(in)  :: sdispls(*)
+    integer, intent(in)  :: recvcounts(*)
+    integer, intent(in)  :: rdispls(*)
+    type(MPI_Datatype), intent(in)  :: sendtype
+    type(MPI_Datatype), intent(in)  :: recvtype
+    type(MPI_Comm), intent(in)  :: comm
+    type(MPI_Request), intent(out)  :: request
+    integer, optional, intent(out)  :: ierror
+
+    integer(c_int), allocatable :: sendcounts_c(:)
+    integer(c_int), allocatable :: sdispls_c(:)
+    integer(c_int), allocatable :: recvcounts_c(:)
+    integer(c_int), allocatable :: rdispls_c(:)
+    integer(c_Datatype) :: sendtype_c
+    integer(c_Datatype) :: recvtype_c
+    integer(c_Comm) :: comm_c
+    integer(c_Request) :: request_c
+    integer(c_int) :: ierror_c
+    integer(c_int) :: err, length ! To get length of assumed-size arrays
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Ialltoallv_cdesc(sendbuf, sendcounts, sdispls, sendtype%MPI_VAL, recvbuf, recvcounts, &
+            rdispls, recvtype%MPI_VAL, comm%MPI_VAL, request%MPI_VAL)
+    else
+        sendtype_c = sendtype%MPI_VAL
+        recvtype_c = recvtype%MPI_VAL
+        comm_c = comm%MPI_VAL
+        err = MPIR_Comm_size_c(comm_c, length)
+        sendcounts_c = sendcounts(1:length)
+        sdispls_c = sdispls(1:length)
+        recvcounts_c = recvcounts(1:length)
+        rdispls_c = rdispls(1:length)
+
+        ierror_c = MPIR_Ialltoallv_cdesc(sendbuf, sendcounts_c, sdispls_c, sendtype_c, recvbuf, recvcounts_c, rdispls_c, &
+            recvtype_c, comm_c, request_c)
+
+        request%MPI_VAL = request_c
+    end if
+
+    if(present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Ialltoallv_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/ialltoallw_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/ialltoallw_f08ts.F90
new file mode 100644
index 0000000..acf5341
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/ialltoallw_f08ts.F90
@@ -0,0 +1,59 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Ialltoallw_f08ts(sendbuf, sendcounts, sdispls, sendtypes, recvbuf, recvcounts, &
+    rdispls, recvtypes, comm, request, ierror)
+    use :: mpi_f08, only : MPI_Datatype, MPI_Comm, MPI_Request
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Datatype, c_Comm, c_Request
+    use :: mpi_c_interface, only : MPIR_Ialltoallw_cdesc, MPIR_Comm_size_c
+
+    implicit none
+
+    type(*), dimension(..), intent(in), asynchronous :: sendbuf
+    type(*), dimension(..), asynchronous :: recvbuf
+    integer, intent(in)  :: sendcounts(*)
+    integer, intent(in)  :: sdispls(*)
+    integer, intent(in)  :: recvcounts(*)
+    integer, intent(in)  :: rdispls(*)
+    type(MPI_Datatype), intent(in)  :: sendtypes(*)
+    type(MPI_Datatype), intent(in)  :: recvtypes(*)
+    type(MPI_Comm), intent(in)  :: comm
+    type(MPI_Request), intent(out)  :: request
+    integer, optional, intent(out)  :: ierror
+
+    integer(c_int), allocatable :: sendcounts_c(:)
+    integer(c_int), allocatable :: sdispls_c(:)
+    integer(c_int), allocatable :: recvcounts_c(:)
+    integer(c_int), allocatable :: rdispls_c(:)
+    integer(c_Datatype), allocatable :: sendtypes_c(:)
+    integer(c_Datatype), allocatable :: recvtypes_c(:)
+    integer(c_Comm) :: comm_c
+    integer(c_Request) :: request_c
+    integer(c_int) :: ierror_c
+    integer(c_int) :: err, length ! To get length of assumed-size arrays
+
+    comm_c = comm%MPI_VAL
+    err = MPIR_Comm_size_c(comm_c, length)
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Ialltoallw_cdesc(sendbuf, sendcounts, sdispls, sendtypes(1:length)%MPI_VAL, recvbuf, recvcounts, &
+            rdispls, recvtypes(1:length)%MPI_VAL, comm%MPI_VAL, request%MPI_VAL)
+    else
+        sendtypes_c = sendtypes(1:length)%MPI_VAL
+        recvtypes_c = recvtypes(1:length)%MPI_VAL
+        sendcounts_c = sendcounts(1:length)
+        sdispls_c = sdispls(1:length)
+        recvcounts_c = recvcounts(1:length)
+        rdispls_c = rdispls(1:length)
+
+        ierror_c = MPIR_Ialltoallw_cdesc(sendbuf, sendcounts_c, sdispls_c, sendtypes_c, recvbuf, recvcounts_c, &
+            rdispls_c, recvtypes_c, comm_c, request_c)
+        request%MPI_VAL = request_c
+    end if
+
+    if(present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Ialltoallw_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/ibarrier_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/ibarrier_f08ts.F90
new file mode 100644
index 0000000..d2c821e
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/ibarrier_f08ts.F90
@@ -0,0 +1,32 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Ibarrier_f08(comm, request, ierror)
+    use :: mpi_f08, only : MPI_Comm, MPI_Request
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Comm, c_Request
+    use :: mpi_c_interface, only : MPIR_Ibarrier_c
+
+    implicit none
+
+    type(MPI_Comm), intent(in) :: comm
+    type(MPI_Request), intent(out) :: request
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Comm) :: comm_c
+    integer(c_Request) :: request_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Ibarrier_c(comm%MPI_VAL, request%MPI_VAL)
+    else
+        comm_c = comm%MPI_VAL
+        ierror_c = MPIR_Ibarrier_c(comm_c, request_c)
+        request%MPI_VAL = request_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Ibarrier_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/ibcast_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/ibcast_f08ts.F90
new file mode 100644
index 0000000..962f460
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/ibcast_f08ts.F90
@@ -0,0 +1,42 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Ibcast_f08ts(buffer, count, datatype, root, comm, request, ierror)
+    use :: mpi_f08, only : MPI_Datatype, MPI_Comm, MPI_Request
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Datatype, c_Comm, c_Request
+    use :: mpi_c_interface, only : MPIR_Ibcast_cdesc
+
+    implicit none
+
+    type(*), dimension(..), asynchronous :: buffer
+    integer, intent(in) :: count
+    integer, intent(in) :: root
+    type(MPI_Datatype), intent(in) :: datatype
+    type(MPI_Comm), intent(in) :: comm
+    type(MPI_Request), intent(out) :: request
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: count_c
+    integer(c_int) :: root_c
+    integer(c_Datatype) :: datatype_c
+    integer(c_Comm) :: comm_c
+    integer(c_Request) :: request_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Ibcast_cdesc(buffer, count, datatype%MPI_VAL, root, comm%MPI_VAL, request%MPI_VAL)
+    else
+        count_c = count
+        datatype_c = datatype%MPI_VAL
+        root_c = root
+        comm_c = comm%MPI_VAL
+        ierror_c = MPIR_Ibcast_cdesc(buffer, count_c, datatype_c, root_c, comm_c, request_c)
+        request%MPI_VAL = request_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Ibcast_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/ibsend_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/ibsend_f08ts.F90
new file mode 100644
index 0000000..aa177ab
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/ibsend_f08ts.F90
@@ -0,0 +1,45 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Ibsend_f08ts(buf, count, datatype, dest, tag, comm, request, ierror)
+    use :: mpi_f08, only : MPI_Datatype, MPI_Comm, MPI_Request
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Datatype, c_Comm, c_Request
+    use :: mpi_c_interface, only : MPIR_Ibsend_cdesc
+
+    implicit none
+
+    type(*), dimension(..), intent(in), asynchronous :: buf
+    integer, intent(in) :: count
+    integer, intent(in) :: dest
+    integer, intent(in) :: tag
+    type(MPI_Datatype), intent(in) :: datatype
+    type(MPI_Comm), intent(in) :: comm
+    type(MPI_Request), intent(out) :: request
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: count_c
+    integer(c_int) :: dest_c
+    integer(c_int) :: tag_c
+    integer(c_Datatype) :: datatype_c
+    integer(c_Comm) :: comm_c
+    integer(c_Request) :: request_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Ibsend_cdesc(buf, count, datatype%MPI_VAL, dest, tag, comm%MPI_VAL, request%MPI_VAL)
+    else
+        count_c = count
+        datatype_c = datatype%MPI_VAL
+        dest_c = dest
+        tag_c = tag
+        comm_c = comm%MPI_VAL
+        ierror_c = MPIR_Ibsend_cdesc(buf, count_c, datatype_c, dest_c, tag_c, comm_c, request_c)
+        request%MPI_VAL = request_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Ibsend_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/iexscan_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/iexscan_f08ts.F90
new file mode 100644
index 0000000..53401ac
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/iexscan_f08ts.F90
@@ -0,0 +1,44 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Iexscan_f08ts(sendbuf, recvbuf, count, datatype, op, comm, request, ierror)
+    use :: mpi_f08, only : MPI_Datatype, MPI_Op, MPI_Comm, MPI_Request
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Datatype, c_Op, c_Comm, c_Request
+    use :: mpi_c_interface, only : MPIR_Iexscan_cdesc
+
+    implicit none
+
+    type(*), dimension(..), intent(in), asynchronous :: sendbuf
+    type(*), dimension(..), asynchronous :: recvbuf
+    integer, intent(in) :: count
+    type(MPI_Datatype), intent(in) :: datatype
+    type(MPI_Op), intent(in) :: op
+    type(MPI_Comm), intent(in) :: comm
+    type(MPI_Request), intent(out) :: request
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: count_c
+    integer(c_Datatype) :: datatype_c
+    integer(c_Op) :: op_c
+    integer(c_Comm) :: comm_c
+    integer(c_Request) :: request_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Iexscan_cdesc(sendbuf, recvbuf, count, datatype%MPI_VAL, op%MPI_VAL, comm%MPI_VAL, &
+            request%MPI_VAL)
+    else
+        count_c = count
+        datatype_c = datatype%MPI_VAL
+        op_c = op%MPI_VAL
+        comm_c = comm%MPI_VAL
+        ierror_c = MPIR_Iexscan_cdesc(sendbuf, recvbuf, count_c, datatype_c, op_c, comm_c, request_c)
+        request%MPI_VAL = request_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Iexscan_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/igather_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/igather_f08ts.F90
new file mode 100644
index 0000000..4d9f88f
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/igather_f08ts.F90
@@ -0,0 +1,52 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Igather_f08ts(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, &
+    root, comm, request, ierror)
+    use :: mpi_f08, only : MPI_Datatype, MPI_Comm, MPI_Request
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Datatype, c_Comm, c_Request
+    use :: mpi_c_interface, only : MPIR_Igather_cdesc
+
+    implicit none
+
+    type(*), dimension(..), intent(in), asynchronous :: sendbuf
+    type(*), dimension(..), asynchronous :: recvbuf
+    integer, intent(in) :: sendcount
+    integer, intent(in) :: recvcount
+    integer, intent(in) :: root
+    type(MPI_Datatype), intent(in) :: sendtype
+    type(MPI_Datatype), intent(in) :: recvtype
+    type(MPI_Comm), intent(in) :: comm
+    type(MPI_Request), intent(out) :: request
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: sendcount_c
+    integer(c_int) :: recvcount_c
+    integer(c_int) :: root_c
+    integer(c_Datatype) :: sendtype_c
+    integer(c_Datatype) :: recvtype_c
+    integer(c_Comm) :: comm_c
+    integer(c_Request) :: request_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Igather_cdesc(sendbuf, sendcount, sendtype%MPI_VAL, recvbuf, recvcount, recvtype%MPI_VAL, &
+            root, comm%MPI_VAL, request%MPI_VAL)
+    else
+        sendcount_c = sendcount
+        sendtype_c = sendtype%MPI_VAL
+        recvcount_c = recvcount
+        recvtype_c = recvtype%MPI_VAL
+        root_c = root
+        comm_c = comm%MPI_VAL
+        ierror_c = MPIR_Igather_cdesc(sendbuf, sendcount_c, sendtype_c, recvbuf, recvcount_c, recvtype_c, &
+            root_c, comm_c, request_c)
+        request%MPI_VAL = request_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Igather_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/igatherv_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/igatherv_f08ts.F90
new file mode 100644
index 0000000..dc34238
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/igatherv_f08ts.F90
@@ -0,0 +1,58 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Igatherv_f08ts(sendbuf, sendcount, sendtype, recvbuf, recvcounts, displs, &
+    recvtype, root, comm, request, ierror)
+    use :: mpi_f08, only : MPI_Datatype, MPI_Comm, MPI_Request
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Datatype, c_Comm, c_Request
+    use :: mpi_c_interface, only : MPIR_Igatherv_cdesc, MPIR_Comm_size_c
+
+    implicit none
+
+    type(*), dimension(..), intent(in), asynchronous :: sendbuf
+    type(*), dimension(..), asynchronous :: recvbuf
+    integer, intent(in)  :: sendcount
+    integer, intent(in)  :: root
+    integer, intent(in)  :: recvcounts(*)
+    integer, intent(in)  :: displs(*)
+    type(MPI_Datatype), intent(in)  :: sendtype
+    type(MPI_Datatype), intent(in)  :: recvtype
+    type(MPI_Comm), intent(in)  :: comm
+    type(MPI_Request), intent(out)  :: request
+    integer, optional, intent(out)  :: ierror
+
+    integer(c_int) :: sendcount_c
+    integer(c_int) :: root_c
+    integer(c_int), allocatable :: recvcounts_c(:)
+    integer(c_int), allocatable :: displs_c(:)
+    integer(c_Datatype) :: sendtype_c
+    integer(c_Datatype) :: recvtype_c
+    integer(c_Comm) :: comm_c
+    integer(c_Request) :: request_c
+    integer(c_int) :: ierror_c
+    integer(c_int) :: err, length ! To get length of assumed-size arrays
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Igatherv_cdesc(sendbuf, sendcount, sendtype%MPI_VAL, recvbuf, recvcounts, displs, recvtype%MPI_VAL, &
+            root, comm%MPI_VAL, request%MPI_VAL)
+    else
+        sendcount_c = sendcount
+        sendtype_c = sendtype%MPI_VAL
+        recvtype_c = recvtype%MPI_VAL
+        root_c = root
+        comm_c = comm%MPI_VAL
+        err = MPIR_Comm_size_c(comm_c, length)
+        recvcounts_c = recvcounts(1:length)
+        displs_c = displs(1:length)
+
+        ierror_c = MPIR_Igatherv_cdesc(sendbuf, sendcount_c, sendtype_c, recvbuf, recvcounts_c, displs_c, recvtype_c,  &
+            root_c, comm_c, request_c)
+        request%MPI_VAL = request_c
+    end if
+
+    if(present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Igatherv_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/improbe_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/improbe_f08ts.F90
new file mode 100644
index 0000000..75be230
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/improbe_f08ts.F90
@@ -0,0 +1,55 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Improbe_f08(source, tag, comm, flag, message, status, ierror)
+    use :: mpi_f08, only : MPI_Comm, MPI_Message, MPI_Status
+    use, intrinsic :: iso_c_binding, only : c_loc, c_associated
+    use :: mpi_f08, only : MPI_STATUS_IGNORE, MPIR_C_MPI_STATUS_IGNORE, assignment(=)
+    use, intrinsic :: iso_c_binding, only : c_int, c_ptr
+    use :: mpi_c_interface, only : c_Comm, c_Message
+    use :: mpi_c_interface, only : c_Status
+    use :: mpi_c_interface, only : MPIR_Improbe_c
+
+    implicit none
+
+    integer, intent(in) :: source
+    integer, intent(in) :: tag
+    type(MPI_Comm), intent(in) :: comm
+    logical, intent(out) :: flag
+    type(MPI_Message), intent(out) :: message
+    type(MPI_Status), target :: status
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: source_c
+    integer(c_int) :: tag_c
+    integer(c_Comm) :: comm_c
+    integer(c_int) :: flag_c
+    integer(c_Message) :: message_c
+    type(c_Status), target :: status_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        if (c_associated(c_loc(status), c_loc(MPI_STATUS_IGNORE))) then
+            ierror_c = MPIR_Improbe_c(source, tag, comm%MPI_VAL, flag_c, message%MPI_VAL, MPIR_C_MPI_STATUS_IGNORE)
+        else
+            ierror_c = MPIR_Improbe_c(source, tag, comm%MPI_VAL, flag_c, message%MPI_VAL, c_loc(status))
+        end if
+    else
+        source_c = source
+        tag_c = tag
+        comm_c = comm%MPI_VAL
+        if (c_associated(c_loc(status), c_loc(MPI_STATUS_IGNORE))) then
+            ierror_c = MPIR_Improbe_c(source_c, tag_c, comm_c, flag_c, message_c, MPIR_C_MPI_STATUS_IGNORE)
+        else
+            ierror_c = MPIR_Improbe_c(source_c, tag_c, comm_c, flag_c, message_c, c_loc(status_c))
+            status = status_c
+        end if
+        message%MPI_VAL = message_c
+    end if
+
+    flag = (flag_c /= 0)
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Improbe_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/imrecv_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/imrecv_f08ts.F90
new file mode 100644
index 0000000..525e5ed
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/imrecv_f08ts.F90
@@ -0,0 +1,40 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Imrecv_f08ts(buf, count, datatype, message, request, ierror)
+    use :: mpi_f08, only : MPI_Datatype, MPI_Message, MPI_Request
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Datatype, c_Message, c_Request
+    use :: mpi_c_interface, only : MPIR_Imrecv_cdesc
+
+    implicit none
+
+    type(*), dimension(..), asynchronous :: buf
+    integer, intent(in) :: count
+    type(MPI_Datatype), intent(in) :: datatype
+    type(MPI_Message), intent(inout) :: message
+    type(MPI_Request), intent(out) :: request
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: count_c
+    integer(c_Datatype) :: datatype_c
+    integer(c_Message) :: message_c
+    integer(c_Request) :: request_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Imrecv_cdesc(buf, count, datatype%MPI_VAL, message%MPI_VAL, request%MPI_VAL)
+    else
+        count_c = count
+        datatype_c = datatype%MPI_VAL
+        message_c = message%MPI_VAL
+        ierror_c = MPIR_Imrecv_cdesc(buf, count_c, datatype_c, message_c, request_c)
+        message%MPI_VAL = message_c
+        request%MPI_VAL = request_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Imrecv_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/ineighbor_allgather_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/ineighbor_allgather_f08ts.F90
new file mode 100644
index 0000000..b027c44
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/ineighbor_allgather_f08ts.F90
@@ -0,0 +1,49 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Ineighbor_allgather_f08ts(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, &
+    comm, request, ierror)
+    use :: mpi_f08, only : MPI_Datatype, MPI_Comm, MPI_Request
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Datatype, c_Comm, c_Request
+    use :: mpi_c_interface, only : MPIR_Ineighbor_allgather_cdesc
+
+    implicit none
+
+    type(*), dimension(..), intent(in), asynchronous :: sendbuf
+    type(*), dimension(..), asynchronous :: recvbuf
+    integer, intent(in) :: sendcount
+    integer, intent(in) :: recvcount
+    type(MPI_Datatype), intent(in) :: sendtype
+    type(MPI_Datatype), intent(in) :: recvtype
+    type(MPI_Comm), intent(in) :: comm
+    type(MPI_Request), intent(out) :: request
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: sendcount_c
+    integer(c_int) :: recvcount_c
+    integer(c_Datatype) :: sendtype_c
+    integer(c_Datatype) :: recvtype_c
+    integer(c_Comm) :: comm_c
+    integer(c_Request) :: request_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Ineighbor_allgather_cdesc(sendbuf, sendcount, sendtype%MPI_VAL, recvbuf, recvcount, &
+            recvtype%MPI_VAL, comm%MPI_VAL, request%MPI_VAL)
+    else
+        sendcount_c = sendcount
+        sendtype_c = sendtype%MPI_VAL
+        recvcount_c = recvcount
+        recvtype_c = recvtype%MPI_VAL
+        comm_c = comm%MPI_VAL
+        ierror_c = MPIR_Ineighbor_allgather_cdesc(sendbuf, sendcount_c, sendtype_c, recvbuf, recvcount_c, &
+            recvtype_c, comm_c, request_c)
+        request%MPI_VAL = request_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Ineighbor_allgather_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/ineighbor_allgatherv_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/ineighbor_allgatherv_f08ts.F90
new file mode 100644
index 0000000..32459af
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/ineighbor_allgatherv_f08ts.F90
@@ -0,0 +1,55 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Ineighbor_allgatherv_f08ts(sendbuf, sendcount, sendtype, recvbuf, recvcounts, displs, &
+    recvtype, comm, request, ierror)
+    use :: mpi_f08, only : MPI_Datatype, MPI_Comm, MPI_Request
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Datatype, c_Comm, c_Request
+    use :: mpi_c_interface, only : MPIR_Ineighbor_allgatherv_cdesc, MPIR_Dist_graph_neighbors_count_c
+
+    implicit none
+
+    type(*), dimension(..), intent(in), asynchronous :: sendbuf
+    type(*), dimension(..), asynchronous :: recvbuf
+    integer, intent(in)  :: sendcount
+    integer, intent(in)  :: recvcounts(*)
+    integer, intent(in)  :: displs(*)
+    type(MPI_Datatype), intent(in)  :: sendtype
+    type(MPI_Datatype), intent(in)  :: recvtype
+    type(MPI_Comm), intent(in)  :: comm
+    type(MPI_Request), intent(out)  :: request
+    integer, optional, intent(out)  :: ierror
+
+    integer(c_int) :: sendcount_c
+    integer(c_int), allocatable :: recvcounts_c(:)
+    integer(c_int), allocatable :: displs_c(:)
+    integer(c_Datatype) :: sendtype_c
+    integer(c_Datatype) :: recvtype_c
+    integer(c_Comm) :: comm_c
+    integer(c_Request) :: request_c
+    integer(c_int) :: ierror_c
+    integer(c_int) :: err, indegree, outdegree, weighted ! To get length of assumed-size arrays
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Ineighbor_allgatherv_cdesc(sendbuf, sendcount, sendtype%MPI_VAL, recvbuf, &
+            recvcounts, displs, recvtype%MPI_VAL, comm%MPI_VAL, request%MPI_VAL)
+    else
+        sendcount_c = sendcount
+        sendtype_c = sendtype%MPI_VAL
+        recvtype_c = recvtype%MPI_VAL
+        comm_c = comm%MPI_VAL
+        err = MPIR_Dist_graph_neighbors_count_c(comm_c, indegree, outdegree, weighted)
+        recvcounts_c = recvcounts(1:indegree)
+        displs_c = displs(1:indegree)
+
+        ierror_c = MPIR_Ineighbor_allgatherv_cdesc(sendbuf, sendcount_c, sendtype_c, recvbuf, recvcounts_c, displs_c, &
+            recvtype_c, comm_c, request_c)
+    end if
+
+    request%MPI_VAL = request_c
+    if(present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Ineighbor_allgatherv_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/ineighbor_alltoall_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/ineighbor_alltoall_f08ts.F90
new file mode 100644
index 0000000..d08230c
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/ineighbor_alltoall_f08ts.F90
@@ -0,0 +1,49 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Ineighbor_alltoall_f08ts(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, &
+    comm, request, ierror)
+    use :: mpi_f08, only : MPI_Datatype, MPI_Comm, MPI_Request
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Datatype, c_Comm, c_Request
+    use :: mpi_c_interface, only : MPIR_Ineighbor_alltoall_cdesc
+
+    implicit none
+
+    type(*), dimension(..), intent(in), asynchronous :: sendbuf
+    type(*), dimension(..), asynchronous :: recvbuf
+    integer, intent(in) :: sendcount
+    integer, intent(in) :: recvcount
+    type(MPI_Datatype), intent(in) :: sendtype
+    type(MPI_Datatype), intent(in) :: recvtype
+    type(MPI_Comm), intent(in) :: comm
+    type(MPI_Request), intent(out) :: request
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: sendcount_c
+    integer(c_int) :: recvcount_c
+    integer(c_Datatype) :: sendtype_c
+    integer(c_Datatype) :: recvtype_c
+    integer(c_Comm) :: comm_c
+    integer(c_Request) :: request_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Ineighbor_alltoall_cdesc(sendbuf, sendcount, sendtype%MPI_VAL, recvbuf, recvcount, &
+            recvtype%MPI_VAL, comm%MPI_VAL, request%MPI_VAL)
+    else
+        sendcount_c = sendcount
+        sendtype_c = sendtype%MPI_VAL
+        recvcount_c = recvcount
+        recvtype_c = recvtype%MPI_VAL
+        comm_c = comm%MPI_VAL
+        ierror_c = MPIR_Ineighbor_alltoall_cdesc(sendbuf, sendcount_c, sendtype_c, recvbuf, recvcount_c, &
+            recvtype_c, comm_c, request_c)
+        request%MPI_VAL = request_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Ineighbor_alltoall_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/ineighbor_alltoallv_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/ineighbor_alltoallv_f08ts.F90
new file mode 100644
index 0000000..f856b0f
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/ineighbor_alltoallv_f08ts.F90
@@ -0,0 +1,58 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Ineighbor_alltoallv_f08ts(sendbuf, sendcounts, sdispls, sendtype, recvbuf, recvcounts, &
+    rdispls, recvtype, comm, request, ierror)
+    use :: mpi_f08, only : MPI_Datatype, MPI_Comm, MPI_Request
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Datatype, c_Comm, c_Request
+    use :: mpi_c_interface, only : MPIR_Ineighbor_alltoallv_cdesc, MPIR_Dist_graph_neighbors_count_c
+
+    implicit none
+
+    type(*), dimension(..), intent(in), asynchronous :: sendbuf
+    type(*), dimension(..), asynchronous :: recvbuf
+    integer, intent(in)  :: sendcounts(*)
+    integer, intent(in)  :: sdispls(*)
+    integer, intent(in)  :: recvcounts(*)
+    integer, intent(in)  :: rdispls(*)
+    type(MPI_Datatype), intent(in)  :: sendtype
+    type(MPI_Datatype), intent(in)  :: recvtype
+    type(MPI_Comm), intent(in)  :: comm
+    type(MPI_Request), intent(in)  :: request
+    integer, optional, intent(out)  :: ierror
+
+    integer(c_int), allocatable :: sendcounts_c(:)
+    integer(c_int), allocatable :: sdispls_c(:)
+    integer(c_int), allocatable :: recvcounts_c(:)
+    integer(c_int), allocatable :: rdispls_c(:)
+    integer(c_Datatype) :: sendtype_c
+    integer(c_Datatype) :: recvtype_c
+    integer(c_Comm) :: comm_c
+    integer(c_Request) :: request_c
+    integer(c_int) :: ierror_c
+    integer(c_int) :: err, indegree, outdegree, weighted
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Ineighbor_alltoallv_cdesc(sendbuf, sendcounts, sdispls, sendtype%MPI_VAL, recvbuf, &
+            recvcounts, rdispls, recvtype%MPI_VAL, comm%MPI_VAL, request%MPI_VAL)
+    else
+        sendtype_c = sendtype%MPI_VAL
+        recvtype_c = recvtype%MPI_VAL
+        comm_c = comm%MPI_VAL
+        request_c = request%MPI_VAL
+        err = MPIR_Dist_graph_neighbors_count_c(comm_c, indegree, outdegree, weighted)
+        sendcounts_c = sendcounts(1:outdegree)
+        sdispls_c = sdispls(1:outdegree)
+        recvcounts_c = recvcounts(1:indegree)
+        rdispls_c = rdispls(1:indegree)
+
+        ierror_c = MPIR_Ineighbor_alltoallv_cdesc(sendbuf, sendcounts_c, sdispls_c, sendtype_c, recvbuf, recvcounts_c, &
+            rdispls_c, recvtype_c, comm_c, request_c)
+    end if
+
+    if(present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Ineighbor_alltoallv_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/ineighbor_alltoallw_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/ineighbor_alltoallw_f08ts.F90
new file mode 100644
index 0000000..ecfb37f
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/ineighbor_alltoallw_f08ts.F90
@@ -0,0 +1,56 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Ineighbor_alltoallw_f08ts(sendbuf, sendcounts, sdispls, sendtypes, recvbuf, recvcounts, &
+    rdispls, recvtypes, comm, request, ierror)
+    use :: mpi_f08, only : MPI_Datatype, MPI_Comm, MPI_Request
+    use :: mpi_f08, only : MPI_ADDRESS_KIND
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Datatype, c_Comm, c_Request
+    use :: mpi_c_interface, only : MPIR_Ineighbor_alltoallw_cdesc, MPIR_Dist_graph_neighbors_count_c
+
+    implicit none
+
+    type(*), dimension(..), intent(in), asynchronous :: sendbuf
+    type(*), dimension(..), asynchronous :: recvbuf
+    integer, intent(in)  :: sendcounts(*)
+    integer, intent(in)  :: recvcounts(*)
+    integer(MPI_ADDRESS_KIND), intent(in)  :: sdispls(*)
+    integer(MPI_ADDRESS_KIND), intent(in)  :: rdispls(*)
+    type(MPI_Datatype), intent(in)  :: sendtypes(*)
+    type(MPI_Datatype), intent(in)  :: recvtypes(*)
+    type(MPI_Comm), intent(in)  :: comm
+    type(MPI_Request), intent(in)  :: request
+    integer, optional, intent(out)  :: ierror
+
+    integer(c_int), allocatable :: sendcounts_c(:)
+    integer(c_int), allocatable :: recvcounts_c(:)
+    integer(MPI_ADDRESS_KIND), allocatable :: sdispls_c(:)
+    integer(MPI_ADDRESS_KIND), allocatable :: rdispls_c(:)
+    integer(c_Datatype), allocatable :: sendtypes_c(:)
+    integer(c_Datatype), allocatable :: recvtypes_c(:)
+    integer(c_Comm) :: comm_c
+    integer(c_Request) :: request_c
+    integer(c_int) :: ierror_c
+    integer(c_int) :: err, indegree, outdegree, weighted ! To get length of assumed-size arrays
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Ineighbor_alltoallw_cdesc(sendbuf, sendcounts, sdispls, sendtypes%MPI_VAL, recvbuf, &
+            recvcounts, rdispls, recvtypes%MPI_VAL, comm%MPI_VAL, request%MPI_VAL)
+    else
+        comm_c = comm%MPI_VAL
+        request_c = request%MPI_VAL
+        err = MPIR_Dist_graph_neighbors_count_c(comm_c, indegree, outdegree, weighted)
+        sendtypes_c = sendtypes(1:outdegree)%MPI_VAL
+        recvtypes_c = recvtypes(1:indegree)%MPI_VAL
+        sendcounts_c = sendcounts(1:outdegree)
+        recvcounts_c = recvcounts(1:indegree)
+        ierror_c = MPIR_Ineighbor_alltoallw_cdesc(sendbuf, sendcounts_c, sdispls, sendtypes_c, recvbuf, recvcounts_c, &
+            rdispls, recvtypes_c, comm_c, request_c)
+    end if
+
+    if(present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Ineighbor_alltoallw_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/info_create_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/info_create_f08ts.F90
new file mode 100644
index 0000000..1caf118
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/info_create_f08ts.F90
@@ -0,0 +1,29 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Info_create_f08(info, ierror)
+    use :: mpi_f08, only : MPI_Info
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Info
+    use :: mpi_c_interface, only : MPIR_Info_create_c
+
+    implicit none
+
+    type(MPI_Info), intent(out) :: info
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Info) :: info_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Info_create_c(info%MPI_VAL)
+    else
+        ierror_c = MPIR_Info_create_c(info_c)
+        info%MPI_VAL = info_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Info_create_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/info_delete_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/info_delete_f08ts.F90
new file mode 100644
index 0000000..2d82728
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/info_delete_f08ts.F90
@@ -0,0 +1,34 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Info_delete_f08(info, key, ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_char
+    use :: mpi_f08, only : MPI_Info
+    use :: mpi_c_interface, only : c_Info
+    use :: mpi_c_interface, only : MPIR_Info_delete_c
+    use :: mpi_c_interface, only : MPIR_Fortran_string_f2c
+
+    implicit none
+
+    type(MPI_Info), intent(in) :: info
+    character(len=*), intent(in) :: key
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Info) :: info_c
+    character(kind=c_char) :: key_c(len_trim(key)+1)
+    integer(c_int) :: ierror_c
+
+    call MPIR_Fortran_string_f2c(key, key_c)
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Info_delete_c(info%MPI_VAL, key_c)
+    else
+        info_c = info%MPI_VAL
+        ierror_c = MPIR_Info_delete_c(info_c, key_c)
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Info_delete_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/info_dup_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/info_dup_f08ts.F90
new file mode 100644
index 0000000..7746d4e
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/info_dup_f08ts.F90
@@ -0,0 +1,32 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Info_dup_f08(info, newinfo, ierror)
+    use :: mpi_f08, only : MPI_Info
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Info
+    use :: mpi_c_interface, only : MPIR_Info_dup_c
+
+    implicit none
+
+    type(MPI_Info), intent(in) :: info
+    type(MPI_Info), intent(out) :: newinfo
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Info) :: info_c
+    integer(c_Info) :: newinfo_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Info_dup_c(info%MPI_VAL, newinfo%MPI_VAL)
+    else
+        info_c = info%MPI_VAL
+        ierror_c = MPIR_Info_dup_c(info_c, newinfo_c)
+        newinfo%MPI_VAL = newinfo_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Info_dup_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/info_free_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/info_free_f08ts.F90
new file mode 100644
index 0000000..1179776
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/info_free_f08ts.F90
@@ -0,0 +1,30 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Info_free_f08(info, ierror)
+    use :: mpi_f08, only : MPI_Info
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Info
+    use :: mpi_c_interface, only : MPIR_Info_free_c
+
+    implicit none
+
+    type(MPI_Info), intent(inout) :: info
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Info) :: info_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Info_free_c(info%MPI_VAL)
+    else
+        info_c = info%MPI_VAL
+        ierror_c = MPIR_Info_free_c(info_c)
+        info%MPI_VAL = info_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Info_free_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/info_get_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/info_get_f08ts.F90
new file mode 100644
index 0000000..a61bd68
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/info_get_f08ts.F90
@@ -0,0 +1,45 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Info_get_f08(info, key, valuelen, value, flag, ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_char
+    use :: mpi_f08, only : MPI_Info
+    use :: mpi_c_interface, only : c_Info
+    use :: mpi_c_interface, only : MPIR_Info_get_c
+    use :: mpi_c_interface, only : MPIR_Fortran_string_c2f
+    use :: mpi_c_interface, only : MPIR_Fortran_string_f2c
+
+    implicit none
+
+    type(MPI_Info), intent(in) :: info
+    character(len=*), intent(in) :: key
+    integer, intent(in) :: valuelen
+    character(len=valuelen), intent(out) :: value
+    logical, intent(out) :: flag
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Info) :: info_c
+    character(kind=c_char) :: key_c(len_trim(key)+1)
+    integer(c_int) :: valuelen_c
+    character(kind=c_char) :: value_c(valuelen+1)
+    integer(c_int) :: flag_c
+    integer(c_int) :: ierror_c
+
+    call MPIR_Fortran_string_f2c(key, key_c)
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Info_get_c(info%MPI_VAL, key_c, valuelen, value_c, flag_c)
+    else
+        info_c = info%MPI_VAL
+        valuelen_c = valuelen
+        ierror_c = MPIR_Info_get_c(info_c, key_c, valuelen_c, value_c, flag_c)
+    end if
+
+    call MPIR_Fortran_string_c2f(value_c, value)
+
+    flag = (flag_c /= 0)
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Info_get_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/info_get_nkeys_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/info_get_nkeys_f08ts.F90
new file mode 100644
index 0000000..d217520
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/info_get_nkeys_f08ts.F90
@@ -0,0 +1,32 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Info_get_nkeys_f08(info, nkeys, ierror)
+    use :: mpi_f08, only : MPI_Info
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Info
+    use :: mpi_c_interface, only : MPIR_Info_get_nkeys_c
+
+    implicit none
+
+    type(MPI_Info), intent(in) :: info
+    integer, intent(out) :: nkeys
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Info) :: info_c
+    integer(c_int) :: nkeys_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Info_get_nkeys_c(info%MPI_VAL, nkeys)
+    else
+        info_c = info%MPI_VAL
+        ierror_c = MPIR_Info_get_nkeys_c(info_c, nkeys_c)
+        nkeys = nkeys_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Info_get_nkeys_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/info_get_nthkey_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/info_get_nthkey_f08ts.F90
new file mode 100644
index 0000000..629d952
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/info_get_nthkey_f08ts.F90
@@ -0,0 +1,37 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Info_get_nthkey_f08(info, n,key, ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_char
+    use :: mpi_f08, only : MPI_Info
+    use :: mpi_c_interface, only : c_Info
+    use :: mpi_c_interface, only : MPIR_Info_get_nthkey_c
+    use :: mpi_c_interface, only : MPIR_Fortran_string_c2f
+
+    implicit none
+
+    type(MPI_Info), intent(in) :: info
+    integer, intent(in) :: n
+    character(len=*), intent(out) :: key
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Info) :: info_c
+    integer(c_int) :: n_c
+    character(kind=c_char) :: key_c(len(key)+1)
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Info_get_nthkey_c(info%MPI_VAL, n, key_c)
+    else
+        info_c = info%MPI_VAL
+        n_c = n
+        ierror_c = MPIR_Info_get_nthkey_c(info_c, n_c, key_c)
+    end if
+
+    call MPIR_Fortran_string_c2f(key_c, key)
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Info_get_nthkey_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/info_get_valuelen_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/info_get_valuelen_f08ts.F90
new file mode 100644
index 0000000..86d8582
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/info_get_valuelen_f08ts.F90
@@ -0,0 +1,40 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Info_get_valuelen_f08(info, key, valuelen, flag, ierror)
+    use :: mpi_f08, only : MPI_Info
+    use, intrinsic :: iso_c_binding, only : c_int, c_char
+    use :: mpi_c_interface, only : c_Info
+    use :: mpi_c_interface, only : MPIR_Info_get_valuelen_c
+
+    use :: mpi_c_interface, only : MPIR_Fortran_string_f2c
+    implicit none
+
+    type(MPI_Info), intent(in) :: info
+    character(len=*), intent(in) :: key
+    integer, intent(out) :: valuelen
+    logical, intent(out) :: flag
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Info) :: info_c
+    character(kind=c_char) :: key_c(len_trim(key)+1)
+    integer(c_int) :: valuelen_c
+    integer(c_int) :: flag_c
+    integer(c_int) :: ierror_c
+
+    call MPIR_Fortran_string_f2c(key, key_c)
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Info_get_valuelen_c(info%MPI_VAL, key_c, valuelen, flag_c)
+    else
+        info_c = info%MPI_VAL
+        ierror_c = MPIR_Info_get_valuelen_c(info_c, key_c, valuelen_c, flag_c)
+        valuelen = valuelen_c
+    end if
+
+    flag = (flag_c /= 0)
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Info_get_valuelen_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/info_set_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/info_set_f08ts.F90
new file mode 100644
index 0000000..5e2e02c
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/info_set_f08ts.F90
@@ -0,0 +1,38 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Info_set_f08(info, key, value, ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_char
+    use :: mpi_f08, only : MPI_Info
+    use :: mpi_c_interface, only : c_Info
+    use :: mpi_c_interface, only : MPIR_Info_set_c
+    use :: mpi_c_interface, only : MPIR_Fortran_string_f2c
+
+    implicit none
+
+    type(MPI_Info), intent(in) :: info
+    character(len=*), intent(in) :: key
+    character(len=*), intent(in) :: value
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Info) :: info_c
+    character(kind=c_char) :: key_c(len_trim(key)+1)
+    character(kind=c_char) :: value_c(len_trim(value)+1)
+    integer(c_int) :: ierror_c
+
+    call MPIR_Fortran_string_f2c(key, key_c)
+
+    call MPIR_Fortran_string_f2c(value, value_c)
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Info_set_c(info%MPI_VAL, key_c, value_c)
+    else
+        info_c = info%MPI_VAL
+        ierror_c = MPIR_Info_set_c(info_c, key_c, value_c)
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Info_set_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/init_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/init_f08ts.F90
new file mode 100644
index 0000000..2b32fca
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/init_f08ts.F90
@@ -0,0 +1,19 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Init_f08(ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_loc, C_NULL_PTR
+    use :: mpi_c_interface, only : MPIR_Init_c
+
+    implicit none
+
+    integer, optional, intent(out) :: ierror
+    integer(c_int) :: ierror_c
+
+    ierror_c = MPIR_Init_c(C_NULL_PTR, C_NULL_PTR)
+
+    if(present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Init_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/init_thread_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/init_thread_f08ts.F90
new file mode 100644
index 0000000..e67d685
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/init_thread_f08ts.F90
@@ -0,0 +1,30 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Init_thread_f08(required, provided, ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, C_NULL_PTR
+    use :: mpi_c_interface, only : MPIR_Init_thread_c
+
+    implicit none
+
+    integer, intent(in) :: required
+    integer, intent(out) :: provided
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: required_c
+    integer(c_int) :: provided_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Init_thread_c(C_NULL_PTR, C_NULL_PTR, required, provided)
+    else
+        required_c = required
+        ierror_c = MPIR_Init_thread_c(C_NULL_PTR, C_NULL_PTR, required_c, provided_c)
+        provided = provided_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Init_thread_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/initialized_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/initialized_f08ts.F90
new file mode 100644
index 0000000..25c57fe
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/initialized_f08ts.F90
@@ -0,0 +1,23 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Initialized_f08(flag, ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : MPIR_Initialized_c
+
+    implicit none
+
+    logical, intent(out) :: flag
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: flag_c
+    integer(c_int) :: ierror_c
+
+    ierror_c = MPIR_Initialized_c(flag_c)
+
+    flag = (flag_c /= 0)
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Initialized_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/intercomm_create_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/intercomm_create_f08ts.F90
new file mode 100644
index 0000000..96d2d06
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/intercomm_create_f08ts.F90
@@ -0,0 +1,47 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Intercomm_create_f08(local_comm, local_leader, peer_comm, remote_leader, &
+    tag, newintercomm, ierror)
+    use :: mpi_f08, only : MPI_Comm
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Comm
+    use :: mpi_c_interface, only : MPIR_Intercomm_create_c
+
+    implicit none
+
+    type(MPI_Comm), intent(in) :: local_comm
+    type(MPI_Comm), intent(in) :: peer_comm
+    integer, intent(in) :: local_leader
+    integer, intent(in) :: remote_leader
+    integer, intent(in) :: tag
+    type(MPI_Comm), intent(out) :: newintercomm
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Comm) :: local_comm_c
+    integer(c_Comm) :: peer_comm_c
+    integer(c_int) :: local_leader_c
+    integer(c_int) :: remote_leader_c
+    integer(c_int) :: tag_c
+    integer(c_Comm) :: newintercomm_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Intercomm_create_c(local_comm%MPI_VAL, local_leader, peer_comm%MPI_VAL, remote_leader, &
+            tag, newintercomm%MPI_VAL)
+    else
+        local_comm_c = local_comm%MPI_VAL
+        local_leader_c = local_leader
+        peer_comm_c = peer_comm%MPI_VAL
+        remote_leader_c = remote_leader
+        tag_c = tag
+        ierror_c = MPIR_Intercomm_create_c(local_comm_c, local_leader_c, peer_comm_c, remote_leader_c, &
+            tag_c, newintercomm_c)
+        newintercomm%MPI_VAL = newintercomm_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Intercomm_create_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/intercomm_merge_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/intercomm_merge_f08ts.F90
new file mode 100644
index 0000000..708eced
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/intercomm_merge_f08ts.F90
@@ -0,0 +1,35 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Intercomm_merge_f08(intercomm, high, newintracomm, ierror)
+    use :: mpi_f08, only : MPI_Comm
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Comm
+    use :: mpi_c_interface, only : MPIR_Intercomm_merge_c
+
+    implicit none
+
+    type(MPI_Comm), intent(in) :: intercomm
+    logical, intent(in) :: high
+    type(MPI_Comm), intent(out) :: newintracomm
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Comm) :: intercomm_c
+    integer(c_int) :: high_c
+    integer(c_Comm) :: newintracomm_c
+    integer(c_int) :: ierror_c
+
+    high_c = merge(1, 0, high)
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Intercomm_merge_c(intercomm%MPI_VAL, high_c, newintracomm%MPI_VAL)
+    else
+        intercomm_c = intercomm%MPI_VAL
+        ierror_c = MPIR_Intercomm_merge_c(intercomm_c, high_c, newintracomm_c)
+        newintracomm%MPI_VAL = newintracomm_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Intercomm_merge_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/iprobe_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/iprobe_f08ts.F90
new file mode 100644
index 0000000..a0fe653
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/iprobe_f08ts.F90
@@ -0,0 +1,52 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Iprobe_f08(source, tag, comm, flag, status, ierror)
+    use :: mpi_f08, only : MPI_Comm, MPI_Status
+    use, intrinsic :: iso_c_binding, only : c_loc, c_associated
+    use :: mpi_f08, only : MPI_STATUS_IGNORE, MPIR_C_MPI_STATUS_IGNORE, assignment(=)
+    use, intrinsic :: iso_c_binding, only : c_int, c_ptr
+    use :: mpi_c_interface, only : c_Comm
+    use :: mpi_c_interface, only : c_Status
+    use :: mpi_c_interface, only : MPIR_Iprobe_c
+
+    implicit none
+
+    integer, intent(in) :: source
+    integer, intent(in) :: tag
+    type(MPI_Comm), intent(in) :: comm
+    logical, intent(out) :: flag
+    type(MPI_Status), target :: status
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: source_c
+    integer(c_int) :: tag_c
+    integer(c_Comm) :: comm_c
+    integer(c_int) :: flag_c
+    type(c_Status), target :: status_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        if (c_associated(c_loc(status), c_loc(MPI_STATUS_IGNORE))) then
+            ierror_c = MPIR_Iprobe_c(source, tag, comm%MPI_VAL, flag_c, MPIR_C_MPI_STATUS_IGNORE)
+        else
+            ierror_c = MPIR_Iprobe_c(source, tag, comm%MPI_VAL, flag_c, c_loc(status))
+        end if
+    else
+        source_c = source
+        tag_c = tag
+        comm_c = comm%MPI_VAL
+        if (c_associated(c_loc(status), c_loc(MPI_STATUS_IGNORE))) then
+            ierror_c = MPIR_Iprobe_c(source_c, tag_c, comm_c, flag_c, MPIR_C_MPI_STATUS_IGNORE)
+        else
+            ierror_c = MPIR_Iprobe_c(source_c, tag_c, comm_c, flag_c, c_loc(status_c))
+            status = status_c
+        end if
+    end if
+
+    flag = (flag_c /= 0)
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Iprobe_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/irecv_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/irecv_f08ts.F90
new file mode 100644
index 0000000..6441387
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/irecv_f08ts.F90
@@ -0,0 +1,45 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Irecv_f08ts(buf, count, datatype, source, tag, comm, request, ierror)
+    use :: mpi_f08, only : MPI_Datatype, MPI_Comm, MPI_Request
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Datatype, c_Comm, c_Request
+    use :: mpi_c_interface, only : MPIR_Irecv_cdesc
+
+    implicit none
+
+    type(*), dimension(..), asynchronous :: buf
+    integer, intent(in) :: count
+    integer, intent(in) :: source
+    integer, intent(in) :: tag
+    type(MPI_Datatype), intent(in) :: datatype
+    type(MPI_Comm), intent(in) :: comm
+    type(MPI_Request), intent(out) :: request
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: count_c
+    integer(c_int) :: source_c
+    integer(c_int) :: tag_c
+    integer(c_Datatype) :: datatype_c
+    integer(c_Comm) :: comm_c
+    integer(c_Request) :: request_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Irecv_cdesc(buf, count, datatype%MPI_VAL, source, tag, comm%MPI_VAL, request%MPI_VAL)
+    else
+        count_c = count
+        datatype_c = datatype%MPI_VAL
+        source_c = source
+        tag_c = tag
+        comm_c = comm%MPI_VAL
+        ierror_c = MPIR_Irecv_cdesc(buf, count_c, datatype_c, source_c, tag_c, comm_c, request_c)
+        request%MPI_VAL = request_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Irecv_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/ireduce_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/ireduce_f08ts.F90
new file mode 100644
index 0000000..571fdfd
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/ireduce_f08ts.F90
@@ -0,0 +1,48 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Ireduce_f08ts(sendbuf, recvbuf, count, datatype, op, root, comm, request, ierror)
+    use :: mpi_f08, only : MPI_Datatype, MPI_Op, MPI_Comm, MPI_Request
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Datatype, c_Op, c_Comm, c_Request
+    use :: mpi_c_interface, only : MPIR_Ireduce_cdesc
+
+    implicit none
+
+    type(*), dimension(..), intent(in), asynchronous :: sendbuf
+    type(*), dimension(..), asynchronous :: recvbuf
+    integer, intent(in) :: count
+    integer, intent(in) :: root
+    type(MPI_Datatype), intent(in) :: datatype
+    type(MPI_Op), intent(in) :: op
+    type(MPI_Comm), intent(in) :: comm
+    type(MPI_Request), intent(out) :: request
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: count_c
+    integer(c_int) :: root_c
+    integer(c_Datatype) :: datatype_c
+    integer(c_Op) :: op_c
+    integer(c_Comm) :: comm_c
+    integer(c_Request) :: request_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Ireduce_cdesc(sendbuf, recvbuf, count, datatype%MPI_VAL, op%MPI_VAL, root, comm%MPI_VAL, &
+            request%MPI_VAL)
+    else
+        count_c = count
+        datatype_c = datatype%MPI_VAL
+        op_c = op%MPI_VAL
+        root_c = root
+        comm_c = comm%MPI_VAL
+        ierror_c = MPIR_Ireduce_cdesc(sendbuf, recvbuf, count_c, datatype_c, op_c, root_c, comm_c, &
+            request_c)
+        request%MPI_VAL = request_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Ireduce_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/ireduce_scatter_block_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/ireduce_scatter_block_f08ts.F90
new file mode 100644
index 0000000..fe2319e
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/ireduce_scatter_block_f08ts.F90
@@ -0,0 +1,46 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Ireduce_scatter_block_f08ts(sendbuf, recvbuf, recvcount, datatype, op, comm, &
+    request, ierror)
+    use :: mpi_f08, only : MPI_Datatype, MPI_Op, MPI_Comm, MPI_Request
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Datatype, c_Op, c_Comm, c_Request
+    use :: mpi_c_interface, only : MPIR_Ireduce_scatter_block_cdesc
+
+    implicit none
+
+    type(*), dimension(..), intent(in), asynchronous :: sendbuf
+    type(*), dimension(..), asynchronous :: recvbuf
+    integer, intent(in) :: recvcount
+    type(MPI_Datatype), intent(in) :: datatype
+    type(MPI_Op), intent(in) :: op
+    type(MPI_Comm), intent(in) :: comm
+    type(MPI_Request), intent(out) :: request
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: recvcount_c
+    integer(c_Datatype) :: datatype_c
+    integer(c_Op) :: op_c
+    integer(c_Comm) :: comm_c
+    integer(c_Request) :: request_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Ireduce_scatter_block_cdesc(sendbuf, recvbuf, recvcount, datatype%MPI_VAL, op%MPI_VAL, &
+            comm%MPI_VAL, request%MPI_VAL)
+    else
+        recvcount_c = recvcount
+        datatype_c = datatype%MPI_VAL
+        op_c = op%MPI_VAL
+        comm_c = comm%MPI_VAL
+        ierror_c = MPIR_Ireduce_scatter_block_cdesc(sendbuf, recvbuf, recvcount_c, datatype_c, op_c, &
+            comm_c, request_c)
+        request%MPI_VAL = request_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Ireduce_scatter_block_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/ireduce_scatter_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/ireduce_scatter_f08ts.F90
new file mode 100644
index 0000000..3b70a4f
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/ireduce_scatter_f08ts.F90
@@ -0,0 +1,48 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Ireduce_scatter_f08ts(sendbuf, recvbuf, recvcounts, datatype, op, comm, &
+    request, ierror)
+    use :: mpi_f08, only : MPI_Datatype, MPI_Op, MPI_Comm, MPI_Request
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Datatype, c_Op, c_Comm, c_Request
+    use :: mpi_c_interface, only : MPIR_Ireduce_scatter_cdesc, MPIR_Comm_size_c
+
+    implicit none
+
+    type(*), dimension(..), intent(in), asynchronous  :: sendbuf
+    type(*), dimension(..), asynchronous  :: recvbuf
+    integer, intent(in)  :: recvcounts(*)
+    type(MPI_Datatype), intent(in)  :: datatype
+    type(MPI_Op), intent(in)  :: op
+    type(MPI_Comm), intent(in)  :: comm
+    type(MPI_Request), intent(out)  :: request
+    integer, optional, intent(out)  :: ierror
+
+    integer(c_int), allocatable :: recvcounts_c(:)
+    integer(c_Datatype) :: datatype_c
+    integer(c_Op) :: op_c
+    integer(c_Comm) :: comm_c
+    integer(c_Request) :: request_c
+    integer(c_int) :: ierror_c
+    integer(c_int) :: err, length ! To get length of assumed-size arrays
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Ireduce_scatter_cdesc(sendbuf, recvbuf, recvcounts, datatype%MPI_VAL, &
+            op%MPI_VAL, comm%MPI_VAL, request%MPI_VAL)
+    else
+        datatype_c = datatype%MPI_VAL
+        op_c = op%MPI_VAL
+        comm_c = comm%MPI_VAL
+        err = MPIR_Comm_size_c(comm_c, length)
+        recvcounts_c = recvcounts(1:length)
+
+        ierror_c = MPIR_Ireduce_scatter_cdesc(sendbuf, recvbuf, recvcounts_c, datatype_c, op_c, comm_c, request_c)
+        request%MPI_VAL = request_c
+    end if
+
+    if(present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Ireduce_scatter_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/irsend_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/irsend_f08ts.F90
new file mode 100644
index 0000000..1837b2b
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/irsend_f08ts.F90
@@ -0,0 +1,45 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Irsend_f08ts(buf, count, datatype, dest, tag, comm, request, ierror)
+    use :: mpi_f08, only : MPI_Datatype, MPI_Comm, MPI_Request
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Datatype, c_Comm, c_Request
+    use :: mpi_c_interface, only : MPIR_Irsend_cdesc
+
+    implicit none
+
+    type(*), dimension(..), intent(in), asynchronous :: buf
+    integer, intent(in) :: count
+    integer, intent(in) :: dest
+    integer, intent(in) :: tag
+    type(MPI_Datatype), intent(in) :: datatype
+    type(MPI_Comm), intent(in) :: comm
+    type(MPI_Request), intent(out) :: request
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: count_c
+    integer(c_int) :: dest_c
+    integer(c_int) :: tag_c
+    integer(c_Datatype) :: datatype_c
+    integer(c_Comm) :: comm_c
+    integer(c_Request) :: request_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Irsend_cdesc(buf, count, datatype%MPI_VAL, dest, tag, comm%MPI_VAL, request%MPI_VAL)
+    else
+        count_c = count
+        datatype_c = datatype%MPI_VAL
+        dest_c = dest
+        tag_c = tag
+        comm_c = comm%MPI_VAL
+        ierror_c = MPIR_Irsend_cdesc(buf, count_c, datatype_c, dest_c, tag_c, comm_c, request_c)
+        request%MPI_VAL = request_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Irsend_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/is_thread_main_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/is_thread_main_f08ts.F90
new file mode 100644
index 0000000..0d996e9
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/is_thread_main_f08ts.F90
@@ -0,0 +1,23 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Is_thread_main_f08(flag, ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : MPIR_Is_thread_main_c
+
+    implicit none
+
+    logical, intent(out) :: flag
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: flag_c
+    integer(c_int) :: ierror_c
+
+    ierror_c = MPIR_Is_thread_main_c(flag_c)
+
+    flag = (flag_c /= 0)
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Is_thread_main_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/iscan_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/iscan_f08ts.F90
new file mode 100644
index 0000000..94c5249
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/iscan_f08ts.F90
@@ -0,0 +1,44 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Iscan_f08ts(sendbuf, recvbuf, count, datatype, op, comm, request, ierror)
+    use :: mpi_f08, only : MPI_Datatype, MPI_Op, MPI_Comm, MPI_Request
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Datatype, c_Op, c_Comm, c_Request
+    use :: mpi_c_interface, only : MPIR_Iscan_cdesc
+
+    implicit none
+
+    type(*), dimension(..), intent(in), asynchronous :: sendbuf
+    type(*), dimension(..), asynchronous :: recvbuf
+    integer, intent(in) :: count
+    type(MPI_Datatype), intent(in) :: datatype
+    type(MPI_Op), intent(in) :: op
+    type(MPI_Comm), intent(in) :: comm
+    type(MPI_Request), intent(out) :: request
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: count_c
+    integer(c_Datatype) :: datatype_c
+    integer(c_Op) :: op_c
+    integer(c_Comm) :: comm_c
+    integer(c_Request) :: request_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Iscan_cdesc(sendbuf, recvbuf, count, datatype%MPI_VAL, op%MPI_VAL, comm%MPI_VAL, &
+            request%MPI_VAL)
+    else
+        count_c = count
+        datatype_c = datatype%MPI_VAL
+        op_c = op%MPI_VAL
+        comm_c = comm%MPI_VAL
+        ierror_c = MPIR_Iscan_cdesc(sendbuf, recvbuf, count_c, datatype_c, op_c, comm_c, request_c)
+        request%MPI_VAL = request_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Iscan_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/iscatter_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/iscatter_f08ts.F90
new file mode 100644
index 0000000..416ef7c
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/iscatter_f08ts.F90
@@ -0,0 +1,52 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Iscatter_f08ts(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, &
+    root, comm, request, ierror)
+    use :: mpi_f08, only : MPI_Datatype, MPI_Comm, MPI_Request
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Datatype, c_Comm, c_Request
+    use :: mpi_c_interface, only : MPIR_Iscatter_cdesc
+
+    implicit none
+
+    type(*), dimension(..), intent(in), asynchronous :: sendbuf
+    type(*), dimension(..), asynchronous :: recvbuf
+    integer, intent(in) :: sendcount
+    integer, intent(in) :: recvcount
+    integer, intent(in) :: root
+    type(MPI_Datatype), intent(in) :: sendtype
+    type(MPI_Datatype), intent(in) :: recvtype
+    type(MPI_Comm), intent(in) :: comm
+    type(MPI_Request), intent(out) :: request
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: sendcount_c
+    integer(c_int) :: recvcount_c
+    integer(c_int) :: root_c
+    integer(c_Datatype) :: sendtype_c
+    integer(c_Datatype) :: recvtype_c
+    integer(c_Comm) :: comm_c
+    integer(c_Request) :: request_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Iscatter_cdesc(sendbuf, sendcount, sendtype%MPI_VAL, recvbuf, recvcount, recvtype%MPI_VAL, &
+            root, comm%MPI_VAL, request%MPI_VAL)
+    else
+        sendcount_c = sendcount
+        sendtype_c = sendtype%MPI_VAL
+        recvcount_c = recvcount
+        recvtype_c = recvtype%MPI_VAL
+        root_c = root
+        comm_c = comm%MPI_VAL
+        ierror_c = MPIR_Iscatter_cdesc(sendbuf, sendcount_c, sendtype_c, recvbuf, recvcount_c, recvtype_c, &
+            root_c, comm_c, request_c)
+        request%MPI_VAL = request_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Iscatter_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/iscatterv_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/iscatterv_f08ts.F90
new file mode 100644
index 0000000..d2e7141
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/iscatterv_f08ts.F90
@@ -0,0 +1,59 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Iscatterv_f08ts(sendbuf, sendcounts, displs, sendtype, recvbuf, recvcount, &
+    recvtype, root, comm, request, ierror)
+    use :: mpi_f08, only : MPI_Datatype, MPI_Comm, MPI_Request
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Datatype, c_Comm, c_Request
+    use :: mpi_c_interface, only : MPIR_Iscatterv_cdesc, MPIR_Comm_size_c
+
+    implicit none
+
+    type(*), dimension(..), intent(in), asynchronous :: sendbuf
+    type(*), dimension(..), asynchronous :: recvbuf
+    integer, intent(in)  :: recvcount
+    integer, intent(in)  :: root
+    integer, intent(in)  :: sendcounts(*)
+    integer, intent(in)  :: displs(*)
+    type(MPI_Datatype), intent(in)  :: sendtype
+    type(MPI_Datatype), intent(in)  :: recvtype
+    type(MPI_Comm), intent(in)  :: comm
+    type(MPI_Request), intent(out)  :: request
+    integer, optional, intent(out)  :: ierror
+
+    integer(c_int) :: recvcount_c
+    integer(c_int) :: root_c
+    integer(c_int), allocatable :: sendcounts_c(:)
+    integer(c_int), allocatable :: displs_c(:)
+    integer(c_Datatype) :: sendtype_c
+    integer(c_Datatype) :: recvtype_c
+    integer(c_Comm) :: comm_c
+    integer(c_Request) :: request_c
+    integer(c_int) :: ierror_c
+    integer(c_int) :: err, length ! To get length of assumed-size arrays
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Iscatterv_cdesc(sendbuf, sendcounts, displs, sendtype%MPI_VAL, recvbuf, &
+            recvcount, recvtype%MPI_VAL, root, comm%MPI_VAL, request%MPI_VAL)
+    else
+        sendtype_c = sendtype%MPI_VAL
+        recvcount_c = recvcount
+        recvtype_c = recvtype%MPI_VAL
+        root_c = root
+        comm_c = comm%MPI_VAL
+
+        err = MPIR_Comm_size_c(comm_c, length)
+        sendcounts_c = sendcounts(1:length)
+        displs_c = displs(1:length)
+
+        ierror_c = MPIR_Iscatterv_cdesc(sendbuf, sendcounts_c, displs_c, sendtype_c, recvbuf, recvcount_c, recvtype_c, &
+            root_c, comm_c, request_c)
+        request%MPI_VAL = request_c
+    end if
+
+    if(present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Iscatterv_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/isend_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/isend_f08ts.F90
new file mode 100644
index 0000000..ec5e5b7
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/isend_f08ts.F90
@@ -0,0 +1,45 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Isend_f08ts(buf, count, datatype, dest, tag, comm, request, ierror)
+    use :: mpi_f08, only : MPI_Datatype, MPI_Comm, MPI_Request
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Datatype, c_Comm, c_Request
+    use :: mpi_c_interface, only : MPIR_Isend_cdesc
+
+    implicit none
+
+    type(*), dimension(..), intent(in), asynchronous :: buf
+    integer, intent(in) :: count
+    integer, intent(in) :: dest
+    integer, intent(in) :: tag
+    type(MPI_Datatype), intent(in) :: datatype
+    type(MPI_Comm), intent(in) :: comm
+    type(MPI_Request), intent(out) :: request
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: count_c
+    integer(c_int) :: dest_c
+    integer(c_int) :: tag_c
+    integer(c_Datatype) :: datatype_c
+    integer(c_Comm) :: comm_c
+    integer(c_Request) :: request_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Isend_cdesc(buf, count, datatype%MPI_VAL, dest, tag, comm%MPI_VAL, request%MPI_VAL)
+    else
+        count_c = count
+        datatype_c = datatype%MPI_VAL
+        dest_c = dest
+        tag_c = tag
+        comm_c = comm%MPI_VAL
+        ierror_c = MPIR_Isend_cdesc(buf, count_c, datatype_c, dest_c, tag_c, comm_c, request_c)
+        request%MPI_VAL = request_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Isend_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/issend_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/issend_f08ts.F90
new file mode 100644
index 0000000..1d2710a
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/issend_f08ts.F90
@@ -0,0 +1,45 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Issend_f08ts(buf, count, datatype, dest, tag, comm, request, ierror)
+    use :: mpi_f08, only : MPI_Datatype, MPI_Comm, MPI_Request
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Datatype, c_Comm, c_Request
+    use :: mpi_c_interface, only : MPIR_Issend_cdesc
+
+    implicit none
+
+    type(*), dimension(..), intent(in), asynchronous :: buf
+    integer, intent(in) :: count
+    integer, intent(in) :: dest
+    integer, intent(in) :: tag
+    type(MPI_Datatype), intent(in) :: datatype
+    type(MPI_Comm), intent(in) :: comm
+    type(MPI_Request), intent(out) :: request
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: count_c
+    integer(c_int) :: dest_c
+    integer(c_int) :: tag_c
+    integer(c_Datatype) :: datatype_c
+    integer(c_Comm) :: comm_c
+    integer(c_Request) :: request_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Issend_cdesc(buf, count, datatype%MPI_VAL, dest, tag, comm%MPI_VAL, request%MPI_VAL)
+    else
+        count_c = count
+        datatype_c = datatype%MPI_VAL
+        dest_c = dest
+        tag_c = tag
+        comm_c = comm%MPI_VAL
+        ierror_c = MPIR_Issend_cdesc(buf, count_c, datatype_c, dest_c, tag_c, comm_c, request_c)
+        request%MPI_VAL = request_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Issend_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/lookup_name_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/lookup_name_f08ts.F90
new file mode 100644
index 0000000..faaccb0
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/lookup_name_f08ts.F90
@@ -0,0 +1,40 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Lookup_name_f08(service_name, info, port_name, ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_char
+    use :: mpi_f08, only : MPI_Info
+    use :: mpi_f08, only : MPI_MAX_PORT_NAME
+    use :: mpi_c_interface, only : c_Info
+    use :: mpi_c_interface, only : MPIR_Lookup_name_c
+    use :: mpi_c_interface, only : MPIR_Fortran_string_c2f
+    use :: mpi_c_interface, only : MPIR_Fortran_string_f2c
+
+    implicit none
+
+    character(len=*), intent(in) :: service_name
+    type(MPI_Info), intent(in) :: info
+    character(len=MPI_MAX_PORT_NAME), intent(out) :: port_name
+    integer, optional, intent(out) :: ierror
+
+    character(kind=c_char) :: service_name_c(len_trim(service_name)+1)
+    integer(c_Info) :: info_c
+    character(kind=c_char) :: port_name_c(MPI_MAX_PORT_NAME+1)
+    integer(c_int) :: ierror_c
+
+    call MPIR_Fortran_string_f2c(service_name, service_name_c)
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Lookup_name_c(service_name_c, info%MPI_VAL, port_name_c)
+    else
+        info_c = info%MPI_VAL
+        ierror_c = MPIR_Lookup_name_c(service_name_c, info_c, port_name_c)
+    end if
+
+    call MPIR_Fortran_string_c2f(port_name_c, port_name)
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Lookup_name_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/mprobe_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/mprobe_f08ts.F90
new file mode 100644
index 0000000..c0158aa
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/mprobe_f08ts.F90
@@ -0,0 +1,52 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Mprobe_f08(source, tag, comm, message, status, ierror)
+    use :: mpi_f08, only : MPI_Comm, MPI_Message, MPI_Status
+    use, intrinsic :: iso_c_binding, only : c_loc, c_associated
+    use :: mpi_f08, only : MPI_STATUS_IGNORE, MPIR_C_MPI_STATUS_IGNORE, assignment(=)
+    use, intrinsic :: iso_c_binding, only : c_int, c_ptr
+    use :: mpi_c_interface, only : c_Comm, c_Message
+    use :: mpi_c_interface, only : c_Status
+    use :: mpi_c_interface, only : MPIR_Mprobe_c
+
+    implicit none
+
+    integer, intent(in) :: source
+    integer, intent(in) :: tag
+    type(MPI_Comm), intent(in) :: comm
+    type(MPI_Message), intent(out) :: message
+    type(MPI_Status), target :: status
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: source_c
+    integer(c_int) :: tag_c
+    integer(c_Comm) :: comm_c
+    integer(c_Message) :: message_c
+    type(c_Status), target :: status_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        if (c_associated(c_loc(status), c_loc(MPI_STATUS_IGNORE))) then
+            ierror_c = MPIR_Mprobe_c(source, tag, comm%MPI_VAL, message%MPI_VAL, MPIR_C_MPI_STATUS_IGNORE)
+        else
+            ierror_c = MPIR_Mprobe_c(source, tag, comm%MPI_VAL, message%MPI_VAL, c_loc(status))
+        end if
+    else
+        source_c = source
+        tag_c = tag
+        comm_c = comm%MPI_VAL
+        if (c_associated(c_loc(status), c_loc(MPI_STATUS_IGNORE))) then
+            ierror_c = MPIR_Mprobe_c(source_c, tag_c, comm_c, message_c, MPIR_C_MPI_STATUS_IGNORE)
+        else
+            ierror_c = MPIR_Mprobe_c(source_c, tag_c, comm_c, message_c, c_loc(status_c))
+            status = status_c
+        end if
+        message%MPI_VAL = message_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Mprobe_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/mrecv_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/mrecv_f08ts.F90
new file mode 100644
index 0000000..81e34cb
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/mrecv_f08ts.F90
@@ -0,0 +1,51 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Mrecv_f08ts(buf, count, datatype, message, status, ierror)
+    use :: mpi_f08, only : MPI_Datatype, MPI_Message, MPI_Status
+    use, intrinsic :: iso_c_binding, only : c_loc, c_associated
+    use :: mpi_f08, only : MPI_STATUS_IGNORE, MPIR_C_MPI_STATUS_IGNORE, assignment(=)
+    use, intrinsic :: iso_c_binding, only : c_int, c_ptr
+    use :: mpi_c_interface, only : c_Datatype, c_Message
+    use :: mpi_c_interface, only : c_Status
+    use :: mpi_c_interface, only : MPIR_Mrecv_cdesc
+
+    implicit none
+
+    type(*), dimension(..) :: buf
+    integer, intent(in) :: count
+    type(MPI_Datatype), intent(in) :: datatype
+    type(MPI_Message), intent(inout) :: message
+    type(MPI_Status), target :: status
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: count_c
+    integer(c_Datatype) :: datatype_c
+    integer(c_Message) :: message_c
+    type(c_Status), target :: status_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        if (c_associated(c_loc(status), c_loc(MPI_STATUS_IGNORE))) then
+            ierror_c = MPIR_Mrecv_cdesc(buf, count, datatype%MPI_VAL, message%MPI_VAL, MPIR_C_MPI_STATUS_IGNORE)
+        else
+            ierror_c = MPIR_Mrecv_cdesc(buf, count, datatype%MPI_VAL, message%MPI_VAL, c_loc(status))
+        end if
+    else
+        count_c = count
+        datatype_c = datatype%MPI_VAL
+        message_c = message%MPI_VAL
+        if (c_associated(c_loc(status), c_loc(MPI_STATUS_IGNORE))) then
+            ierror_c = MPIR_Mrecv_cdesc(buf, count_c, datatype_c, message_c, MPIR_C_MPI_STATUS_IGNORE)
+        else
+            ierror_c = MPIR_Mrecv_cdesc(buf, count_c, datatype_c, message_c, c_loc(status_c))
+            status = status_c
+        end if
+        message%MPI_VAL = message_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Mrecv_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/neighbor_allgather_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/neighbor_allgather_f08ts.F90
new file mode 100644
index 0000000..11e25da
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/neighbor_allgather_f08ts.F90
@@ -0,0 +1,46 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Neighbor_allgather_f08ts(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, &
+    comm, ierror)
+    use :: mpi_f08, only : MPI_Datatype, MPI_Comm
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Datatype, c_Comm
+    use :: mpi_c_interface, only : MPIR_Neighbor_allgather_cdesc
+
+    implicit none
+
+    type(*), dimension(..), intent(in) :: sendbuf
+    type(*), dimension(..) :: recvbuf
+    integer, intent(in) :: sendcount
+    integer, intent(in) :: recvcount
+    type(MPI_Datatype), intent(in) :: sendtype
+    type(MPI_Datatype), intent(in) :: recvtype
+    type(MPI_Comm), intent(in) :: comm
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: sendcount_c
+    integer(c_int) :: recvcount_c
+    integer(c_Datatype) :: sendtype_c
+    integer(c_Datatype) :: recvtype_c
+    integer(c_Comm) :: comm_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Neighbor_allgather_cdesc(sendbuf, sendcount, sendtype%MPI_VAL, recvbuf, recvcount, &
+            recvtype%MPI_VAL, comm%MPI_VAL)
+    else
+        sendcount_c = sendcount
+        sendtype_c = sendtype%MPI_VAL
+        recvcount_c = recvcount
+        recvtype_c = recvtype%MPI_VAL
+        comm_c = comm%MPI_VAL
+        ierror_c = MPIR_Neighbor_allgather_cdesc(sendbuf, sendcount_c, sendtype_c, recvbuf, recvcount_c, &
+            recvtype_c, comm_c)
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Neighbor_allgather_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/neighbor_allgatherv_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/neighbor_allgatherv_f08ts.F90
new file mode 100644
index 0000000..e07cef0
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/neighbor_allgatherv_f08ts.F90
@@ -0,0 +1,52 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Neighbor_allgatherv_f08ts(sendbuf, sendcount, sendtype, recvbuf, recvcounts, displs, &
+    recvtype, comm, ierror)
+    use :: mpi_f08, only : MPI_Datatype, MPI_Comm
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Datatype, c_Comm
+    use :: mpi_c_interface, only : MPIR_Neighbor_allgatherv_cdesc, MPIR_Dist_graph_neighbors_count_c
+
+    implicit none
+
+    type(*), dimension(..), intent(in)  :: sendbuf
+    type(*), dimension(..)  :: recvbuf
+    integer, intent(in)  :: sendcount
+    integer, intent(in)  :: recvcounts(*)
+    integer, intent(in)  :: displs(*)
+    type(MPI_Datatype), intent(in)  :: sendtype
+    type(MPI_Datatype), intent(in)  :: recvtype
+    type(MPI_Comm), intent(in)  :: comm
+    integer, optional, intent(out)  :: ierror
+
+    integer(c_int) :: sendcount_c
+    integer(c_int), allocatable :: recvcounts_c(:)
+    integer(c_int), allocatable :: displs_c(:)
+    integer(c_Datatype) :: sendtype_c
+    integer(c_Datatype) :: recvtype_c
+    integer(c_Comm) :: comm_c
+    integer(c_int) :: ierror_c
+    integer(c_int) :: err, indegree, outdegree, weighted ! To get length of assumed-size arrays
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Neighbor_allgatherv_cdesc(sendbuf, sendcount, sendtype%MPI_VAL, recvbuf, &
+            recvcounts, displs, recvtype%MPI_VAL, comm%MPI_VAL)
+    else
+        sendcount_c = sendcount
+        sendtype_c = sendtype%MPI_VAL
+        recvtype_c = recvtype%MPI_VAL
+        comm_c = comm%MPI_VAL
+        err = MPIR_Dist_graph_neighbors_count_c(comm_c, indegree, outdegree, weighted)
+        recvcounts_c = recvcounts(1:indegree)
+        displs_c = displs(1:indegree)
+
+        ierror_c = MPIR_Neighbor_allgatherv_cdesc(sendbuf, sendcount_c, sendtype_c, recvbuf, recvcounts_c, &
+            displs_c, recvtype_c, comm_c)
+    end if
+
+    if(present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Neighbor_allgatherv_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/neighbor_alltoall_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/neighbor_alltoall_f08ts.F90
new file mode 100644
index 0000000..9f0903d
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/neighbor_alltoall_f08ts.F90
@@ -0,0 +1,46 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Neighbor_alltoall_f08ts(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, &
+    comm, ierror)
+    use :: mpi_f08, only : MPI_Datatype, MPI_Comm
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Datatype, c_Comm
+    use :: mpi_c_interface, only : MPIR_Neighbor_alltoall_cdesc
+
+    implicit none
+
+    type(*), dimension(..), intent(in) :: sendbuf
+    type(*), dimension(..) :: recvbuf
+    integer, intent(in) :: sendcount
+    integer, intent(in) :: recvcount
+    type(MPI_Datatype), intent(in) :: sendtype
+    type(MPI_Datatype), intent(in) :: recvtype
+    type(MPI_Comm), intent(in) :: comm
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: sendcount_c
+    integer(c_int) :: recvcount_c
+    integer(c_Datatype) :: sendtype_c
+    integer(c_Datatype) :: recvtype_c
+    integer(c_Comm) :: comm_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Neighbor_alltoall_cdesc(sendbuf, sendcount, sendtype%MPI_VAL, recvbuf, recvcount, &
+            recvtype%MPI_VAL, comm%MPI_VAL)
+    else
+        sendcount_c = sendcount
+        sendtype_c = sendtype%MPI_VAL
+        recvcount_c = recvcount
+        recvtype_c = recvtype%MPI_VAL
+        comm_c = comm%MPI_VAL
+        ierror_c = MPIR_Neighbor_alltoall_cdesc(sendbuf, sendcount_c, sendtype_c, recvbuf, recvcount_c, &
+            recvtype_c, comm_c)
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Neighbor_alltoall_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/neighbor_alltoallv_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/neighbor_alltoallv_f08ts.F90
new file mode 100644
index 0000000..fbf1354
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/neighbor_alltoallv_f08ts.F90
@@ -0,0 +1,55 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Neighbor_alltoallv_f08ts(sendbuf, sendcounts, sdispls, sendtype, recvbuf, recvcounts, &
+    rdispls, recvtype, comm, ierror)
+    use :: mpi_f08, only : MPI_Datatype, MPI_Comm
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Datatype, c_Comm
+    use :: mpi_c_interface, only : MPIR_Neighbor_alltoallv_cdesc, MPIR_Dist_graph_neighbors_count_c
+
+    implicit none
+
+    type(*), dimension(..), intent(in)  :: sendbuf
+    type(*), dimension(..)  :: recvbuf
+    integer, intent(in)  :: sendcounts(*)
+    integer, intent(in)  :: sdispls(*)
+    integer, intent(in)  :: recvcounts(*)
+    integer, intent(in)  :: rdispls(*)
+    type(MPI_Datatype), intent(in)  :: sendtype
+    type(MPI_Datatype), intent(in)  :: recvtype
+    type(MPI_Comm), intent(in)  :: comm
+    integer, optional, intent(out)  :: ierror
+
+    integer(c_int), allocatable :: sendcounts_c(:)
+    integer(c_int), allocatable :: sdispls_c(:)
+    integer(c_int), allocatable :: recvcounts_c(:)
+    integer(c_int), allocatable :: rdispls_c(:)
+    integer(c_Datatype) :: sendtype_c
+    integer(c_Datatype) :: recvtype_c
+    integer(c_Comm) :: comm_c
+    integer(c_int) :: ierror_c
+    integer(c_int) :: err, indegree, outdegree, weighted
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Neighbor_alltoallv_cdesc(sendbuf, sendcounts, sdispls, sendtype%MPI_VAL, recvbuf, recvcounts, rdispls, &
+            recvtype%MPI_VAL, comm%MPI_VAL)
+    else
+        sendtype_c = sendtype%MPI_VAL
+        recvtype_c = recvtype%MPI_VAL
+        comm_c = comm%MPI_VAL
+        err = MPIR_Dist_graph_neighbors_count_c(comm_c, indegree, outdegree, weighted)
+        sendcounts_c = sendcounts(1:outdegree)
+        sdispls_c = sdispls(1:outdegree)
+        recvcounts_c = recvcounts(1:indegree)
+        rdispls_c = rdispls(1:indegree)
+
+        ierror_c = MPIR_Neighbor_alltoallv_cdesc(sendbuf, sendcounts_c, sdispls_c, sendtype_c, recvbuf, recvcounts_c, &
+            rdispls_c, recvtype_c, comm_c)
+    end if
+
+    if(present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Neighbor_alltoallv_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/neighbor_alltoallw_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/neighbor_alltoallw_f08ts.F90
new file mode 100644
index 0000000..3d667d1
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/neighbor_alltoallw_f08ts.F90
@@ -0,0 +1,55 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Neighbor_alltoallw_f08ts(sendbuf, sendcounts, sdispls, sendtypes, recvbuf, recvcounts, &
+    rdispls, recvtypes, comm, ierror)
+    use :: mpi_f08, only : MPI_Datatype, MPI_Comm
+    use :: mpi_f08, only : MPI_ADDRESS_KIND
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Datatype, c_Comm
+    use :: mpi_c_interface, only : MPIR_Neighbor_alltoallw_cdesc, MPIR_Dist_graph_neighbors_count_c
+
+    implicit none
+
+    type(*), dimension(..), intent(in)  :: sendbuf
+    type(*), dimension(..)  :: recvbuf
+    integer, intent(in)  :: sendcounts(*)
+    integer, intent(in)  :: recvcounts(*)
+    integer(MPI_ADDRESS_KIND), intent(in)  :: sdispls(*)
+    integer(MPI_ADDRESS_KIND), intent(in)  :: rdispls(*)
+    type(MPI_Datatype), intent(in)  :: sendtypes(*)
+    type(MPI_Datatype), intent(in)  :: recvtypes(*)
+    type(MPI_Comm), intent(in)  :: comm
+    integer, optional, intent(out)  :: ierror
+
+    integer(c_int), allocatable :: sendcounts_c(:)
+    integer(c_int), allocatable :: recvcounts_c(:)
+    integer(MPI_ADDRESS_KIND), allocatable :: sdispls_c(:)
+    integer(MPI_ADDRESS_KIND), allocatable :: rdispls_c(:)
+    integer(c_Datatype), allocatable :: sendtypes_c(:)
+    integer(c_Datatype), allocatable :: recvtypes_c(:)
+    integer(c_Comm) :: comm_c
+    integer(c_int) :: ierror_c
+    integer(c_int) :: err, indegree, outdegree, weighted ! To get length of assumed-size arrays
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Neighbor_alltoallw_cdesc(sendbuf, sendcounts, sdispls, sendtypes%MPI_VAL, recvbuf, recvcounts, rdispls, &
+            recvtypes%MPI_VAL, comm%MPI_VAL)
+    else
+        err = MPIR_Dist_graph_neighbors_count_c(comm_c, indegree, outdegree, weighted)
+        sendtypes_c = sendtypes(1:outdegree)%MPI_VAL
+        recvtypes_c = recvtypes(1:indegree)%MPI_VAL
+        comm_c = comm%MPI_VAL
+
+        sendcounts_c = sendcounts(1:outdegree)
+        recvcounts_c = recvcounts(1:indegree)
+
+        ierror_c = MPIR_Neighbor_alltoallw_cdesc(sendbuf, sendcounts_c, sdispls, sendtypes_c, recvbuf, recvcounts_c, &
+            rdispls, recvtypes_c, comm_c)
+    end if
+
+    if(present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Neighbor_alltoallw_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/op_commutative_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/op_commutative_f08ts.F90
new file mode 100644
index 0000000..f0509ee
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/op_commutative_f08ts.F90
@@ -0,0 +1,32 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Op_commutative_f08(op, commute, ierror)
+    use :: mpi_f08, only : MPI_Op
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Op
+    use :: mpi_c_interface, only : MPIR_Op_commutative_c
+
+    implicit none
+
+    type(MPI_Op), intent(in) :: op
+    logical, intent(out) :: commute
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Op) :: op_c
+    integer(c_int) :: commute_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Op_commutative_c(op%MPI_VAL, commute_c)
+    else
+        op_c = op%MPI_VAL
+        ierror_c = MPIR_Op_commutative_c(op_c, commute_c)
+    end if
+
+    commute = (commute_c /= 0)
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Op_commutative_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/op_create_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/op_create_f08ts.F90
new file mode 100644
index 0000000..5c96bf1
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/op_create_f08ts.F90
@@ -0,0 +1,37 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Op_create_f08(user_fn, commute, op, ierror)
+    use :: mpi_f08, only : MPI_Op
+    use :: mpi_f08, only : MPI_User_function
+    use, intrinsic :: iso_c_binding, only : c_funloc
+    use, intrinsic :: iso_c_binding, only : c_int, c_funptr
+    use :: mpi_c_interface, only : c_Op
+    use :: mpi_c_interface, only : MPIR_Op_create_c
+
+    implicit none
+
+    procedure(MPI_User_function) :: user_fn
+    logical, intent(in) :: commute
+    type(MPI_Op), intent(out) :: op
+    integer, optional, intent(out) :: ierror
+
+    type(c_funptr) :: user_fn_c
+    integer(c_int) :: commute_c
+    integer(c_Op) :: op_c
+    integer(c_int) :: ierror_c
+
+    user_fn_c = c_funloc(user_fn)
+    commute_c = merge(1, 0, commute)
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Op_create_c(user_fn_c, commute_c, op%MPI_VAL)
+    else
+        ierror_c = MPIR_Op_create_c(user_fn_c, commute_c, op_c)
+        op%MPI_VAL = op_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Op_create_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/op_free_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/op_free_f08ts.F90
new file mode 100644
index 0000000..206d447
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/op_free_f08ts.F90
@@ -0,0 +1,30 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Op_free_f08(op, ierror)
+    use :: mpi_f08, only : MPI_Op
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Op
+    use :: mpi_c_interface, only : MPIR_Op_free_c
+
+    implicit none
+
+    type(MPI_Op), intent(inout) :: op
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Op) :: op_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Op_free_c(op%MPI_VAL)
+    else
+        op_c = op%MPI_VAL
+        ierror_c = MPIR_Op_free_c(op_c)
+        op%MPI_VAL = op_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Op_free_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/open_port_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/open_port_f08ts.F90
new file mode 100644
index 0000000..e9238e4
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/open_port_f08ts.F90
@@ -0,0 +1,35 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Open_port_f08(info, port_name, ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_char
+    use :: mpi_f08, only : MPI_Info
+    use :: mpi_f08, only : MPI_MAX_PORT_NAME
+    use :: mpi_c_interface, only : c_Info
+    use :: mpi_c_interface, only : MPIR_Open_port_c
+    use :: mpi_c_interface, only : MPIR_Fortran_string_c2f
+
+    implicit none
+
+    type(MPI_Info), intent(in) :: info
+    character(len=MPI_MAX_PORT_NAME), intent(out) :: port_name
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Info) :: info_c
+    character(kind=c_char) :: port_name_c(MPI_MAX_PORT_NAME+1)
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Open_port_c(info%MPI_VAL, port_name_c)
+    else
+        info_c = info%MPI_VAL
+        ierror_c = MPIR_Open_port_c(info_c, port_name_c)
+    end if
+
+    call MPIR_Fortran_string_c2f(port_name_c, port_name)
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Open_port_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/pack_external_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/pack_external_f08ts.F90
new file mode 100644
index 0000000..f17a75c
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/pack_external_f08ts.F90
@@ -0,0 +1,50 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Pack_external_f08ts(datarep, inbuf, incount, datatype, outbuf, outsize, &
+    position, ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_char
+    use :: mpi_f08, only : MPI_Datatype
+    use :: mpi_f08, only : MPI_ADDRESS_KIND
+    use :: mpi_c_interface, only : c_Datatype
+    use :: mpi_c_interface, only : MPIR_Pack_external_cdesc
+    use :: mpi_c_interface, only : MPIR_Fortran_string_f2c
+
+    implicit none
+
+    character(len=*), intent(in) :: datarep
+    type(*), dimension(..), intent(in) :: inbuf
+    type(*), dimension(..) :: outbuf
+    integer, intent(in) :: incount
+    type(MPI_Datatype), intent(in) :: datatype
+    integer(MPI_ADDRESS_KIND), intent(in) :: outsize
+    integer(MPI_ADDRESS_KIND), intent(inout) :: position
+    integer, optional, intent(out) :: ierror
+
+    character(kind=c_char) :: datarep_c(len_trim(datarep)+1)
+    integer(c_int) :: incount_c
+    integer(c_Datatype) :: datatype_c
+    integer(MPI_ADDRESS_KIND) :: outsize_c
+    integer(MPI_ADDRESS_KIND) :: position_c
+    integer(c_int) :: ierror_c
+
+    call MPIR_Fortran_string_f2c(datarep, datarep_c)
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Pack_external_cdesc(datarep_c, inbuf, incount, datatype%MPI_VAL, outbuf, outsize, &
+            position)
+    else
+        incount_c = incount
+        datatype_c = datatype%MPI_VAL
+        outsize_c = outsize
+        position_c = position
+        ierror_c = MPIR_Pack_external_cdesc(datarep_c, inbuf, incount_c, datatype_c, outbuf, outsize_c, &
+            position_c)
+        position = position_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Pack_external_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/pack_external_size_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/pack_external_size_f08ts.F90
new file mode 100644
index 0000000..3bbb2c0
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/pack_external_size_f08ts.F90
@@ -0,0 +1,41 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Pack_external_size_f08(datarep, incount, datatype, size, ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_char
+    use :: mpi_f08, only : MPI_Datatype
+    use :: mpi_f08, only : MPI_ADDRESS_KIND
+    use :: mpi_c_interface, only : c_Datatype
+    use :: mpi_c_interface, only : MPIR_Pack_external_size_c
+    use :: mpi_c_interface, only : MPIR_Fortran_string_f2c
+
+    implicit none
+
+    type(MPI_Datatype), intent(in) :: datatype
+    integer, intent(in) :: incount
+    character(len=*), intent(in) :: datarep
+    integer(MPI_ADDRESS_KIND), intent(out) :: size
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Datatype) :: datatype_c
+    integer(c_int) :: incount_c
+    character(kind=c_char) :: datarep_c(len_trim(datarep)+1)
+    integer(MPI_ADDRESS_KIND) :: size_c
+    integer(c_int) :: ierror_c
+
+    call MPIR_Fortran_string_f2c(datarep, datarep_c)
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Pack_external_size_c(datarep_c, incount, datatype%MPI_VAL, size)
+    else
+        incount_c = incount
+        datatype_c = datatype%MPI_VAL
+        ierror_c = MPIR_Pack_external_size_c(datarep_c, incount_c, datatype_c, size_c)
+        size = size_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Pack_external_size_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/pack_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/pack_f08ts.F90
new file mode 100644
index 0000000..8085a14
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/pack_f08ts.F90
@@ -0,0 +1,44 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Pack_f08ts(inbuf, incount, datatype, outbuf, outsize, position, comm, ierror)
+    use :: mpi_f08, only : MPI_Datatype, MPI_Comm
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Datatype, c_Comm
+    use :: mpi_c_interface, only : MPIR_Pack_cdesc
+
+    implicit none
+
+    type(*), dimension(..), intent(in) :: inbuf
+    type(*), dimension(..) :: outbuf
+    integer, intent(in) :: incount
+    integer, intent(in) :: outsize
+    type(MPI_Datatype), intent(in) :: datatype
+    integer, intent(inout) :: position
+    type(MPI_Comm), intent(in) :: comm
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: incount_c
+    integer(c_int) :: outsize_c
+    integer(c_Datatype) :: datatype_c
+    integer(c_int) :: position_c
+    integer(c_Comm) :: comm_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Pack_cdesc(inbuf, incount, datatype%MPI_VAL, outbuf, outsize, position, comm%MPI_VAL)
+    else
+        incount_c = incount
+        datatype_c = datatype%MPI_VAL
+        outsize_c = outsize
+        position_c = position
+        comm_c = comm%MPI_VAL
+        ierror_c = MPIR_Pack_cdesc(inbuf, incount_c, datatype_c, outbuf, outsize_c, position_c, comm_c)
+        position = position_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Pack_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/pack_size_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/pack_size_f08ts.F90
new file mode 100644
index 0000000..e916c4c
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/pack_size_f08ts.F90
@@ -0,0 +1,38 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Pack_size_f08(incount, datatype, comm, size, ierror)
+    use :: mpi_f08, only : MPI_Datatype, MPI_Comm
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Datatype, c_Comm
+    use :: mpi_c_interface, only : MPIR_Pack_size_c
+
+    implicit none
+
+    integer, intent(in) :: incount
+    type(MPI_Datatype), intent(in) :: datatype
+    type(MPI_Comm), intent(in) :: comm
+    integer, intent(out) :: size
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: incount_c
+    integer(c_Datatype) :: datatype_c
+    integer(c_Comm) :: comm_c
+    integer(c_int) :: size_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Pack_size_c(incount, datatype%MPI_VAL, comm%MPI_VAL, size)
+    else
+        incount_c = incount
+        datatype_c = datatype%MPI_VAL
+        comm_c = comm%MPI_VAL
+        ierror_c = MPIR_Pack_size_c(incount_c, datatype_c, comm_c, size_c)
+        size = size_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Pack_size_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/pcontrol_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/pcontrol_f08ts.F90
new file mode 100644
index 0000000..ccfa849
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/pcontrol_f08ts.F90
@@ -0,0 +1,25 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Pcontrol_f08(level)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : MPIR_Pcontrol_c
+
+    implicit none
+
+    integer, intent(in) :: level
+
+    integer(c_int) :: level_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Pcontrol_c(level)
+    else
+        level_c = level
+        ierror_c = MPIR_Pcontrol_c(level_c)
+    end if
+
+
+end subroutine MPI_Pcontrol_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/probe_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/probe_f08ts.F90
new file mode 100644
index 0000000..38ddce7
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/probe_f08ts.F90
@@ -0,0 +1,49 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Probe_f08(source, tag, comm, status, ierror)
+    use :: mpi_f08, only : MPI_Comm, MPI_Status
+    use, intrinsic :: iso_c_binding, only : c_loc, c_associated
+    use :: mpi_f08, only : MPI_STATUS_IGNORE, MPIR_C_MPI_STATUS_IGNORE, assignment(=)
+    use, intrinsic :: iso_c_binding, only : c_int, c_ptr
+    use :: mpi_c_interface, only : c_Comm
+    use :: mpi_c_interface, only : c_Status
+    use :: mpi_c_interface, only : MPIR_Probe_c
+
+    implicit none
+
+    integer, intent(in) :: source
+    integer, intent(in) :: tag
+    type(MPI_Comm), intent(in) :: comm
+    type(MPI_Status), target :: status
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: source_c
+    integer(c_int) :: tag_c
+    integer(c_Comm) :: comm_c
+    type(c_Status), target :: status_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        if (c_associated(c_loc(status), c_loc(MPI_STATUS_IGNORE))) then
+            ierror_c = MPIR_Probe_c(source, tag, comm%MPI_VAL, MPIR_C_MPI_STATUS_IGNORE)
+        else
+            ierror_c = MPIR_Probe_c(source, tag, comm%MPI_VAL, c_loc(status))
+        end if
+    else
+        source_c = source
+        tag_c = tag
+        comm_c = comm%MPI_VAL
+        if (c_associated(c_loc(status), c_loc(MPI_STATUS_IGNORE))) then
+            ierror_c = MPIR_Probe_c(source_c, tag_c, comm_c, MPIR_C_MPI_STATUS_IGNORE)
+        else
+            ierror_c = MPIR_Probe_c(source_c, tag_c, comm_c, c_loc(status_c))
+            status = status_c
+        end if
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Probe_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/publish_name_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/publish_name_f08ts.F90
new file mode 100644
index 0000000..80405d6
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/publish_name_f08ts.F90
@@ -0,0 +1,38 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Publish_name_f08(service_name, info, port_name, ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_char
+    use :: mpi_f08, only : MPI_Info
+    use :: mpi_c_interface, only : c_Info
+    use :: mpi_c_interface, only : MPIR_Publish_name_c
+    use :: mpi_c_interface, only : MPIR_Fortran_string_f2c
+
+    implicit none
+
+    type(MPI_Info), intent(in) :: info
+    character(len=*), intent(in) :: service_name
+    character(len=*), intent(in) :: port_name
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Info) :: info_c
+    character(kind=c_char) :: service_name_c(len_trim(service_name)+1)
+    character(kind=c_char) :: port_name_c(len_trim(port_name)+1)
+    integer(c_int) :: ierror_c
+
+    call MPIR_Fortran_string_f2c(service_name, service_name_c)
+
+    call MPIR_Fortran_string_f2c(port_name, port_name_c)
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Publish_name_c(service_name_c, info%MPI_VAL, port_name_c)
+    else
+        info_c = info%MPI_VAL
+        ierror_c = MPIR_Publish_name_c(service_name_c, info_c, port_name_c)
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Publish_name_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/put_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/put_f08ts.F90
new file mode 100644
index 0000000..599f68c
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/put_f08ts.F90
@@ -0,0 +1,52 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Put_f08ts(origin_addr, origin_count, origin_datatype, target_rank, &
+    target_disp, target_count, target_datatype, win, ierror)
+    use :: mpi_f08, only : MPI_Datatype, MPI_Win
+    use :: mpi_f08, only : MPI_ADDRESS_KIND
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Datatype, c_Win
+    use :: mpi_c_interface, only : MPIR_Put_cdesc
+
+    implicit none
+
+    type(*), dimension(..), intent(in), asynchronous :: origin_addr
+    integer, intent(in) :: origin_count
+    integer, intent(in) :: target_rank
+    integer, intent(in) :: target_count
+    type(MPI_Datatype), intent(in) :: origin_datatype
+    integer(MPI_ADDRESS_KIND), intent(in) :: target_disp
+    type(MPI_Datatype), intent(in) :: target_datatype
+    type(MPI_Win), intent(in) :: win
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: origin_count_c
+    integer(c_int) :: target_rank_c
+    integer(c_int) :: target_count_c
+    integer(c_Datatype) :: origin_datatype_c
+    integer(MPI_ADDRESS_KIND) :: target_disp_c
+    integer(c_Datatype) :: target_datatype_c
+    integer(c_Win) :: win_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Put_cdesc(origin_addr, origin_count, origin_datatype%MPI_VAL, target_rank, target_disp, &
+            target_count, target_datatype%MPI_VAL, win%MPI_VAL)
+    else
+        origin_count_c = origin_count
+        origin_datatype_c = origin_datatype%MPI_VAL
+        target_rank_c = target_rank
+        target_disp_c = target_disp
+        target_count_c = target_count
+        target_datatype_c = target_datatype%MPI_VAL
+        win_c = win%MPI_VAL
+        ierror_c = MPIR_Put_cdesc(origin_addr, origin_count_c, origin_datatype_c, target_rank_c, target_disp_c, &
+            target_count_c, target_datatype_c, win_c)
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Put_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/query_thread_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/query_thread_f08ts.F90
new file mode 100644
index 0000000..b14cb73
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/query_thread_f08ts.F90
@@ -0,0 +1,27 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Query_thread_f08(provided, ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : MPIR_Query_thread_c
+
+    implicit none
+
+    integer, intent(out) :: provided
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: provided_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Query_thread_c(provided)
+    else
+        ierror_c = MPIR_Query_thread_c(provided_c)
+        provided = provided_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Query_thread_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/recv_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/recv_f08ts.F90
new file mode 100644
index 0000000..044e362
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/recv_f08ts.F90
@@ -0,0 +1,56 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Recv_f08ts(buf, count, datatype, source, tag, comm, status, ierror)
+    use :: mpi_f08, only : MPI_Datatype, MPI_Comm, MPI_Status
+    use, intrinsic :: iso_c_binding, only : c_loc, c_associated
+    use :: mpi_f08, only : MPI_STATUS_IGNORE, MPIR_C_MPI_STATUS_IGNORE, assignment(=)
+    use, intrinsic :: iso_c_binding, only : c_int, c_ptr
+    use :: mpi_c_interface, only : c_Datatype, c_Comm
+    use :: mpi_c_interface, only : c_Status
+    use :: mpi_c_interface, only : MPIR_Recv_cdesc
+
+    implicit none
+
+    type(*), dimension(..) :: buf
+    integer, intent(in) :: count
+    integer, intent(in) :: source
+    integer, intent(in) :: tag
+    type(MPI_Datatype), intent(in) :: datatype
+    type(MPI_Comm), intent(in) :: comm
+    type(MPI_Status), target :: status
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: count_c
+    integer(c_int) :: source_c
+    integer(c_int) :: tag_c
+    integer(c_Datatype) :: datatype_c
+    integer(c_Comm) :: comm_c
+    type(c_Status), target :: status_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        if (c_associated(c_loc(status), c_loc(MPI_STATUS_IGNORE))) then
+            ierror_c = MPIR_Recv_cdesc(buf, count, datatype%MPI_VAL, source, tag, comm%MPI_VAL, MPIR_C_MPI_STATUS_IGNORE)
+        else
+            ierror_c = MPIR_Recv_cdesc(buf, count, datatype%MPI_VAL, source, tag, comm%MPI_VAL, c_loc(status))
+        end if
+    else
+        count_c = count
+        datatype_c = datatype%MPI_VAL
+        source_c = source
+        tag_c = tag
+        comm_c = comm%MPI_VAL
+        if (c_associated(c_loc(status), c_loc(MPI_STATUS_IGNORE))) then
+            ierror_c = MPIR_Recv_cdesc(buf, count_c, datatype_c, source_c, tag_c, comm_c, MPIR_C_MPI_STATUS_IGNORE)
+        else
+            ierror_c = MPIR_Recv_cdesc(buf, count_c, datatype_c, source_c, tag_c, comm_c, c_loc(status_c))
+            status = status_c
+        end if
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Recv_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/recv_init_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/recv_init_f08ts.F90
new file mode 100644
index 0000000..d9cc346
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/recv_init_f08ts.F90
@@ -0,0 +1,45 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Recv_init_f08ts(buf, count, datatype, source, tag, comm, request, ierror)
+    use :: mpi_f08, only : MPI_Datatype, MPI_Comm, MPI_Request
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Datatype, c_Comm, c_Request
+    use :: mpi_c_interface, only : MPIR_Recv_init_cdesc
+
+    implicit none
+
+    type(*), dimension(..) :: buf
+    integer, intent(in) :: count
+    integer, intent(in) :: source
+    integer, intent(in) :: tag
+    type(MPI_Datatype), intent(in) :: datatype
+    type(MPI_Comm), intent(in) :: comm
+    type(MPI_Request), intent(out) :: request
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: count_c
+    integer(c_int) :: source_c
+    integer(c_int) :: tag_c
+    integer(c_Datatype) :: datatype_c
+    integer(c_Comm) :: comm_c
+    integer(c_Request) :: request_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Recv_init_cdesc(buf, count, datatype%MPI_VAL, source, tag, comm%MPI_VAL, request%MPI_VAL)
+    else
+        count_c = count
+        datatype_c = datatype%MPI_VAL
+        source_c = source
+        tag_c = tag
+        comm_c = comm%MPI_VAL
+        ierror_c = MPIR_Recv_init_cdesc(buf, count_c, datatype_c, source_c, tag_c, comm_c, request_c)
+        request%MPI_VAL = request_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Recv_init_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/reduce_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/reduce_f08ts.F90
new file mode 100644
index 0000000..6acbef1
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/reduce_f08ts.F90
@@ -0,0 +1,43 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Reduce_f08ts(sendbuf, recvbuf, count, datatype, op, root, comm, ierror)
+    use :: mpi_f08, only : MPI_Datatype, MPI_Op, MPI_Comm
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Datatype, c_Op, c_Comm
+    use :: mpi_c_interface, only : MPIR_Reduce_cdesc
+
+    implicit none
+
+    type(*), dimension(..), intent(in) :: sendbuf
+    type(*), dimension(..) :: recvbuf
+    integer, intent(in) :: count
+    integer, intent(in) :: root
+    type(MPI_Datatype), intent(in) :: datatype
+    type(MPI_Op), intent(in) :: op
+    type(MPI_Comm), intent(in) :: comm
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: count_c
+    integer(c_int) :: root_c
+    integer(c_Datatype) :: datatype_c
+    integer(c_Op) :: op_c
+    integer(c_Comm) :: comm_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Reduce_cdesc(sendbuf, recvbuf, count, datatype%MPI_VAL, op%MPI_VAL, root, comm%MPI_VAL)
+    else
+        count_c = count
+        datatype_c = datatype%MPI_VAL
+        op_c = op%MPI_VAL
+        root_c = root
+        comm_c = comm%MPI_VAL
+        ierror_c = MPIR_Reduce_cdesc(sendbuf, recvbuf, count_c, datatype_c, op_c, root_c, comm_c)
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Reduce_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/reduce_local_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/reduce_local_f08ts.F90
new file mode 100644
index 0000000..1ec79ed
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/reduce_local_f08ts.F90
@@ -0,0 +1,37 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Reduce_local_f08ts(inbuf, inoutbuf, count, datatype, op, ierror)
+    use :: mpi_f08, only : MPI_Datatype, MPI_Op
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Datatype, c_Op
+    use :: mpi_c_interface, only : MPIR_Reduce_local_cdesc
+
+    implicit none
+
+    type(*), dimension(..), intent(in) :: inbuf
+    type(*), dimension(..) :: inoutbuf
+    integer, intent(in) :: count
+    type(MPI_Datatype), intent(in) :: datatype
+    type(MPI_Op), intent(in) :: op
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: count_c
+    integer(c_Datatype) :: datatype_c
+    integer(c_Op) :: op_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Reduce_local_cdesc(inbuf, inoutbuf, count, datatype%MPI_VAL, op%MPI_VAL)
+    else
+        count_c = count
+        datatype_c = datatype%MPI_VAL
+        op_c = op%MPI_VAL
+        ierror_c = MPIR_Reduce_local_cdesc(inbuf, inoutbuf, count_c, datatype_c, op_c)
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Reduce_local_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/reduce_scatter_block_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/reduce_scatter_block_f08ts.F90
new file mode 100644
index 0000000..4cca1f5
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/reduce_scatter_block_f08ts.F90
@@ -0,0 +1,43 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Reduce_scatter_block_f08ts(sendbuf, recvbuf, recvcount, datatype, op, comm, &
+    ierror)
+    use :: mpi_f08, only : MPI_Datatype, MPI_Op, MPI_Comm
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Datatype, c_Op, c_Comm
+    use :: mpi_c_interface, only : MPIR_Reduce_scatter_block_cdesc
+
+    implicit none
+
+    type(*), dimension(..), intent(in) :: sendbuf
+    type(*), dimension(..) :: recvbuf
+    integer, intent(in) :: recvcount
+    type(MPI_Datatype), intent(in) :: datatype
+    type(MPI_Op), intent(in) :: op
+    type(MPI_Comm), intent(in) :: comm
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: recvcount_c
+    integer(c_Datatype) :: datatype_c
+    integer(c_Op) :: op_c
+    integer(c_Comm) :: comm_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Reduce_scatter_block_cdesc(sendbuf, recvbuf, recvcount, datatype%MPI_VAL, op%MPI_VAL, &
+            comm%MPI_VAL)
+    else
+        recvcount_c = recvcount
+        datatype_c = datatype%MPI_VAL
+        op_c = op%MPI_VAL
+        comm_c = comm%MPI_VAL
+        ierror_c = MPIR_Reduce_scatter_block_cdesc(sendbuf, recvbuf, recvcount_c, datatype_c, op_c, &
+            comm_c)
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Reduce_scatter_block_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/reduce_scatter_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/reduce_scatter_f08ts.F90
new file mode 100644
index 0000000..5df0680
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/reduce_scatter_f08ts.F90
@@ -0,0 +1,44 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Reduce_scatter_f08ts(sendbuf, recvbuf, recvcounts, datatype, op, comm, &
+    ierror)
+    use :: mpi_f08, only : MPI_Datatype, MPI_Op, MPI_Comm
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Datatype, c_Op, c_Comm
+    use :: mpi_c_interface, only : MPIR_Reduce_scatter_cdesc, MPIR_Comm_size_c
+
+    implicit none
+
+    type(*), dimension(..), intent(in)  :: sendbuf
+    type(*), dimension(..)  :: recvbuf
+    integer, intent(in)  :: recvcounts(*)
+    type(MPI_Datatype), intent(in)  :: datatype
+    type(MPI_Op), intent(in)  :: op
+    type(MPI_Comm), intent(in)  :: comm
+    integer, optional, intent(out)  :: ierror
+
+    integer(c_int), allocatable :: recvcounts_c(:)
+    integer(c_Datatype) :: datatype_c
+    integer(c_Op) :: op_c
+    integer(c_Comm) :: comm_c
+    integer(c_int) :: ierror_c
+    integer(c_int) :: err, length ! To get length of assumed-size arrays
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Reduce_scatter_cdesc(sendbuf, recvbuf, recvcounts, datatype%MPI_VAL, op%MPI_VAL, comm%MPI_VAL)
+    else
+        datatype_c = datatype%MPI_VAL
+        op_c = op%MPI_VAL
+        comm_c = comm%MPI_VAL
+        err = MPIR_Comm_size_c(comm_c, length)
+        recvcounts_c = recvcounts(1:length)
+
+        ierror_c = MPIR_Reduce_scatter_cdesc(sendbuf, recvbuf, recvcounts_c, datatype_c, op_c, comm_c)
+    end if
+
+    if(present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Reduce_scatter_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/register_datarep_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/register_datarep_f08ts.F90
new file mode 100644
index 0000000..1f3c730
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/register_datarep_f08ts.F90
@@ -0,0 +1,50 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Register_datarep_f08(datarep, read_conversion_fn, write_conversion_fn, &
+    dtype_file_extent_fn, extra_state, ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_char
+    use, intrinsic :: iso_c_binding, only : c_funloc, c_funptr, c_associated, C_NULL_FUNPTR
+    use :: mpi_f08, only : MPI_ADDRESS_KIND
+    use :: mpi_f08, only : MPI_CONVERSION_FN_NULL
+    use :: mpi_f08, only : MPI_Datarep_conversion_function
+    use :: mpi_f08, only : MPI_Datarep_extent_function
+    use :: mpi_c_interface, only : MPIR_Register_datarep_c
+    use :: mpi_c_interface, only : MPIR_Fortran_string_f2c
+
+    implicit none
+
+    character(len=*), intent(in) :: datarep
+    procedure(MPI_Datarep_conversion_function) :: read_conversion_fn
+    procedure(MPI_Datarep_conversion_function) :: write_conversion_fn
+    procedure(MPI_Datarep_extent_function) :: dtype_file_extent_fn
+    integer(MPI_ADDRESS_KIND), intent(in) :: extra_state
+    integer, optional, intent(out) :: ierror
+
+    character(kind=c_char) :: datarep_c(len_trim(datarep)+1)
+    type(c_funptr) :: read_conversion_fn_c
+    type(c_funptr) :: write_conversion_fn_c
+    type(c_funptr) :: dtype_file_extent_fn_c
+    integer(c_int) :: ierror_c
+
+    call MPIR_Fortran_string_f2c(datarep, datarep_c)
+
+    read_conversion_fn_c = c_funloc(read_conversion_fn)
+    write_conversion_fn_c = c_funloc(write_conversion_fn)
+    dtype_file_extent_fn_c = c_funloc(dtype_file_extent_fn)
+
+    if (c_associated(read_conversion_fn_c, c_funloc(MPI_CONVERSION_FN_NULL))) then
+        read_conversion_fn_c = C_NULL_FUNPTR
+    end if
+
+    if (c_associated(write_conversion_fn_c, c_funloc(MPI_CONVERSION_FN_NULL))) then
+        read_conversion_fn_c = C_NULL_FUNPTR
+    end if
+
+    ierror_c = MPIR_Register_datarep_c(datarep_c, read_conversion_fn_c, write_conversion_fn_c, &
+                                       dtype_file_extent_fn_c, extra_state)
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Register_datarep_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/request_free_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/request_free_f08ts.F90
new file mode 100644
index 0000000..3d53550
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/request_free_f08ts.F90
@@ -0,0 +1,30 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Request_free_f08(request, ierror)
+    use :: mpi_f08, only : MPI_Request
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Request
+    use :: mpi_c_interface, only : MPIR_Request_free_c
+
+    implicit none
+
+    type(MPI_Request), intent(inout) :: request
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Request) :: request_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Request_free_c(request%MPI_VAL)
+    else
+        request_c = request%MPI_VAL
+        ierror_c = MPIR_Request_free_c(request_c)
+        request%MPI_VAL = request_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Request_free_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/request_get_status_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/request_get_status_f08ts.F90
new file mode 100644
index 0000000..78cffb1
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/request_get_status_f08ts.F90
@@ -0,0 +1,46 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Request_get_status_f08(request, flag, status, ierror)
+    use :: mpi_f08, only : MPI_Request, MPI_Status
+    use, intrinsic :: iso_c_binding, only : c_loc, c_associated
+    use :: mpi_f08, only : MPI_STATUS_IGNORE, MPIR_C_MPI_STATUS_IGNORE, assignment(=)
+    use, intrinsic :: iso_c_binding, only : c_int, c_ptr
+    use :: mpi_c_interface, only : c_Request
+    use :: mpi_c_interface, only : c_Status
+    use :: mpi_c_interface, only : MPIR_Request_get_status_c
+
+    implicit none
+
+    type(MPI_Request), intent(in) :: request
+    logical, intent(out) :: flag
+    type(MPI_Status), target :: status
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Request) :: request_c
+    integer(c_int) :: flag_c
+    type(c_Status), target :: status_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        if (c_associated(c_loc(status), c_loc(MPI_STATUS_IGNORE))) then
+            ierror_c = MPIR_Request_get_status_c(request%MPI_VAL, flag_c, MPIR_C_MPI_STATUS_IGNORE)
+        else
+            ierror_c = MPIR_Request_get_status_c(request%MPI_VAL, flag_c, c_loc(status))
+        end if
+    else
+        request_c = request%MPI_VAL
+        if (c_associated(c_loc(status), c_loc(MPI_STATUS_IGNORE))) then
+            ierror_c = MPIR_Request_get_status_c(request_c, flag_c, MPIR_C_MPI_STATUS_IGNORE)
+        else
+            ierror_c = MPIR_Request_get_status_c(request_c, flag_c, c_loc(status_c))
+            status = status_c
+        end if
+    end if
+
+    flag = (flag_c /= 0)
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Request_get_status_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/rsend_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/rsend_f08ts.F90
new file mode 100644
index 0000000..16430ad
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/rsend_f08ts.F90
@@ -0,0 +1,42 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Rsend_f08ts(buf, count, datatype, dest, tag, comm, ierror)
+    use :: mpi_f08, only : MPI_Datatype, MPI_Comm
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Datatype, c_Comm
+    use :: mpi_c_interface, only : MPIR_Rsend_cdesc
+
+    implicit none
+
+    type(*), dimension(..), intent(in) :: buf
+    integer, intent(in) :: count
+    integer, intent(in) :: dest
+    integer, intent(in) :: tag
+    type(MPI_Datatype), intent(in) :: datatype
+    type(MPI_Comm), intent(in) :: comm
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: count_c
+    integer(c_int) :: dest_c
+    integer(c_int) :: tag_c
+    integer(c_Datatype) :: datatype_c
+    integer(c_Comm) :: comm_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Rsend_cdesc(buf, count, datatype%MPI_VAL, dest, tag, comm%MPI_VAL)
+    else
+        count_c = count
+        datatype_c = datatype%MPI_VAL
+        dest_c = dest
+        tag_c = tag
+        comm_c = comm%MPI_VAL
+        ierror_c = MPIR_Rsend_cdesc(buf, count_c, datatype_c, dest_c, tag_c, comm_c)
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Rsend_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/rsend_init_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/rsend_init_f08ts.F90
new file mode 100644
index 0000000..4cd927a
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/rsend_init_f08ts.F90
@@ -0,0 +1,45 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Rsend_init_f08ts(buf, count, datatype, dest, tag, comm, request, ierror)
+    use :: mpi_f08, only : MPI_Datatype, MPI_Comm, MPI_Request
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Datatype, c_Comm, c_Request
+    use :: mpi_c_interface, only : MPIR_Rsend_init_cdesc
+
+    implicit none
+
+    type(*), dimension(..) :: buf
+    integer, intent(in) :: count
+    integer, intent(in) :: dest
+    integer, intent(in) :: tag
+    type(MPI_Datatype), intent(in) :: datatype
+    type(MPI_Comm), intent(in) :: comm
+    type(MPI_Request), intent(out) :: request
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: count_c
+    integer(c_int) :: dest_c
+    integer(c_int) :: tag_c
+    integer(c_Datatype) :: datatype_c
+    integer(c_Comm) :: comm_c
+    integer(c_Request) :: request_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Rsend_init_cdesc(buf, count, datatype%MPI_VAL, dest, tag, comm%MPI_VAL, request%MPI_VAL)
+    else
+        count_c = count
+        datatype_c = datatype%MPI_VAL
+        dest_c = dest
+        tag_c = tag
+        comm_c = comm%MPI_VAL
+        ierror_c = MPIR_Rsend_init_cdesc(buf, count_c, datatype_c, dest_c, tag_c, comm_c, request_c)
+        request%MPI_VAL = request_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Rsend_init_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/scan_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/scan_f08ts.F90
new file mode 100644
index 0000000..9d35a16
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/scan_f08ts.F90
@@ -0,0 +1,40 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Scan_f08ts(sendbuf, recvbuf, count, datatype, op, comm, ierror)
+    use :: mpi_f08, only : MPI_Datatype, MPI_Op, MPI_Comm
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Datatype, c_Op, c_Comm
+    use :: mpi_c_interface, only : MPIR_Scan_cdesc
+
+    implicit none
+
+    type(*), dimension(..), intent(in) :: sendbuf
+    type(*), dimension(..) :: recvbuf
+    integer, intent(in) :: count
+    type(MPI_Datatype), intent(in) :: datatype
+    type(MPI_Op), intent(in) :: op
+    type(MPI_Comm), intent(in) :: comm
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: count_c
+    integer(c_Datatype) :: datatype_c
+    integer(c_Op) :: op_c
+    integer(c_Comm) :: comm_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Scan_cdesc(sendbuf, recvbuf, count, datatype%MPI_VAL, op%MPI_VAL, comm%MPI_VAL)
+    else
+        count_c = count
+        datatype_c = datatype%MPI_VAL
+        op_c = op%MPI_VAL
+        comm_c = comm%MPI_VAL
+        ierror_c = MPIR_Scan_cdesc(sendbuf, recvbuf, count_c, datatype_c, op_c, comm_c)
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Scan_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/scatter_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/scatter_f08ts.F90
new file mode 100644
index 0000000..835e4b6
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/scatter_f08ts.F90
@@ -0,0 +1,49 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Scatter_f08ts(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, &
+    root, comm, ierror)
+    use :: mpi_f08, only : MPI_Datatype, MPI_Comm
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Datatype, c_Comm
+    use :: mpi_c_interface, only : MPIR_Scatter_cdesc
+
+    implicit none
+
+    type(*), dimension(..), intent(in) :: sendbuf
+    type(*), dimension(..) :: recvbuf
+    integer, intent(in) :: sendcount
+    integer, intent(in) :: recvcount
+    integer, intent(in) :: root
+    type(MPI_Datatype), intent(in) :: sendtype
+    type(MPI_Datatype), intent(in) :: recvtype
+    type(MPI_Comm), intent(in) :: comm
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: sendcount_c
+    integer(c_int) :: recvcount_c
+    integer(c_int) :: root_c
+    integer(c_Datatype) :: sendtype_c
+    integer(c_Datatype) :: recvtype_c
+    integer(c_Comm) :: comm_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Scatter_cdesc(sendbuf, sendcount, sendtype%MPI_VAL, recvbuf, recvcount, recvtype%MPI_VAL, &
+            root, comm%MPI_VAL)
+    else
+        sendcount_c = sendcount
+        sendtype_c = sendtype%MPI_VAL
+        recvcount_c = recvcount
+        recvtype_c = recvtype%MPI_VAL
+        root_c = root
+        comm_c = comm%MPI_VAL
+        ierror_c = MPIR_Scatter_cdesc(sendbuf, sendcount_c, sendtype_c, recvbuf, recvcount_c, recvtype_c, &
+            root_c, comm_c)
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Scatter_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/scatterv_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/scatterv_f08ts.F90
new file mode 100644
index 0000000..0eccba4
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/scatterv_f08ts.F90
@@ -0,0 +1,56 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Scatterv_f08ts(sendbuf, sendcounts, displs, sendtype, recvbuf, recvcount, &
+    recvtype, root, comm, ierror)
+    use :: mpi_f08, only : MPI_Datatype, MPI_Comm
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Datatype, c_Comm
+    use :: mpi_c_interface, only : MPIR_Scatterv_cdesc, MPIR_Comm_size_c
+
+    implicit none
+
+    type(*), dimension(..), intent(in) :: sendbuf
+    type(*), dimension(..) :: recvbuf
+    integer, intent(in) :: recvcount
+    integer, intent(in) :: root
+    integer, intent(in) :: sendcounts(*)
+    integer, intent(in) :: displs(*)
+    type(MPI_Datatype), intent(in) :: sendtype
+    type(MPI_Datatype), intent(in) :: recvtype
+    type(MPI_Comm), intent(in) :: comm
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: recvcount_c
+    integer(c_int) :: root_c
+    integer(c_int), allocatable :: sendcounts_c(:)
+    integer(c_int), allocatable :: displs_c(:)
+    integer(c_Datatype) :: sendtype_c
+    integer(c_Datatype) :: recvtype_c
+    integer(c_Comm) :: comm_c
+    integer(c_int) :: ierror_c
+    integer(c_int) :: err, length ! To get length of assumed-size arrays
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Scatterv_cdesc(sendbuf, sendcounts, displs, sendtype%MPI_VAL, &
+            recvbuf, recvcount, recvtype%MPI_VAL, root, comm%MPI_VAL)
+    else
+        sendtype_c = sendtype%MPI_VAL
+        recvcount_c = recvcount
+        recvtype_c = recvtype%MPI_VAL
+        root_c = root
+        comm_c = comm%MPI_VAL
+
+        err = MPIR_Comm_size_c(comm_c, length)
+        sendcounts_c = sendcounts(1:length)
+        displs_c = displs(1:length)
+
+        ierror_c = MPIR_Scatterv_cdesc(sendbuf, sendcounts_c, displs_c, sendtype_c, recvbuf, recvcount_c, recvtype_c, &
+            root_c, comm_c)
+    end if
+
+    if(present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Scatterv_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/send_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/send_f08ts.F90
new file mode 100644
index 0000000..07e2f7f
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/send_f08ts.F90
@@ -0,0 +1,42 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Send_f08ts(buf, count, datatype, dest, tag, comm, ierror)
+    use :: mpi_f08, only : MPI_Datatype, MPI_Comm
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Datatype, c_Comm
+    use :: mpi_c_interface, only : MPIR_Send_cdesc
+
+    implicit none
+
+    type(*), dimension(..), intent(in) :: buf
+    integer, intent(in) :: count
+    integer, intent(in) :: dest
+    integer, intent(in) :: tag
+    type(MPI_Datatype), intent(in) :: datatype
+    type(MPI_Comm), intent(in) :: comm
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: count_c
+    integer(c_int) :: dest_c
+    integer(c_int) :: tag_c
+    integer(c_Datatype) :: datatype_c
+    integer(c_Comm) :: comm_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Send_cdesc(buf, count, datatype%MPI_VAL, dest, tag, comm%MPI_VAL)
+    else
+        count_c = count
+        datatype_c = datatype%MPI_VAL
+        dest_c = dest
+        tag_c = tag
+        comm_c = comm%MPI_VAL
+        ierror_c = MPIR_Send_cdesc(buf, count_c, datatype_c, dest_c, tag_c, comm_c)
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Send_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/send_init_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/send_init_f08ts.F90
new file mode 100644
index 0000000..bfb00fb
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/send_init_f08ts.F90
@@ -0,0 +1,45 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Send_init_f08ts(buf, count, datatype, dest, tag, comm, request, ierror)
+    use :: mpi_f08, only : MPI_Datatype, MPI_Comm, MPI_Request
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Datatype, c_Comm, c_Request
+    use :: mpi_c_interface, only : MPIR_Send_init_cdesc
+
+    implicit none
+
+    type(*), dimension(..) :: buf
+    integer, intent(in) :: count
+    integer, intent(in) :: dest
+    integer, intent(in) :: tag
+    type(MPI_Datatype), intent(in) :: datatype
+    type(MPI_Comm), intent(in) :: comm
+    type(MPI_Request), intent(out) :: request
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: count_c
+    integer(c_int) :: dest_c
+    integer(c_int) :: tag_c
+    integer(c_Datatype) :: datatype_c
+    integer(c_Comm) :: comm_c
+    integer(c_Request) :: request_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Send_init_cdesc(buf, count, datatype%MPI_VAL, dest, tag, comm%MPI_VAL, request%MPI_VAL)
+    else
+        count_c = count
+        datatype_c = datatype%MPI_VAL
+        dest_c = dest
+        tag_c = tag
+        comm_c = comm%MPI_VAL
+        ierror_c = MPIR_Send_init_cdesc(buf, count_c, datatype_c, dest_c, tag_c, comm_c, request_c)
+        request%MPI_VAL = request_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Send_init_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/sendrecv_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/sendrecv_f08ts.F90
new file mode 100644
index 0000000..3d62d66
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/sendrecv_f08ts.F90
@@ -0,0 +1,74 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Sendrecv_f08ts(sendbuf, sendcount, sendtype, dest, sendtag, recvbuf, &
+    recvcount, recvtype, source, recvtag, comm, status, ierror)
+    use :: mpi_f08, only : MPI_Datatype, MPI_Comm, MPI_Status
+    use, intrinsic :: iso_c_binding, only : c_loc, c_associated
+    use :: mpi_f08, only : MPI_STATUS_IGNORE, MPIR_C_MPI_STATUS_IGNORE, assignment(=)
+    use, intrinsic :: iso_c_binding, only : c_int, c_ptr
+    use :: mpi_c_interface, only : c_Datatype, c_Comm
+    use :: mpi_c_interface, only : c_Status
+    use :: mpi_c_interface, only : MPIR_Sendrecv_cdesc
+
+    implicit none
+
+    type(*), dimension(..), intent(in) :: sendbuf
+    type(*), dimension(..) :: recvbuf
+    integer, intent(in) :: sendcount
+    integer, intent(in) :: dest
+    integer, intent(in) :: sendtag
+    integer, intent(in) :: recvcount
+    integer, intent(in) :: source
+    integer, intent(in) :: recvtag
+    type(MPI_Datatype), intent(in) :: sendtype
+    type(MPI_Datatype), intent(in) :: recvtype
+    type(MPI_Comm), intent(in) :: comm
+    type(MPI_Status), target :: status
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: sendcount_c
+    integer(c_int) :: dest_c
+    integer(c_int) :: sendtag_c
+    integer(c_int) :: recvcount_c
+    integer(c_int) :: source_c
+    integer(c_int) :: recvtag_c
+    integer(c_Datatype) :: sendtype_c
+    integer(c_Datatype) :: recvtype_c
+    integer(c_Comm) :: comm_c
+    type(c_Status), target :: status_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        if (c_associated(c_loc(status), c_loc(MPI_STATUS_IGNORE))) then
+            ierror_c = MPIR_Sendrecv_cdesc(sendbuf, sendcount, sendtype%MPI_VAL, dest, sendtag, recvbuf, recvcount, &
+            recvtype%MPI_VAL, source, recvtag, comm%MPI_VAL, MPIR_C_MPI_STATUS_IGNORE)
+        else
+            ierror_c = MPIR_Sendrecv_cdesc(sendbuf, sendcount, sendtype%MPI_VAL, dest, sendtag, recvbuf, recvcount, &
+            recvtype%MPI_VAL, source, recvtag, comm%MPI_VAL, c_loc(status))
+        end if
+    else
+        sendcount_c = sendcount
+        sendtype_c = sendtype%MPI_VAL
+        dest_c = dest
+        sendtag_c = sendtag
+        recvcount_c = recvcount
+        recvtype_c = recvtype%MPI_VAL
+        source_c = source
+        recvtag_c = recvtag
+        comm_c = comm%MPI_VAL
+        if (c_associated(c_loc(status), c_loc(MPI_STATUS_IGNORE))) then
+            ierror_c = MPIR_Sendrecv_cdesc(sendbuf, sendcount_c, sendtype_c, dest_c, sendtag_c, recvbuf, &
+            recvcount_c, recvtype_c, source_c, recvtag_c, comm_c, MPIR_C_MPI_STATUS_IGNORE)
+        else
+            ierror_c = MPIR_Sendrecv_cdesc(sendbuf, sendcount_c, sendtype_c, dest_c, sendtag_c, recvbuf, &
+            recvcount_c, recvtype_c, source_c, recvtag_c, comm_c, c_loc(status_c))
+            status = status_c
+        end if
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Sendrecv_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/sendrecv_replace_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/sendrecv_replace_f08ts.F90
new file mode 100644
index 0000000..5e3b0cf
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/sendrecv_replace_f08ts.F90
@@ -0,0 +1,67 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Sendrecv_replace_f08ts(buf, count, datatype, dest, sendtag, source, recvtag, &
+    comm, status, ierror)
+    use :: mpi_f08, only : MPI_Datatype, MPI_Comm, MPI_Status
+    use, intrinsic :: iso_c_binding, only : c_loc, c_associated
+    use :: mpi_f08, only : MPI_STATUS_IGNORE, MPIR_C_MPI_STATUS_IGNORE, assignment(=)
+    use, intrinsic :: iso_c_binding, only : c_int, c_ptr
+    use :: mpi_c_interface, only : c_Datatype, c_Comm
+    use :: mpi_c_interface, only : c_Status
+    use :: mpi_c_interface, only : MPIR_Sendrecv_replace_cdesc
+
+    implicit none
+
+    type(*), dimension(..) :: buf
+    integer, intent(in) :: count
+    integer, intent(in) :: dest
+    integer, intent(in) :: sendtag
+    integer, intent(in) :: source
+    integer, intent(in) :: recvtag
+    type(MPI_Datatype), intent(in) :: datatype
+    type(MPI_Comm), intent(in) :: comm
+    type(MPI_Status), target :: status
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: count_c
+    integer(c_int) :: dest_c
+    integer(c_int) :: sendtag_c
+    integer(c_int) :: source_c
+    integer(c_int) :: recvtag_c
+    integer(c_Datatype) :: datatype_c
+    integer(c_Comm) :: comm_c
+    type(c_Status), target :: status_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        if (c_associated(c_loc(status), c_loc(MPI_STATUS_IGNORE))) then
+            ierror_c = MPIR_Sendrecv_replace_cdesc(buf, count, datatype%MPI_VAL, dest, sendtag, source, recvtag, &
+            comm%MPI_VAL, MPIR_C_MPI_STATUS_IGNORE)
+        else
+            ierror_c = MPIR_Sendrecv_replace_cdesc(buf, count, datatype%MPI_VAL, dest, sendtag, source, recvtag, &
+            comm%MPI_VAL, c_loc(status))
+        end if
+    else
+        count_c = count
+        datatype_c = datatype%MPI_VAL
+        dest_c = dest
+        sendtag_c = sendtag
+        source_c = source
+        recvtag_c = recvtag
+        comm_c = comm%MPI_VAL
+        if (c_associated(c_loc(status), c_loc(MPI_STATUS_IGNORE))) then
+            ierror_c = MPIR_Sendrecv_replace_cdesc(buf, count_c, datatype_c, dest_c, sendtag_c, source_c, &
+            recvtag_c, comm_c, MPIR_C_MPI_STATUS_IGNORE)
+        else
+            ierror_c = MPIR_Sendrecv_replace_cdesc(buf, count_c, datatype_c, dest_c, sendtag_c, source_c, &
+            recvtag_c, comm_c, c_loc(status_c))
+            status = status_c
+        end if
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Sendrecv_replace_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/ssend_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/ssend_f08ts.F90
new file mode 100644
index 0000000..5f2ff03
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/ssend_f08ts.F90
@@ -0,0 +1,42 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Ssend_f08ts(buf, count, datatype, dest, tag, comm, ierror)
+    use :: mpi_f08, only : MPI_Datatype, MPI_Comm
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Datatype, c_Comm
+    use :: mpi_c_interface, only : MPIR_Ssend_cdesc
+
+    implicit none
+
+    type(*), dimension(..), intent(in) :: buf
+    integer, intent(in) :: count
+    integer, intent(in) :: dest
+    integer, intent(in) :: tag
+    type(MPI_Datatype), intent(in) :: datatype
+    type(MPI_Comm), intent(in) :: comm
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: count_c
+    integer(c_int) :: dest_c
+    integer(c_int) :: tag_c
+    integer(c_Datatype) :: datatype_c
+    integer(c_Comm) :: comm_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Ssend_cdesc(buf, count, datatype%MPI_VAL, dest, tag, comm%MPI_VAL)
+    else
+        count_c = count
+        datatype_c = datatype%MPI_VAL
+        dest_c = dest
+        tag_c = tag
+        comm_c = comm%MPI_VAL
+        ierror_c = MPIR_Ssend_cdesc(buf, count_c, datatype_c, dest_c, tag_c, comm_c)
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Ssend_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/ssend_init_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/ssend_init_f08ts.F90
new file mode 100644
index 0000000..31323ff
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/ssend_init_f08ts.F90
@@ -0,0 +1,45 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Ssend_init_f08ts(buf, count, datatype, dest, tag, comm, request, ierror)
+    use :: mpi_f08, only : MPI_Datatype, MPI_Comm, MPI_Request
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Datatype, c_Comm, c_Request
+    use :: mpi_c_interface, only : MPIR_Ssend_init_cdesc
+
+    implicit none
+
+    type(*), dimension(..) :: buf
+    integer, intent(in) :: count
+    integer, intent(in) :: dest
+    integer, intent(in) :: tag
+    type(MPI_Datatype), intent(in) :: datatype
+    type(MPI_Comm), intent(in) :: comm
+    type(MPI_Request), intent(out) :: request
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: count_c
+    integer(c_int) :: dest_c
+    integer(c_int) :: tag_c
+    integer(c_Datatype) :: datatype_c
+    integer(c_Comm) :: comm_c
+    integer(c_Request) :: request_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Ssend_init_cdesc(buf, count, datatype%MPI_VAL, dest, tag, comm%MPI_VAL, request%MPI_VAL)
+    else
+        count_c = count
+        datatype_c = datatype%MPI_VAL
+        dest_c = dest
+        tag_c = tag
+        comm_c = comm%MPI_VAL
+        ierror_c = MPIR_Ssend_init_cdesc(buf, count_c, datatype_c, dest_c, tag_c, comm_c, request_c)
+        request%MPI_VAL = request_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Ssend_init_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/start_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/start_f08ts.F90
new file mode 100644
index 0000000..385a1b2
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/start_f08ts.F90
@@ -0,0 +1,30 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Start_f08(request, ierror)
+    use :: mpi_f08, only : MPI_Request
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Request
+    use :: mpi_c_interface, only : MPIR_Start_c
+
+    implicit none
+
+    type(MPI_Request), intent(inout) :: request
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Request) :: request_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Start_c(request%MPI_VAL)
+    else
+        request_c = request%MPI_VAL
+        ierror_c = MPIR_Start_c(request_c)
+        request%MPI_VAL = request_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Start_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/startall_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/startall_f08ts.F90
new file mode 100644
index 0000000..085f71a
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/startall_f08ts.F90
@@ -0,0 +1,33 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Startall_f08(count, array_of_requests, ierror)
+    use :: mpi_f08, only : MPI_Request
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Request
+    use :: mpi_c_interface, only : MPIR_Startall_c
+
+    implicit none
+
+    integer, intent(in) :: count
+    type(MPI_Request), intent(inout) :: array_of_requests(count)
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: count_c
+    integer(c_Request) :: array_of_requests_c(count)
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Startall_c(count, array_of_requests%MPI_VAL)
+    else
+        count_c = count
+        array_of_requests_c = array_of_requests%MPI_VAL
+        ierror_c = MPIR_Startall_c(count_c, array_of_requests_c)
+        array_of_requests%MPI_VAL = array_of_requests_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Startall_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/status_set_cancelled_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/status_set_cancelled_f08ts.F90
new file mode 100644
index 0000000..34d3ad3
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/status_set_cancelled_f08ts.F90
@@ -0,0 +1,34 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Status_set_cancelled_f08(status, flag, ierror)
+    use :: mpi_f08, only : MPI_Status
+    use, intrinsic :: iso_c_binding, only : c_loc, c_associated
+    use :: mpi_f08, only : MPI_STATUS_IGNORE, MPIR_C_MPI_STATUS_IGNORE, assignment(=)
+    use, intrinsic :: iso_c_binding, only : c_int, c_ptr
+    use :: mpi_c_interface, only : c_Status
+    use :: mpi_c_interface, only : MPIR_Status_set_cancelled_c
+
+    implicit none
+
+    type(MPI_Status), intent(inout), target :: status
+    logical, intent(out) :: flag
+    integer, optional, intent(out) :: ierror
+
+    type(c_Status), target :: status_c
+    integer(c_int) :: flag_c
+    integer(c_int) :: ierror_c
+
+    if (c_associated(c_loc(status), c_loc(MPI_STATUS_IGNORE))) then
+        ierror_c = MPIR_Status_set_cancelled_c(MPIR_C_MPI_STATUS_IGNORE, flag_c)
+    else
+        ierror_c = MPIR_Status_set_cancelled_c(c_loc(status_c), flag_c)
+        status = status_c
+    end if
+
+    flag = (flag_c /= 0)
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Status_set_cancelled_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/status_set_elements_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/status_set_elements_f08ts.F90
new file mode 100644
index 0000000..51b05c1
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/status_set_elements_f08ts.F90
@@ -0,0 +1,46 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Status_set_elements_f08(status, datatype, count, ierror)
+    use :: mpi_f08, only : MPI_Status, MPI_Datatype
+    use, intrinsic :: iso_c_binding, only : c_loc, c_associated
+    use :: mpi_f08, only : MPI_STATUS_IGNORE, MPIR_C_MPI_STATUS_IGNORE, assignment(=)
+    use, intrinsic :: iso_c_binding, only : c_int, c_ptr
+    use :: mpi_c_interface, only : c_Datatype
+    use :: mpi_c_interface, only : c_Status
+    use :: mpi_c_interface, only : MPIR_Status_set_elements_c
+
+    implicit none
+
+    type(MPI_Status), intent(inout), target :: status
+    type(MPI_Datatype), intent(in) :: datatype
+    integer, intent(in) :: count
+    integer, optional, intent(out) :: ierror
+
+    type(c_Status), target :: status_c
+    integer(c_Datatype) :: datatype_c
+    integer(c_int) :: count_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        if (c_associated(c_loc(status), c_loc(MPI_STATUS_IGNORE))) then
+            ierror_c = MPIR_Status_set_elements_c(MPIR_C_MPI_STATUS_IGNORE, datatype%MPI_VAL, count)
+        else
+            ierror_c = MPIR_Status_set_elements_c(c_loc(status), datatype%MPI_VAL, count)
+        end if
+    else
+        datatype_c = datatype%MPI_VAL
+        count_c = count
+        if (c_associated(c_loc(status), c_loc(MPI_STATUS_IGNORE))) then
+            ierror_c = MPIR_Status_set_elements_c(MPIR_C_MPI_STATUS_IGNORE, datatype_c, count_c)
+        else
+            ierror_c = MPIR_Status_set_elements_c(c_loc(status_c), datatype_c, count_c)
+            status = status_c
+        end if
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Status_set_elements_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/status_set_elements_x_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/status_set_elements_x_f08ts.F90
new file mode 100644
index 0000000..c45bd88
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/status_set_elements_x_f08ts.F90
@@ -0,0 +1,47 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Status_set_elements_x_f08(status, datatype, count, ierror)
+    use :: mpi_f08, only : MPI_Status, MPI_Datatype
+    use :: mpi_f08, only : MPI_COUNT_KIND
+    use, intrinsic :: iso_c_binding, only : c_loc, c_associated
+    use :: mpi_f08, only : MPI_STATUS_IGNORE, MPIR_C_MPI_STATUS_IGNORE, assignment(=)
+    use, intrinsic :: iso_c_binding, only : c_int, c_ptr
+    use :: mpi_c_interface, only : c_Datatype
+    use :: mpi_c_interface, only : c_Status
+    use :: mpi_c_interface, only : MPIR_Status_set_elements_x_c
+
+    implicit none
+
+    type(MPI_Status), intent(inout), target :: status
+    type(MPI_Datatype), intent(in) :: datatype
+    integer(MPI_COUNT_KIND), intent(in) :: count
+    integer, optional, intent(out) :: ierror
+
+    type(c_Status), target :: status_c
+    integer(c_Datatype) :: datatype_c
+    integer(MPI_COUNT_KIND) :: count_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        if (c_associated(c_loc(status), c_loc(MPI_STATUS_IGNORE))) then
+            ierror_c = MPIR_Status_set_elements_x_c(MPIR_C_MPI_STATUS_IGNORE, datatype%MPI_VAL, count)
+        else
+            ierror_c = MPIR_Status_set_elements_x_c(c_loc(status), datatype%MPI_VAL, count)
+        end if
+    else
+        datatype_c = datatype%MPI_VAL
+        count_c = count
+        if (c_associated(c_loc(status), c_loc(MPI_STATUS_IGNORE))) then
+            ierror_c = MPIR_Status_set_elements_x_c(MPIR_C_MPI_STATUS_IGNORE, datatype_c, count_c)
+        else
+            ierror_c = MPIR_Status_set_elements_x_c(c_loc(status_c), datatype_c, count_c)
+            status = status_c
+        end if
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Status_set_elements_x_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/test_cancelled_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/test_cancelled_f08ts.F90
new file mode 100644
index 0000000..f22effb
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/test_cancelled_f08ts.F90
@@ -0,0 +1,29 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Test_cancelled_f08(status, flag, ierror)
+    use :: mpi_f08, only : MPI_Status
+    use, intrinsic :: iso_c_binding, only : c_loc
+    use :: mpi_f08, only : assignment(=)
+    use, intrinsic :: iso_c_binding, only : c_int, c_ptr
+    use :: mpi_c_interface, only : c_Status
+    use :: mpi_c_interface, only : MPIR_Test_cancelled_c
+
+    implicit none
+
+    type(MPI_Status), intent(in), target :: status
+    logical, intent(out) :: flag
+    integer, optional, intent(out) :: ierror
+
+    type(c_Status), target :: status_c
+    integer(c_int) :: flag_c
+    integer(c_int) :: ierror_c
+
+    ierror_c = MPIR_Test_cancelled_c(c_loc(status), flag_c)
+
+    flag = (flag_c /= 0)
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Test_cancelled_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/test_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/test_f08ts.F90
new file mode 100644
index 0000000..942223a
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/test_f08ts.F90
@@ -0,0 +1,47 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Test_f08(request, flag, status, ierror)
+    use :: mpi_f08, only : MPI_Request, MPI_Status
+    use, intrinsic :: iso_c_binding, only : c_loc, c_associated
+    use :: mpi_f08, only : MPI_STATUS_IGNORE, MPIR_C_MPI_STATUS_IGNORE, assignment(=)
+    use, intrinsic :: iso_c_binding, only : c_int, c_ptr
+    use :: mpi_c_interface, only : c_Request
+    use :: mpi_c_interface, only : c_Status
+    use :: mpi_c_interface, only : MPIR_Test_c
+
+    implicit none
+
+    type(MPI_Request), intent(inout) :: request
+    logical, intent(out) :: flag
+    type(MPI_Status), target :: status
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Request) :: request_c
+    integer(c_int) :: flag_c
+    type(c_Status), target :: status_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        if (c_associated(c_loc(status), c_loc(MPI_STATUS_IGNORE))) then
+            ierror_c = MPIR_Test_c(request%MPI_VAL, flag_c, MPIR_C_MPI_STATUS_IGNORE)
+        else
+            ierror_c = MPIR_Test_c(request%MPI_VAL, flag_c, c_loc(status))
+        end if
+    else
+        request_c = request%MPI_VAL
+        if (c_associated(c_loc(status), c_loc(MPI_STATUS_IGNORE))) then
+            ierror_c = MPIR_Test_c(request_c, flag_c, MPIR_C_MPI_STATUS_IGNORE)
+        else
+            ierror_c = MPIR_Test_c(request_c, flag_c, c_loc(status_c))
+            status = status_c
+        end if
+        request%MPI_VAL = request_c
+    end if
+
+    flag = (flag_c /= 0)
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Test_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/testall_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/testall_f08ts.F90
new file mode 100644
index 0000000..377fef1
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/testall_f08ts.F90
@@ -0,0 +1,55 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Testall_f08(count, array_of_requests, flag, array_of_statuses, ierror)
+    use :: mpi_f08, only : MPI_Request, MPI_Status
+    use, intrinsic :: iso_c_binding, only : c_loc, c_associated
+    use :: mpi_f08, only : MPI_STATUSES_IGNORE, MPIR_C_MPI_STATUSES_IGNORE, assignment(=)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Request
+    use :: mpi_c_interface, only : c_Status
+    use :: mpi_c_interface, only : MPIR_Testall_c
+
+    implicit none
+
+    integer, intent(in) :: count
+    type(MPI_Request), intent(inout) :: array_of_requests(count)
+    logical, intent(out) :: flag
+    type(MPI_Status), target :: array_of_statuses(*)
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: count_c
+    integer(c_Request) :: array_of_requests_c(count)
+    integer(c_int) :: flag_c
+    type(c_Status), target :: array_of_statuses_c(count)
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        if (c_associated(c_loc(array_of_statuses), c_loc(MPI_STATUSES_IGNORE))) then
+            ierror_c = MPIR_Testall_c(count, array_of_requests%MPI_VAL, flag_c, MPIR_C_MPI_STATUSES_IGNORE)
+        else
+            ierror_c = MPIR_Testall_c(count, array_of_requests%MPI_VAL, flag_c, c_loc(array_of_statuses))
+        end if
+    else
+        count_c = count
+        array_of_requests_c = array_of_requests%MPI_VAL
+        if (c_associated(c_loc(array_of_statuses), c_loc(MPI_STATUSES_IGNORE))) then
+            ierror_c = MPIR_Testall_c(count_c, array_of_requests_c, flag_c, MPIR_C_MPI_STATUSES_IGNORE)
+        else
+            ierror_c = MPIR_Testall_c(count_c, array_of_requests_c, flag_c, c_loc(array_of_statuses_c))
+            if (flag_c /= 0) then
+                array_of_statuses(1:count_c) = array_of_statuses_c(1:count_c)
+            end if
+        end if
+
+        if (flag_c /= 0) then
+            array_of_requests%MPI_VAL = array_of_requests_c
+        end if
+    end if
+
+    flag = (flag_c /= 0)
+    if(present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Testall_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/testany_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/testany_f08ts.F90
new file mode 100644
index 0000000..bb562ae
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/testany_f08ts.F90
@@ -0,0 +1,54 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Testany_f08(count, array_of_requests, index, flag, status, ierror)
+    use :: mpi_f08, only : MPI_Request, MPI_Status
+    use, intrinsic :: iso_c_binding, only : c_loc, c_associated
+    use :: mpi_f08, only : MPI_STATUS_IGNORE, MPIR_C_MPI_STATUS_IGNORE, assignment(=)
+    use, intrinsic :: iso_c_binding, only : c_int, c_ptr
+    use :: mpi_c_interface, only : c_Request
+    use :: mpi_c_interface, only : c_Status
+    use :: mpi_c_interface, only : MPIR_Testany_c
+
+    implicit none
+
+    integer, intent(in) :: count
+    type(MPI_Request), intent(inout) :: array_of_requests(count)
+    integer, intent(out) :: index
+    logical, intent(out) :: flag
+    type(MPI_Status), target :: status
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: count_c
+    integer(c_Request) :: array_of_requests_c(count)
+    integer(c_int) :: index_c
+    integer(c_int) :: flag_c
+    type(c_Status), target :: status_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        if (c_associated(c_loc(status), c_loc(MPI_STATUS_IGNORE))) then
+            ierror_c = MPIR_Testany_c(count, array_of_requests%MPI_VAL, index, flag_c, MPIR_C_MPI_STATUS_IGNORE)
+        else
+            ierror_c = MPIR_Testany_c(count, array_of_requests%MPI_VAL, index, flag_c, c_loc(status))
+        end if
+    else
+        count_c = count
+        array_of_requests_c = array_of_requests%MPI_VAL
+        if (c_associated(c_loc(status), c_loc(MPI_STATUS_IGNORE))) then
+            ierror_c = MPIR_Testany_c(count_c, array_of_requests_c, index_c, flag_c, MPIR_C_MPI_STATUS_IGNORE)
+        else
+            ierror_c = MPIR_Testany_c(count_c, array_of_requests_c, index_c, flag_c, c_loc(status_c))
+            status = status_c
+        end if
+        array_of_requests%MPI_VAL = array_of_requests_c
+        index = index_c
+    end if
+
+    flag = (flag_c /= 0)
+    if (index >= 0) index = index + 1
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Testany_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/testsome_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/testsome_f08ts.F90
new file mode 100644
index 0000000..2a6be03
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/testsome_f08ts.F90
@@ -0,0 +1,61 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Testsome_f08(incount, array_of_requests, outcount, &
+    array_of_indices, array_of_statuses, ierror)
+    use :: mpi_f08, only : MPI_Request, MPI_Status
+    use, intrinsic :: iso_c_binding, only : c_loc, c_associated
+    use :: mpi_f08, only : MPI_STATUSES_IGNORE, MPIR_C_MPI_STATUSES_IGNORE, assignment(=)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Request
+    use :: mpi_c_interface, only : c_Status
+    use :: mpi_c_interface, only : MPIR_Testsome_c
+
+    implicit none
+
+    integer, intent(in) :: incount
+    type(MPI_Request), intent(inout) :: array_of_requests(incount)
+    integer, intent(out) :: outcount
+    integer, intent(out) :: array_of_indices(*)
+    type(MPI_Status), target :: array_of_statuses(*)
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: incount_c
+    integer(c_Request) :: array_of_requests_c(incount)
+    integer(c_int) :: outcount_c
+    integer(c_int) :: array_of_indices_c(incount)
+    type(c_Status), target :: array_of_statuses_c(incount)
+    integer(c_int) :: ierror_c
+    integer :: i
+
+    if (c_int == kind(0)) then
+        if (c_associated(c_loc(array_of_statuses), c_loc(MPI_STATUSES_IGNORE))) then
+            ierror_c = MPIR_Testsome_c(incount, array_of_requests%MPI_VAL, outcount, array_of_indices, MPIR_C_MPI_STATUSES_IGNORE)
+        else
+            ierror_c = MPIR_Testsome_c(incount, array_of_requests%MPI_VAL, outcount, array_of_indices, c_loc(array_of_statuses))
+        end if
+    else
+        incount_c = incount
+        array_of_requests_c = array_of_requests%MPI_VAL
+        if (c_associated(c_loc(array_of_statuses), c_loc(MPI_STATUSES_IGNORE))) then
+            ierror_c = MPIR_Testsome_c(incount_c, array_of_requests_c, outcount_c, array_of_indices_c, MPIR_C_MPI_STATUSES_IGNORE)
+        else
+            ierror_c = MPIR_Testsome_c(incount_c, array_of_requests_c, outcount_c, array_of_indices_c, c_loc(array_of_statuses_c))
+            array_of_statuses(1:outcount_c) = array_of_statuses_c(1:outcount_c)
+            array_of_indices(1:outcount_c) = array_of_indices_c(1:outcount_c)
+        end if
+        array_of_requests%MPI_VAL = array_of_requests_c
+        outcount = outcount_c
+    end if
+
+    do i = 1, outcount
+        if (array_of_indices(i) >= 0) then
+            array_of_indices(i) = array_of_indices(i) + 1
+        end if
+    end do
+
+    if(present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Testsome_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/topo_test_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/topo_test_f08ts.F90
new file mode 100644
index 0000000..be9e972
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/topo_test_f08ts.F90
@@ -0,0 +1,32 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Topo_test_f08(comm, status, ierror)
+    use :: mpi_f08, only : MPI_Comm, MPI_Status
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Comm
+    use :: mpi_c_interface, only : MPIR_Topo_test_c
+
+    implicit none
+
+    type(MPI_Comm), intent(in) :: comm
+    integer, intent(out) :: status
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Comm) :: comm_c
+    integer(c_int) :: status_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Topo_test_c(comm%MPI_VAL, status)
+    else
+        comm_c = comm%MPI_VAL
+        ierror_c = MPIR_Topo_test_c(comm_c, status_c)
+        status = status_c
+    end if
+
+    if(present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Topo_test_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/type_commit_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/type_commit_f08ts.F90
new file mode 100644
index 0000000..aba0ff9
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/type_commit_f08ts.F90
@@ -0,0 +1,30 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Type_commit_f08(datatype, ierror)
+    use :: mpi_f08, only : MPI_Datatype
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Datatype
+    use :: mpi_c_interface, only : MPIR_Type_commit_c
+
+    implicit none
+
+    type(MPI_Datatype), intent(inout) :: datatype
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Datatype) :: datatype_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Type_commit_c(datatype%MPI_VAL)
+    else
+        datatype_c = datatype%MPI_VAL
+        ierror_c = MPIR_Type_commit_c(datatype_c)
+        datatype%MPI_VAL = datatype_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Type_commit_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/type_contiguous_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/type_contiguous_f08ts.F90
new file mode 100644
index 0000000..ebe3678
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/type_contiguous_f08ts.F90
@@ -0,0 +1,35 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Type_contiguous_f08(count, oldtype, newtype, ierror)
+    use :: mpi_f08, only : MPI_Datatype
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Datatype
+    use :: mpi_c_interface, only : MPIR_Type_contiguous_c
+
+    implicit none
+
+    integer, intent(in) :: count
+    type(MPI_Datatype), intent(in) :: oldtype
+    type(MPI_Datatype), intent(out) :: newtype
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: count_c
+    integer(c_Datatype) :: oldtype_c
+    integer(c_Datatype) :: newtype_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Type_contiguous_c(count, oldtype%MPI_VAL, newtype%MPI_VAL)
+    else
+        count_c = count
+        oldtype_c = oldtype%MPI_VAL
+        ierror_c = MPIR_Type_contiguous_c(count_c, oldtype_c, newtype_c)
+        newtype%MPI_VAL = newtype_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Type_contiguous_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/type_create_darray_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/type_create_darray_f08ts.F90
new file mode 100644
index 0000000..c39c64a
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/type_create_darray_f08ts.F90
@@ -0,0 +1,60 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Type_create_darray_f08(size, rank, ndims, array_of_gsizes, &
+    array_of_distribs, array_of_dargs, array_of_psizes, order, &
+    oldtype, newtype, ierror)
+    use :: mpi_f08, only : MPI_Datatype
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Datatype
+    use :: mpi_c_interface, only : MPIR_Type_create_darray_c
+
+    implicit none
+
+    integer, intent(in) :: size
+    integer, intent(in) :: rank
+    integer, intent(in) :: ndims
+    integer, intent(in) :: order
+    integer, intent(in) :: array_of_gsizes(ndims)
+    integer, intent(in) :: array_of_distribs(ndims)
+    integer, intent(in) :: array_of_dargs(ndims)
+    integer, intent(in) :: array_of_psizes(ndims)
+    type(MPI_Datatype), intent(in) :: oldtype
+    type(MPI_Datatype), intent(out) :: newtype
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: size_c
+    integer(c_int) :: rank_c
+    integer(c_int) :: ndims_c
+    integer(c_int) :: order_c
+    integer(c_int) :: array_of_gsizes_c(ndims)
+    integer(c_int) :: array_of_distribs_c(ndims)
+    integer(c_int) :: array_of_dargs_c(ndims)
+    integer(c_int) :: array_of_psizes_c(ndims)
+    integer(c_Datatype) :: oldtype_c
+    integer(c_Datatype) :: newtype_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Type_create_darray_c(size, rank, ndims, array_of_gsizes, array_of_distribs, array_of_dargs, &
+            array_of_psizes, order, oldtype%MPI_VAL, newtype%MPI_VAL)
+    else
+        size_c = size
+        rank_c = rank
+        ndims_c = ndims
+        array_of_gsizes_c = array_of_gsizes
+        array_of_distribs_c = array_of_distribs
+        array_of_dargs_c = array_of_dargs
+        array_of_psizes_c = array_of_psizes
+        order_c = order
+        oldtype_c = oldtype%MPI_VAL
+        ierror_c = MPIR_Type_create_darray_c(size_c, rank_c, ndims_c, array_of_gsizes_c, array_of_distribs_c, &
+            array_of_dargs_c, array_of_psizes_c, order_c, oldtype_c, newtype_c)
+        newtype%MPI_VAL = newtype_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Type_create_darray_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/type_create_f90_complex_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/type_create_f90_complex_f08ts.F90
new file mode 100644
index 0000000..507f863
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/type_create_f90_complex_f08ts.F90
@@ -0,0 +1,35 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Type_create_f90_complex_f08(p, r, newtype, ierror)
+    use :: mpi_f08, only : MPI_Datatype
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Datatype
+    use :: mpi_c_interface, only : MPIR_Type_create_f90_complex_c
+
+    implicit none
+
+    integer, intent(in) :: p
+    integer, intent(in) :: r
+    type(MPI_Datatype), intent(out) :: newtype
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: p_c
+    integer(c_int) :: r_c
+    integer(c_Datatype) :: newtype_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Type_create_f90_complex_c(p, r, newtype%MPI_VAL)
+    else
+        p_c = p
+        r_c = r
+        ierror_c = MPIR_Type_create_f90_complex_c(p_c, r_c, newtype_c)
+        newtype%MPI_VAL = newtype_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Type_create_f90_complex_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/type_create_f90_integer_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/type_create_f90_integer_f08ts.F90
new file mode 100644
index 0000000..1d39d58
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/type_create_f90_integer_f08ts.F90
@@ -0,0 +1,32 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Type_create_f90_integer_f08(r, newtype, ierror)
+    use :: mpi_f08, only : MPI_Datatype
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Datatype
+    use :: mpi_c_interface, only : MPIR_Type_create_f90_integer_c
+
+    implicit none
+
+    integer, intent(in) :: r
+    type(MPI_Datatype), intent(out) :: newtype
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: r_c
+    integer(c_Datatype) :: newtype_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Type_create_f90_integer_c(r, newtype%MPI_VAL)
+    else
+        r_c = r
+        ierror_c = MPIR_Type_create_f90_integer_c(r_c, newtype_c)
+        newtype%MPI_VAL = newtype_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Type_create_f90_integer_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/type_create_f90_real_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/type_create_f90_real_f08ts.F90
new file mode 100644
index 0000000..2cbe2ad
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/type_create_f90_real_f08ts.F90
@@ -0,0 +1,35 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Type_create_f90_real_f08(p, r, newtype, ierror)
+    use :: mpi_f08, only : MPI_Datatype
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Datatype
+    use :: mpi_c_interface, only : MPIR_Type_create_f90_real_c
+
+    implicit none
+
+    integer, intent(in) :: p
+    integer, intent(in) :: r
+    type(MPI_Datatype), intent(out) :: newtype
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: p_c
+    integer(c_int) :: r_c
+    integer(c_Datatype) :: newtype_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Type_create_f90_real_c(p, r, newtype%MPI_VAL)
+    else
+        p_c = p
+        r_c = r
+        ierror_c = MPIR_Type_create_f90_real_c(p_c, r_c, newtype_c)
+        newtype%MPI_VAL = newtype_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Type_create_f90_real_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/type_create_hindexed_block_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/type_create_hindexed_block_f08ts.F90
new file mode 100644
index 0000000..2bbbdd4
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/type_create_hindexed_block_f08ts.F90
@@ -0,0 +1,45 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Type_create_hindexed_block_f08(count, blocklength, &
+    array_of_displacements, oldtype, newtype, ierror)
+    use :: mpi_f08, only : MPI_Datatype
+    use :: mpi_f08, only : MPI_ADDRESS_KIND
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Datatype
+    use :: mpi_c_interface, only : MPIR_Type_create_hindexed_block_c
+
+    implicit none
+
+    integer, intent(in) :: count
+    integer, intent(in) :: blocklength
+    integer(MPI_ADDRESS_KIND), intent(in) :: array_of_displacements(count)
+    type(MPI_Datatype), intent(in) :: oldtype
+    type(MPI_Datatype), intent(out) :: newtype
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: count_c
+    integer(c_int) :: blocklength_c
+    integer(MPI_ADDRESS_KIND) :: array_of_displacements_c(count)
+    integer(c_Datatype) :: oldtype_c
+    integer(c_Datatype) :: newtype_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Type_create_hindexed_block_c(count, blocklength, array_of_displacements, oldtype%MPI_VAL, &
+            newtype%MPI_VAL)
+    else
+        count_c = count
+        blocklength_c = blocklength
+        array_of_displacements_c = array_of_displacements
+        oldtype_c = oldtype%MPI_VAL
+        ierror_c = MPIR_Type_create_hindexed_block_c(count_c, blocklength_c, array_of_displacements_c, &
+            oldtype_c, newtype_c)
+        newtype%MPI_VAL = newtype_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Type_create_hindexed_block_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/type_create_hindexed_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/type_create_hindexed_f08ts.F90
new file mode 100644
index 0000000..076ea81
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/type_create_hindexed_f08ts.F90
@@ -0,0 +1,45 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Type_create_hindexed_f08(count, array_of_blocklengths, &
+    array_of_displacements, oldtype, newtype, ierror)
+    use :: mpi_f08, only : MPI_Datatype
+    use :: mpi_f08, only : MPI_ADDRESS_KIND
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Datatype
+    use :: mpi_c_interface, only : MPIR_Type_create_hindexed_c
+
+    implicit none
+
+    integer, intent(in) :: count
+    integer, intent(in) :: array_of_blocklengths(count)
+    integer(MPI_ADDRESS_KIND), intent(in) :: array_of_displacements(count)
+    type(MPI_Datatype), intent(in) :: oldtype
+    type(MPI_Datatype), intent(out) :: newtype
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: count_c
+    integer(c_int) :: array_of_blocklengths_c(count)
+    integer(MPI_ADDRESS_KIND) :: array_of_displacements_c(count)
+    integer(c_Datatype) :: oldtype_c
+    integer(c_Datatype) :: newtype_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Type_create_hindexed_c(count, array_of_blocklengths, array_of_displacements, oldtype%MPI_VAL, &
+            newtype%MPI_VAL)
+    else
+        count_c = count
+        array_of_blocklengths_c = array_of_blocklengths
+        array_of_displacements_c = array_of_displacements
+        oldtype_c = oldtype%MPI_VAL
+        ierror_c = MPIR_Type_create_hindexed_c(count_c, array_of_blocklengths_c, array_of_displacements_c, &
+            oldtype_c, newtype_c)
+        newtype%MPI_VAL = newtype_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Type_create_hindexed_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/type_create_hvector_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/type_create_hvector_f08ts.F90
new file mode 100644
index 0000000..82b8e08
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/type_create_hvector_f08ts.F90
@@ -0,0 +1,42 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Type_create_hvector_f08(count, blocklength, stride, oldtype, newtype, ierror)
+    use :: mpi_f08, only : MPI_Datatype
+    use :: mpi_f08, only : MPI_ADDRESS_KIND
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Datatype
+    use :: mpi_c_interface, only : MPIR_Type_create_hvector_c
+
+    implicit none
+
+    integer, intent(in) :: count
+    integer, intent(in) :: blocklength
+    integer(MPI_ADDRESS_KIND), intent(in) :: stride
+    type(MPI_Datatype), intent(in) :: oldtype
+    type(MPI_Datatype), intent(out) :: newtype
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: count_c
+    integer(c_int) :: blocklength_c
+    integer(MPI_ADDRESS_KIND) :: stride_c
+    integer(c_Datatype) :: oldtype_c
+    integer(c_Datatype) :: newtype_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Type_create_hvector_c(count, blocklength, stride, oldtype%MPI_VAL, newtype%MPI_VAL)
+    else
+        count_c = count
+        blocklength_c = blocklength
+        stride_c = stride
+        oldtype_c = oldtype%MPI_VAL
+        ierror_c = MPIR_Type_create_hvector_c(count_c, blocklength_c, stride_c, oldtype_c, newtype_c)
+        newtype%MPI_VAL = newtype_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Type_create_hvector_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/type_create_indexed_block_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/type_create_indexed_block_f08ts.F90
new file mode 100644
index 0000000..44c542d
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/type_create_indexed_block_f08ts.F90
@@ -0,0 +1,44 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Type_create_indexed_block_f08(count, blocklength, &
+    array_of_displacements, oldtype, newtype, ierror)
+    use :: mpi_f08, only : MPI_Datatype
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Datatype
+    use :: mpi_c_interface, only : MPIR_Type_create_indexed_block_c
+
+    implicit none
+
+    integer, intent(in) :: count
+    integer, intent(in) :: blocklength
+    integer, intent(in) :: array_of_displacements(count)
+    type(MPI_Datatype), intent(in) :: oldtype
+    type(MPI_Datatype), intent(out) :: newtype
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: count_c
+    integer(c_int) :: blocklength_c
+    integer(c_int) :: array_of_displacements_c(count)
+    integer(c_Datatype) :: oldtype_c
+    integer(c_Datatype) :: newtype_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Type_create_indexed_block_c(count, blocklength, array_of_displacements, oldtype%MPI_VAL, &
+            newtype%MPI_VAL)
+    else
+        count_c = count
+        blocklength_c = blocklength
+        array_of_displacements_c = array_of_displacements
+        oldtype_c = oldtype%MPI_VAL
+        ierror_c = MPIR_Type_create_indexed_block_c(count_c, blocklength_c, array_of_displacements_c, &
+            oldtype_c, newtype_c)
+        newtype%MPI_VAL = newtype_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Type_create_indexed_block_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/type_create_keyval_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/type_create_keyval_f08ts.F90
new file mode 100644
index 0000000..760a8af
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/type_create_keyval_f08ts.F90
@@ -0,0 +1,38 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Type_create_keyval_f08(type_copy_attr_fn, type_delete_attr_fn, type_keyval, &
+    extra_state, ierror)
+    use, intrinsic :: iso_c_binding, only : c_funloc
+    use, intrinsic :: iso_c_binding, only : c_int, c_funptr
+    use :: mpi_f08, only : MPI_ADDRESS_KIND
+    use :: mpi_f08, only : MPI_Type_copy_attr_function
+    use :: mpi_f08, only : MPI_Type_delete_attr_function
+    use :: mpi_c_interface, only : MPIR_Type_create_keyval_c
+    use :: mpi_c_interface, only : MPIR_Keyval_set_proxy, MPIR_Type_copy_attr_f08_proxy, MPIR_Type_delete_attr_f08_proxy
+
+    implicit none
+
+    procedure(MPI_Type_copy_attr_function) :: type_copy_attr_fn
+    procedure(MPI_Type_delete_attr_function) :: type_delete_attr_fn
+    integer, intent(out) :: type_keyval
+    integer(MPI_ADDRESS_KIND), intent(in) :: extra_state
+    integer, optional, intent(out) :: ierror
+
+    type(c_funptr) :: type_copy_attr_fn_c
+    type(c_funptr) :: type_delete_attr_fn_c
+    integer(c_int) :: type_keyval_c
+    integer(c_int) :: ierror_c
+
+    type_copy_attr_fn_c = c_funloc(type_copy_attr_fn)
+    type_delete_attr_fn_c = c_funloc(type_delete_attr_fn)
+
+    ierror_c = MPIR_Type_create_keyval_c(type_copy_attr_fn_c, type_delete_attr_fn_c, type_keyval_c, extra_state)
+
+    call MPIR_Keyval_set_proxy(type_keyval_c, c_funloc(MPIR_Type_copy_attr_f08_proxy), c_funloc(MPIR_Type_delete_attr_f08_proxy))
+    type_keyval = type_keyval_c
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Type_create_keyval_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/type_create_resized_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/type_create_resized_f08ts.F90
new file mode 100644
index 0000000..a6cd0fd
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/type_create_resized_f08ts.F90
@@ -0,0 +1,39 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Type_create_resized_f08(oldtype, lb, extent, newtype, ierror)
+    use :: mpi_f08, only : MPI_Datatype
+    use :: mpi_f08, only : MPI_ADDRESS_KIND
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Datatype
+    use :: mpi_c_interface, only : MPIR_Type_create_resized_c
+
+    implicit none
+
+    integer(MPI_ADDRESS_KIND), intent(in) :: lb
+    integer(MPI_ADDRESS_KIND), intent(in) :: extent
+    type(MPI_Datatype), intent(in) :: oldtype
+    type(MPI_Datatype), intent(out) :: newtype
+    integer, optional, intent(out) :: ierror
+
+    integer(MPI_ADDRESS_KIND) :: lb_c
+    integer(MPI_ADDRESS_KIND) :: extent_c
+    integer(c_Datatype) :: oldtype_c
+    integer(c_Datatype) :: newtype_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Type_create_resized_c(oldtype%MPI_VAL, lb, extent, newtype%MPI_VAL)
+    else
+        oldtype_c = oldtype%MPI_VAL
+        lb_c = lb
+        extent_c = extent
+        ierror_c = MPIR_Type_create_resized_c(oldtype_c, lb_c, extent_c, newtype_c)
+        newtype%MPI_VAL = newtype_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Type_create_resized_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/type_create_struct_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/type_create_struct_f08ts.F90
new file mode 100644
index 0000000..767234d
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/type_create_struct_f08ts.F90
@@ -0,0 +1,43 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Type_create_struct_f08(count, array_of_blocklengths, &
+    array_of_displacements, array_of_types, newtype, ierror)
+    use :: mpi_f08, only : MPI_Datatype
+    use :: mpi_f08, only : MPI_ADDRESS_KIND
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Datatype
+    use :: mpi_c_interface, only : MPIR_Type_create_struct_c
+
+    implicit none
+
+    integer, intent(in) :: count
+    integer, intent(in) :: array_of_blocklengths(count)
+    integer(MPI_ADDRESS_KIND), intent(in) :: array_of_displacements(count)
+    type(MPI_Datatype), intent(in) :: array_of_types(count)
+    type(MPI_Datatype), intent(out) :: newtype
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: count_c
+    integer(c_int) :: array_of_blocklengths_c(count)
+    integer(c_Datatype) :: array_of_types_c(count)
+    integer(c_Datatype) :: newtype_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Type_create_struct_c(count, array_of_blocklengths, array_of_displacements, &
+            array_of_types%MPI_VAL, newtype%MPI_VAL)
+    else
+        count_c = count
+        array_of_types_c = array_of_types%MPI_VAL
+        array_of_blocklengths_c = array_of_blocklengths
+        ierror_c = MPIR_Type_create_struct_c(count_c, array_of_blocklengths_c, array_of_displacements, array_of_types_c, &
+            newtype_c)
+        newtype%MPI_VAL = newtype_c
+    end if
+
+    if(present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Type_create_struct_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/type_create_subarray_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/type_create_subarray_f08ts.F90
new file mode 100644
index 0000000..2c10678
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/type_create_subarray_f08ts.F90
@@ -0,0 +1,50 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Type_create_subarray_f08(ndims, array_of_sizes, array_of_subsizes, &
+    array_of_starts, order, oldtype, newtype, ierror)
+    use :: mpi_f08, only : MPI_Datatype
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Datatype
+    use :: mpi_c_interface, only : MPIR_Type_create_subarray_c
+
+    implicit none
+
+    integer, intent(in) :: ndims
+    integer, intent(in) :: order
+    integer, intent(in) :: array_of_sizes(ndims)
+    integer, intent(in) :: array_of_subsizes(ndims)
+    integer, intent(in) :: array_of_starts(ndims)
+    type(MPI_Datatype), intent(in) :: oldtype
+    type(MPI_Datatype), intent(out) :: newtype
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: ndims_c
+    integer(c_int) :: order_c
+    integer(c_int) :: array_of_sizes_c(ndims)
+    integer(c_int) :: array_of_subsizes_c(ndims)
+    integer(c_int) :: array_of_starts_c(ndims)
+    integer(c_Datatype) :: oldtype_c
+    integer(c_Datatype) :: newtype_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Type_create_subarray_c(ndims, array_of_sizes, array_of_subsizes, array_of_starts, &
+            order, oldtype%MPI_VAL, newtype%MPI_VAL)
+    else
+        ndims_c = ndims
+        array_of_sizes_c = array_of_sizes
+        array_of_subsizes_c = array_of_subsizes
+        array_of_starts_c = array_of_starts
+        order_c = order
+        oldtype_c = oldtype%MPI_VAL
+        ierror_c = MPIR_Type_create_subarray_c(ndims_c, array_of_sizes_c, array_of_subsizes_c, array_of_starts_c, &
+            order_c, oldtype_c, newtype_c)
+        newtype%MPI_VAL = newtype_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Type_create_subarray_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/type_delete_attr_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/type_delete_attr_f08ts.F90
new file mode 100644
index 0000000..27988b4
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/type_delete_attr_f08ts.F90
@@ -0,0 +1,32 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Type_delete_attr_f08(datatype, type_keyval, ierror)
+    use :: mpi_f08, only : MPI_Datatype
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Datatype
+    use :: mpi_c_interface, only : MPIR_Type_delete_attr_c
+
+    implicit none
+
+    type(MPI_Datatype), intent(in) :: datatype
+    integer, intent(in) :: type_keyval
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Datatype) :: datatype_c
+    integer(c_int) :: type_keyval_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Type_delete_attr_c(datatype%MPI_VAL, type_keyval)
+    else
+        datatype_c = datatype%MPI_VAL
+        type_keyval_c = type_keyval
+        ierror_c = MPIR_Type_delete_attr_c(datatype_c, type_keyval_c)
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Type_delete_attr_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/type_dup_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/type_dup_f08ts.F90
new file mode 100644
index 0000000..1ed99f0
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/type_dup_f08ts.F90
@@ -0,0 +1,32 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Type_dup_f08(oldtype, newtype, ierror)
+    use :: mpi_f08, only : MPI_Datatype
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Datatype
+    use :: mpi_c_interface, only : MPIR_Type_dup_c
+
+    implicit none
+
+    type(MPI_Datatype), intent(in) :: oldtype
+    type(MPI_Datatype), intent(out) :: newtype
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Datatype) :: oldtype_c
+    integer(c_Datatype) :: newtype_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Type_dup_c(oldtype%MPI_VAL, newtype%MPI_VAL)
+    else
+        oldtype_c = oldtype%MPI_VAL
+        ierror_c = MPIR_Type_dup_c(oldtype_c, newtype_c)
+        newtype%MPI_VAL = newtype_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Type_dup_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/type_free_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/type_free_f08ts.F90
new file mode 100644
index 0000000..c4d06a0
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/type_free_f08ts.F90
@@ -0,0 +1,30 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Type_free_f08(datatype, ierror)
+    use :: mpi_f08, only : MPI_Datatype
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Datatype
+    use :: mpi_c_interface, only : MPIR_Type_free_c
+
+    implicit none
+
+    type(MPI_Datatype), intent(inout) :: datatype
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Datatype) :: datatype_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Type_free_c(datatype%MPI_VAL)
+    else
+        datatype_c = datatype%MPI_VAL
+        ierror_c = MPIR_Type_free_c(datatype_c)
+        datatype%MPI_VAL = datatype_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Type_free_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/type_free_keyval_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/type_free_keyval_f08ts.F90
new file mode 100644
index 0000000..e0d5ea7
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/type_free_keyval_f08ts.F90
@@ -0,0 +1,28 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Type_free_keyval_f08(type_keyval, ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : MPIR_Type_free_keyval_c
+
+    implicit none
+
+    integer, intent(inout) :: type_keyval
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: type_keyval_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Type_free_keyval_c(type_keyval)
+    else
+        type_keyval_c = type_keyval
+        ierror_c = MPIR_Type_free_keyval_c(type_keyval_c)
+        type_keyval = type_keyval_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Type_free_keyval_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/type_get_attr_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/type_get_attr_f08ts.F90
new file mode 100644
index 0000000..17cbd92
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/type_get_attr_f08ts.F90
@@ -0,0 +1,38 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Type_get_attr_f08(datatype, type_keyval, attribute_val, flag, ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_f08, only : MPI_Datatype
+    use :: mpi_f08, only : MPI_ADDRESS_KIND
+    use :: mpi_c_interface, only : c_Datatype
+    use :: mpi_c_interface, only : MPIR_ATTR_AINT
+    use :: mpi_c_interface, only : MPIR_Type_get_attr_c
+
+    implicit none
+
+    type(MPI_Datatype), intent(in) :: datatype
+    integer, intent(in) :: type_keyval
+    integer(MPI_ADDRESS_KIND), intent(out) :: attribute_val
+    logical, intent(out) :: flag
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Datatype) :: datatype_c
+    integer(c_int) :: type_keyval_c
+    integer(c_int) :: flag_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Type_get_attr_c(datatype%MPI_VAL, type_keyval, attribute_val, flag_c, MPIR_ATTR_AINT)
+    else
+        datatype_c = datatype%MPI_VAL
+        type_keyval_c = type_keyval
+        ierror_c = MPIR_Type_get_attr_c(datatype_c, type_keyval_c, attribute_val, flag_c, MPIR_ATTR_AINT)
+    end if
+
+    flag = (flag_c /= 0)
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Type_get_attr_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/type_get_contents_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/type_get_contents_f08ts.F90
new file mode 100644
index 0000000..6d42a8f
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/type_get_contents_f08ts.F90
@@ -0,0 +1,50 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Type_get_contents_f08(datatype, max_integers, max_addresses, max_datatypes, &
+    array_of_integers, array_of_addresses, array_of_datatypes, ierror)
+    use :: mpi_f08, only : MPI_Datatype
+    use :: mpi_f08, only : MPI_ADDRESS_KIND
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Datatype
+    use :: mpi_c_interface, only : MPIR_Type_get_contents_c
+
+    implicit none
+
+    type(MPI_Datatype), intent(in) :: datatype
+    integer, intent(in) :: max_integers
+    integer, intent(in) :: max_addresses
+    integer, intent(in) :: max_datatypes
+    integer, intent(out) :: array_of_integers(max_integers)
+    integer(MPI_ADDRESS_KIND), intent(out) :: array_of_addresses(max_addresses)
+    type(MPI_Datatype), intent(out) :: array_of_datatypes(max_datatypes)
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Datatype) :: datatype_c
+    integer(c_int) :: max_integers_c
+    integer(c_int) :: max_addresses_c
+    integer(c_int) :: max_datatypes_c
+    integer(c_int) :: array_of_integers_c(max_integers)
+    integer(c_Datatype) :: array_of_datatypes_c(max_datatypes)
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Type_get_contents_c(datatype%MPI_VAL, max_integers, max_addresses, max_datatypes, array_of_integers, &
+            array_of_addresses, array_of_datatypes%MPI_VAL)
+    else
+        datatype_c = datatype%MPI_VAL
+        max_integers_c = max_integers
+        max_addresses_c = max_addresses
+        max_datatypes_c = max_datatypes
+        array_of_integers_c = array_of_integers
+        ierror_c = MPIR_Type_get_contents_c(datatype_c, max_integers_c, max_addresses_c, max_datatypes_c, array_of_integers_c, &
+            array_of_addresses, array_of_datatypes_c)
+        array_of_integers = array_of_integers_c
+        array_of_datatypes%MPI_VAL = array_of_datatypes_c
+    end if
+
+    if(present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Type_get_contents_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/type_get_envelope_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/type_get_envelope_f08ts.F90
new file mode 100644
index 0000000..5c33508
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/type_get_envelope_f08ts.F90
@@ -0,0 +1,44 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Type_get_envelope_f08(datatype, num_integers, num_addresses, num_datatypes, &
+    combiner, ierror)
+    use :: mpi_f08, only : MPI_Datatype
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Datatype
+    use :: mpi_c_interface, only : MPIR_Type_get_envelope_c
+
+    implicit none
+
+    type(MPI_Datatype), intent(in) :: datatype
+    integer, intent(out) :: num_integers
+    integer, intent(out) :: num_addresses
+    integer, intent(out) :: num_datatypes
+    integer, intent(out) :: combiner
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Datatype) :: datatype_c
+    integer(c_int) :: num_integers_c
+    integer(c_int) :: num_addresses_c
+    integer(c_int) :: num_datatypes_c
+    integer(c_int) :: combiner_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Type_get_envelope_c(datatype%MPI_VAL, num_integers, num_addresses, num_datatypes, &
+            combiner)
+    else
+        datatype_c = datatype%MPI_VAL
+        ierror_c = MPIR_Type_get_envelope_c(datatype_c, num_integers_c, num_addresses_c, num_datatypes_c, &
+            combiner_c)
+        num_integers = num_integers_c
+        num_addresses = num_addresses_c
+        num_datatypes = num_datatypes_c
+        combiner = combiner_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Type_get_envelope_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/type_get_extent_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/type_get_extent_f08ts.F90
new file mode 100644
index 0000000..1a6c83a
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/type_get_extent_f08ts.F90
@@ -0,0 +1,36 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Type_get_extent_f08(datatype, lb, extent, ierror)
+    use :: mpi_f08, only : MPI_Datatype
+    use :: mpi_f08, only : MPI_ADDRESS_KIND
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Datatype
+    use :: mpi_c_interface, only : MPIR_Type_get_extent_c
+
+    implicit none
+
+    type(MPI_Datatype), intent(in) :: datatype
+    integer(MPI_ADDRESS_KIND), intent(out) :: lb
+    integer(MPI_ADDRESS_KIND), intent(out) :: extent
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Datatype) :: datatype_c
+    integer(MPI_ADDRESS_KIND) :: lb_c
+    integer(MPI_ADDRESS_KIND) :: extent_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Type_get_extent_c(datatype%MPI_VAL, lb, extent)
+    else
+        datatype_c = datatype%MPI_VAL
+        ierror_c = MPIR_Type_get_extent_c(datatype_c, lb_c, extent_c)
+        lb = lb_c
+        extent = extent_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Type_get_extent_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/type_get_extent_x_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/type_get_extent_x_f08ts.F90
new file mode 100644
index 0000000..eb41d3e
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/type_get_extent_x_f08ts.F90
@@ -0,0 +1,36 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Type_get_extent_x_f08(datatype, lb, extent, ierror)
+    use :: mpi_f08, only : MPI_Datatype
+    use :: mpi_f08, only : MPI_COUNT_KIND
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Datatype
+    use :: mpi_c_interface, only : MPIR_Type_get_extent_x_c
+
+    implicit none
+
+    type(MPI_Datatype), intent(in) :: datatype
+    integer(MPI_COUNT_KIND), intent(out) :: lb
+    integer(MPI_COUNT_KIND), intent(out) :: extent
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Datatype) :: datatype_c
+    integer(MPI_COUNT_KIND) :: lb_c
+    integer(MPI_COUNT_KIND) :: extent_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Type_get_extent_x_c(datatype%MPI_VAL, lb, extent)
+    else
+        datatype_c = datatype%MPI_VAL
+        ierror_c = MPIR_Type_get_extent_x_c(datatype_c, lb_c, extent_c)
+        lb = lb_c
+        extent = extent_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Type_get_extent_x_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/type_get_name_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/type_get_name_f08ts.F90
new file mode 100644
index 0000000..6cf9947
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/type_get_name_f08ts.F90
@@ -0,0 +1,38 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Type_get_name_f08(datatype, type_name, resultlen, ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_char
+    use :: mpi_f08, only : MPI_Datatype
+    use :: mpi_f08, only : MPI_MAX_OBJECT_NAME
+    use :: mpi_c_interface, only : c_Datatype
+    use :: mpi_c_interface, only : MPIR_Type_get_name_c
+    use :: mpi_c_interface, only : MPIR_Fortran_string_c2f
+
+    implicit none
+
+    type(MPI_Datatype), intent(in) :: datatype
+    character(len=MPI_MAX_OBJECT_NAME), intent(out) :: type_name
+    integer, intent(out) :: resultlen
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Datatype) :: datatype_c
+    character(kind=c_char) :: type_name_c(MPI_MAX_OBJECT_NAME+1)
+    integer(c_int) :: resultlen_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Type_get_name_c(datatype%MPI_VAL, type_name_c, resultlen)
+    else
+        datatype_c = datatype%MPI_VAL
+        ierror_c = MPIR_Type_get_name_c(datatype_c, type_name_c, resultlen_c)
+        resultlen = resultlen_c
+    end if
+
+    call MPIR_Fortran_string_c2f(type_name_c, type_name)
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Type_get_name_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/type_get_true_extent_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/type_get_true_extent_f08ts.F90
new file mode 100644
index 0000000..01d80c4
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/type_get_true_extent_f08ts.F90
@@ -0,0 +1,36 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Type_get_true_extent_f08(datatype, true_lb, true_extent, ierror)
+    use :: mpi_f08, only : MPI_Datatype
+    use :: mpi_f08, only : MPI_ADDRESS_KIND
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Datatype
+    use :: mpi_c_interface, only : MPIR_Type_get_true_extent_c
+
+    implicit none
+
+    type(MPI_Datatype), intent(in) :: datatype
+    integer(MPI_ADDRESS_KIND), intent(out) :: true_lb
+    integer(MPI_ADDRESS_KIND), intent(out) :: true_extent
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Datatype) :: datatype_c
+    integer(MPI_ADDRESS_KIND) :: true_lb_c
+    integer(MPI_ADDRESS_KIND) :: true_extent_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Type_get_true_extent_c(datatype%MPI_VAL, true_lb, true_extent)
+    else
+        datatype_c = datatype%MPI_VAL
+        ierror_c = MPIR_Type_get_true_extent_c(datatype_c, true_lb_c, true_extent_c)
+        true_lb = true_lb_c
+        true_extent = true_extent_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Type_get_true_extent_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/type_get_true_extent_x_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/type_get_true_extent_x_f08ts.F90
new file mode 100644
index 0000000..89cba33
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/type_get_true_extent_x_f08ts.F90
@@ -0,0 +1,37 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Type_get_true_extent_x_f08(datatype, true_lb, true_extent, ierror)
+    use :: mpi_f08, only : MPI_Datatype
+    use :: mpi_f08, only : MPI_ADDRESS_KIND
+    use :: mpi_f08, only : MPI_COUNT_KIND
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Datatype
+    use :: mpi_c_interface, only : MPIR_Type_get_true_extent_x_c
+
+    implicit none
+
+    type(MPI_Datatype), intent(in) :: datatype
+    integer(MPI_COUNT_KIND), intent(out) :: true_lb
+    integer(MPI_COUNT_KIND), intent(out) :: true_extent
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Datatype) :: datatype_c
+    integer(MPI_COUNT_KIND) :: true_lb_c
+    integer(MPI_COUNT_KIND) :: true_extent_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Type_get_true_extent_x_c(datatype%MPI_VAL, true_lb, true_extent)
+    else
+        datatype_c = datatype%MPI_VAL
+        ierror_c = MPIR_Type_get_true_extent_x_c(datatype_c, true_lb_c, true_extent_c)
+        true_lb = true_lb_c
+        true_extent = true_extent_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Type_get_true_extent_x_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/type_indexed_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/type_indexed_f08ts.F90
new file mode 100644
index 0000000..816b813
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/type_indexed_f08ts.F90
@@ -0,0 +1,44 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Type_indexed_f08(count, array_of_blocklengths, &
+    array_of_displacements, oldtype, newtype, ierror)
+    use :: mpi_f08, only : MPI_Datatype
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Datatype
+    use :: mpi_c_interface, only : MPIR_Type_indexed_c
+
+    implicit none
+
+    integer, intent(in) :: count
+    integer, intent(in) :: array_of_blocklengths(count)
+    integer, intent(in) :: array_of_displacements(count)
+    type(MPI_Datatype), intent(in) :: oldtype
+    type(MPI_Datatype), intent(out) :: newtype
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: count_c
+    integer(c_int) :: array_of_blocklengths_c(count)
+    integer(c_int) :: array_of_displacements_c(count)
+    integer(c_Datatype) :: oldtype_c
+    integer(c_Datatype) :: newtype_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Type_indexed_c(count, array_of_blocklengths, array_of_displacements, oldtype%MPI_VAL, &
+            newtype%MPI_VAL)
+    else
+        count_c = count
+        array_of_blocklengths_c = array_of_blocklengths
+        array_of_displacements_c = array_of_displacements
+        oldtype_c = oldtype%MPI_VAL
+        ierror_c = MPIR_Type_indexed_c(count_c, array_of_blocklengths_c, array_of_displacements_c, &
+            oldtype_c, newtype_c)
+        newtype%MPI_VAL = newtype_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Type_indexed_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/type_match_size_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/type_match_size_f08ts.F90
new file mode 100644
index 0000000..4c492f9
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/type_match_size_f08ts.F90
@@ -0,0 +1,35 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Type_match_size_f08(typeclass, size, datatype, ierror)
+    use :: mpi_f08, only : MPI_Datatype
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Datatype
+    use :: mpi_c_interface, only : MPIR_Type_match_size_c
+
+    implicit none
+
+    integer, intent(in) :: typeclass
+    integer, intent(in) :: size
+    type(MPI_Datatype), intent(out) :: datatype
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: typeclass_c
+    integer(c_int) :: size_c
+    integer(c_Datatype) :: datatype_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Type_match_size_c(typeclass, size, datatype%MPI_VAL)
+    else
+        typeclass_c = typeclass
+        size_c = size
+        ierror_c = MPIR_Type_match_size_c(typeclass_c, size_c, datatype_c)
+        datatype%MPI_VAL = datatype_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Type_match_size_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/type_set_attr_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/type_set_attr_f08ts.F90
new file mode 100644
index 0000000..1db73ac
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/type_set_attr_f08ts.F90
@@ -0,0 +1,35 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Type_set_attr_f08(datatype, type_keyval, attribute_val, ierror)
+    use :: mpi_f08, only : MPI_Datatype
+    use :: mpi_f08, only : MPI_ADDRESS_KIND
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Datatype
+    use :: mpi_c_interface, only : MPIR_ATTR_AINT
+    use :: mpi_c_interface, only : MPIR_Type_set_attr_c
+
+    implicit none
+
+    type(MPI_Datatype), intent(in) :: datatype
+    integer, intent(in) :: type_keyval
+    integer(MPI_ADDRESS_KIND), intent(in) :: attribute_val
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Datatype) :: datatype_c
+    integer(c_int) :: type_keyval_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Type_set_attr_c(datatype%MPI_VAL, type_keyval, attribute_val, MPIR_ATTR_AINT)
+    else
+        datatype_c = datatype%MPI_VAL
+        type_keyval_c = type_keyval
+        ierror_c = MPIR_Type_set_attr_c(datatype_c, type_keyval_c, attribute_val, MPIR_ATTR_AINT)
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Type_set_attr_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/type_set_name_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/type_set_name_f08ts.F90
new file mode 100644
index 0000000..48ecf81
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/type_set_name_f08ts.F90
@@ -0,0 +1,34 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Type_set_name_f08(datatype, type_name, ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_char
+    use :: mpi_f08, only : MPI_Datatype
+    use :: mpi_c_interface, only : c_Datatype
+    use :: mpi_c_interface, only : MPIR_Type_set_name_c
+    use :: mpi_c_interface, only : MPIR_Fortran_string_f2c
+
+    implicit none
+
+    type(MPI_Datatype), intent(in) :: datatype
+    character(len=*), intent(in) :: type_name
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Datatype) :: datatype_c
+    character(kind=c_char) :: type_name_c(len_trim(type_name)+1)
+    integer(c_int) :: ierror_c
+
+    call MPIR_Fortran_string_f2c(type_name, type_name_c)
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Type_set_name_c(datatype%MPI_VAL, type_name_c)
+    else
+        datatype_c = datatype%MPI_VAL
+        ierror_c = MPIR_Type_set_name_c(datatype_c, type_name_c)
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Type_set_name_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/type_size_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/type_size_f08ts.F90
new file mode 100644
index 0000000..47713e6
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/type_size_f08ts.F90
@@ -0,0 +1,32 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Type_size_f08(datatype, size, ierror)
+    use :: mpi_f08, only : MPI_Datatype
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Datatype
+    use :: mpi_c_interface, only : MPIR_Type_size_c
+
+    implicit none
+
+    type(MPI_Datatype), intent(in) :: datatype
+    integer, intent(out) :: size
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Datatype) :: datatype_c
+    integer(c_int) :: size_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Type_size_c(datatype%MPI_VAL, size)
+    else
+        datatype_c = datatype%MPI_VAL
+        ierror_c = MPIR_Type_size_c(datatype_c, size_c)
+        size = size_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Type_size_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/type_size_x_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/type_size_x_f08ts.F90
new file mode 100644
index 0000000..764af2d
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/type_size_x_f08ts.F90
@@ -0,0 +1,33 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Type_size_x_f08(datatype, size, ierror)
+    use :: mpi_f08, only : MPI_Datatype
+    use :: mpi_f08, only : MPI_COUNT_KIND
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Datatype
+    use :: mpi_c_interface, only : MPIR_Type_size_x_c
+
+    implicit none
+
+    type(MPI_Datatype), intent(in) :: datatype
+    integer(MPI_COUNT_KIND), intent(out) :: size
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Datatype) :: datatype_c
+    integer(MPI_COUNT_KIND) :: size_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Type_size_x_c(datatype%MPI_VAL, size)
+    else
+        datatype_c = datatype%MPI_VAL
+        ierror_c = MPIR_Type_size_x_c(datatype_c, size_c)
+        size = size_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Type_size_x_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/type_vector_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/type_vector_f08ts.F90
new file mode 100644
index 0000000..55677ff
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/type_vector_f08ts.F90
@@ -0,0 +1,41 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Type_vector_f08(count, blocklength, stride, oldtype, newtype, ierror)
+    use :: mpi_f08, only : MPI_Datatype
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Datatype
+    use :: mpi_c_interface, only : MPIR_Type_vector_c
+
+    implicit none
+
+    integer, intent(in) :: count
+    integer, intent(in) :: blocklength
+    integer, intent(in) :: stride
+    type(MPI_Datatype), intent(in) :: oldtype
+    type(MPI_Datatype), intent(out) :: newtype
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: count_c
+    integer(c_int) :: blocklength_c
+    integer(c_int) :: stride_c
+    integer(c_Datatype) :: oldtype_c
+    integer(c_Datatype) :: newtype_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Type_vector_c(count, blocklength, stride, oldtype%MPI_VAL, newtype%MPI_VAL)
+    else
+        count_c = count
+        blocklength_c = blocklength
+        stride_c = stride
+        oldtype_c = oldtype%MPI_VAL
+        ierror_c = MPIR_Type_vector_c(count_c, blocklength_c, stride_c, oldtype_c, newtype_c)
+        newtype%MPI_VAL = newtype_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Type_vector_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/unpack_external_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/unpack_external_f08ts.F90
new file mode 100644
index 0000000..467e4cd
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/unpack_external_f08ts.F90
@@ -0,0 +1,49 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Unpack_external_f08ts(datarep, inbuf, insize, position, outbuf, outcount, &
+    datatype, ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_char
+    use :: mpi_f08, only : MPI_Datatype
+    use :: mpi_f08, only : MPI_ADDRESS_KIND
+    use :: mpi_c_interface, only : c_Datatype
+    use :: mpi_c_interface, only : MPIR_Unpack_external_cdesc
+    use :: mpi_c_interface, only : MPIR_Fortran_string_f2c
+
+    implicit none
+
+    character(len=*), intent(in) :: datarep
+    type(*), dimension(..), intent(in) :: inbuf
+    type(*), dimension(..) :: outbuf
+    integer(MPI_ADDRESS_KIND), intent(in) :: insize
+    integer(MPI_ADDRESS_KIND), intent(inout) :: position
+    integer, intent(in) :: outcount
+    type(MPI_Datatype), intent(in) :: datatype
+    integer, optional, intent(out) :: ierror
+
+    character(kind=c_char) :: datarep_c(len_trim(datarep)+1)
+    integer(MPI_ADDRESS_KIND) :: insize_c
+    integer(MPI_ADDRESS_KIND) :: position_c
+    integer(c_int) :: outcount_c
+    integer(c_Datatype) :: datatype_c
+    integer(c_int) :: ierror_c
+
+    call MPIR_Fortran_string_f2c(datarep, datarep_c)
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Unpack_external_cdesc(datarep_c, inbuf, insize, position, outbuf, outcount, datatype%MPI_VAL)
+    else
+        insize_c = insize
+        position_c = position
+        outcount_c = outcount
+        datatype_c = datatype%MPI_VAL
+        ierror_c = MPIR_Unpack_external_cdesc(datarep_c, inbuf, insize_c, position_c, outbuf, outcount_c, &
+            datatype_c)
+        position = position_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Unpack_external_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/unpack_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/unpack_f08ts.F90
new file mode 100644
index 0000000..f44e968
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/unpack_f08ts.F90
@@ -0,0 +1,45 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Unpack_f08ts(inbuf, insize, position, outbuf, outcount, datatype, comm, &
+    ierror)
+    use :: mpi_f08, only : MPI_Datatype, MPI_Comm
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Datatype, c_Comm
+    use :: mpi_c_interface, only : MPIR_Unpack_cdesc
+
+    implicit none
+
+    type(*), dimension(..), intent(in) :: inbuf
+    type(*), dimension(..) :: outbuf
+    integer, intent(in) :: insize
+    integer, intent(in) :: outcount
+    integer, intent(inout) :: position
+    type(MPI_Datatype), intent(in) :: datatype
+    type(MPI_Comm), intent(in) :: comm
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: insize_c
+    integer(c_int) :: outcount_c
+    integer(c_int) :: position_c
+    integer(c_Datatype) :: datatype_c
+    integer(c_Comm) :: comm_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Unpack_cdesc(inbuf, insize, position, outbuf, outcount, datatype%MPI_VAL, comm%MPI_VAL)
+    else
+        insize_c = insize
+        position_c = position
+        outcount_c = outcount
+        datatype_c = datatype%MPI_VAL
+        comm_c = comm%MPI_VAL
+        ierror_c = MPIR_Unpack_cdesc(inbuf, insize_c, position_c, outbuf, outcount_c, datatype_c, comm_c)
+        position = position_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Unpack_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/unpublish_name_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/unpublish_name_f08ts.F90
new file mode 100644
index 0000000..9fce275
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/unpublish_name_f08ts.F90
@@ -0,0 +1,38 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Unpublish_name_f08(service_name, info, port_name, ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_char
+    use :: mpi_f08, only : MPI_Info
+    use :: mpi_c_interface, only : c_Info
+    use :: mpi_c_interface, only : MPIR_Unpublish_name_c
+    use :: mpi_c_interface, only : MPIR_Fortran_string_f2c
+
+    implicit none
+
+    character(len=*), intent(in) :: service_name
+    character(len=*), intent(in) :: port_name
+    type(MPI_Info), intent(in) :: info
+    integer, optional, intent(out) :: ierror
+
+    character(kind=c_char) :: service_name_c(len_trim(service_name)+1)
+    character(kind=c_char) :: port_name_c(len_trim(port_name)+1)
+    integer(c_Info) :: info_c
+    integer(c_int) :: ierror_c
+
+    call MPIR_Fortran_string_f2c(service_name, service_name_c)
+
+    call MPIR_Fortran_string_f2c(port_name, port_name_c)
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Unpublish_name_c(service_name_c, info%MPI_VAL, port_name_c)
+    else
+        info_c = info%MPI_VAL
+        ierror_c = MPIR_Unpublish_name_c(service_name_c, info_c, port_name_c)
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Unpublish_name_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/wait_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/wait_f08ts.F90
new file mode 100644
index 0000000..e243c12
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/wait_f08ts.F90
@@ -0,0 +1,44 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Wait_f08(request, status, ierror)
+    use :: mpi_f08, only : MPI_Request, MPI_Status
+    use, intrinsic :: iso_c_binding, only : c_loc, c_associated
+    use :: mpi_f08, only : MPI_STATUS_IGNORE, MPIR_C_MPI_STATUS_IGNORE, assignment(=)
+    use, intrinsic :: iso_c_binding, only : c_int, c_ptr
+    use :: mpi_c_interface, only : c_Request
+    use :: mpi_c_interface, only : c_Status
+    use :: mpi_c_interface, only : MPIR_Wait_c
+
+    implicit none
+
+    type(MPI_Request), intent(inout) :: request
+    type(MPI_Status), target :: status
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Request) :: request_c
+    type(c_Status), target :: status_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        if (c_associated(c_loc(status), c_loc(MPI_STATUS_IGNORE))) then
+            ierror_c = MPIR_Wait_c(request%MPI_VAL, MPIR_C_MPI_STATUS_IGNORE)
+        else
+            ierror_c = MPIR_Wait_c(request%MPI_VAL, c_loc(status))
+        end if
+    else
+        request_c = request%MPI_VAL
+        if (c_associated(c_loc(status), c_loc(MPI_STATUS_IGNORE))) then
+            ierror_c = MPIR_Wait_c(request_c, MPIR_C_MPI_STATUS_IGNORE)
+        else
+            ierror_c = MPIR_Wait_c(request_c, c_loc(status_c))
+            status = status_c
+        end if
+        request%MPI_VAL = request_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Wait_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/waitall_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/waitall_f08ts.F90
new file mode 100644
index 0000000..de15435
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/waitall_f08ts.F90
@@ -0,0 +1,47 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Waitall_f08(count, array_of_requests, array_of_statuses, ierror)
+    use :: mpi_f08, only : MPI_Request, MPI_Status
+    use, intrinsic :: iso_c_binding, only : c_loc, c_associated
+    use :: mpi_f08, only : MPI_STATUSES_IGNORE, MPIR_C_MPI_STATUSES_IGNORE, assignment(=)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Request
+    use :: mpi_c_interface, only : c_Status
+    use :: mpi_c_interface, only : MPIR_Waitall_c
+
+    implicit none
+
+    integer, intent(in) :: count
+    type(MPI_Request), intent(inout) :: array_of_requests(count)
+    type(MPI_Status), target :: array_of_statuses(*)
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: count_c
+    integer(c_Request) :: array_of_requests_c(count)
+    type(c_Status), target :: array_of_statuses_c(count)
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        if (c_associated(c_loc(array_of_statuses), c_loc(MPI_STATUSES_IGNORE))) then
+            ierror_c = MPIR_Waitall_c(count, array_of_requests%MPI_VAL, MPIR_C_MPI_STATUSES_IGNORE)
+        else
+            ierror_c = MPIR_Waitall_c(count, array_of_requests%MPI_VAL, c_loc(array_of_statuses))
+        end if
+    else
+        count_c = count
+        array_of_requests_c = array_of_requests%MPI_VAL
+        if (c_associated(c_loc(array_of_statuses), c_loc(MPI_STATUSES_IGNORE))) then
+            ierror_c = MPIR_Waitall_c(count_c, array_of_requests_c, MPIR_C_MPI_STATUSES_IGNORE)
+        else
+            ierror_c = MPIR_Waitall_c(count_c, array_of_requests_c, c_loc(array_of_statuses_c))
+            array_of_statuses(1:count_c) = array_of_statuses_c(1:count_c)
+        end if
+        array_of_requests%MPI_VAL = array_of_requests_c
+    end if
+
+    if(present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Waitall_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/waitany_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/waitany_f08ts.F90
new file mode 100644
index 0000000..648aee6
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/waitany_f08ts.F90
@@ -0,0 +1,51 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Waitany_f08(count, array_of_requests, index, status, ierror)
+    use :: mpi_f08, only : MPI_Request, MPI_Status
+    use, intrinsic :: iso_c_binding, only : c_loc, c_associated
+    use :: mpi_f08, only : MPI_STATUS_IGNORE, MPIR_C_MPI_STATUS_IGNORE, assignment(=)
+    use, intrinsic :: iso_c_binding, only : c_int, c_ptr
+    use :: mpi_c_interface, only : c_Request
+    use :: mpi_c_interface, only : c_Status
+    use :: mpi_c_interface, only : MPIR_Waitany_c
+
+    implicit none
+
+    integer, intent(in) :: count
+    type(MPI_Request), intent(inout) :: array_of_requests(count)
+    integer, intent(out) :: index
+    type(MPI_Status), target :: status
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: count_c
+    integer(c_Request) :: array_of_requests_c(count)
+    integer(c_int) :: index_c
+    type(c_Status), target :: status_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        if (c_associated(c_loc(status), c_loc(MPI_STATUS_IGNORE))) then
+            ierror_c = MPIR_Waitany_c(count, array_of_requests%MPI_VAL, index, MPIR_C_MPI_STATUS_IGNORE)
+        else
+            ierror_c = MPIR_Waitany_c(count, array_of_requests%MPI_VAL, index, c_loc(status))
+        end if
+    else
+        count_c = count
+        array_of_requests_c = array_of_requests%MPI_VAL
+        if (c_associated(c_loc(status), c_loc(MPI_STATUS_IGNORE))) then
+            ierror_c = MPIR_Waitany_c(count_c, array_of_requests_c, index_c, MPIR_C_MPI_STATUS_IGNORE)
+        else
+            ierror_c = MPIR_Waitany_c(count_c, array_of_requests_c, index_c, c_loc(status_c))
+            status = status_c
+        end if
+        array_of_requests%MPI_VAL = array_of_requests_c
+        index = index_c
+    end if
+
+    if (index >= 0) index = index + 1
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Waitany_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/waitsome_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/waitsome_f08ts.F90
new file mode 100644
index 0000000..b4c021c
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/waitsome_f08ts.F90
@@ -0,0 +1,61 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Waitsome_f08(incount, array_of_requests, outcount, &
+    array_of_indices, array_of_statuses, ierror)
+    use :: mpi_f08, only : MPI_Request, MPI_Status
+    use, intrinsic :: iso_c_binding, only : c_loc, c_associated
+    use :: mpi_f08, only : MPI_STATUSES_IGNORE, MPIR_C_MPI_STATUSES_IGNORE, assignment(=)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Request
+    use :: mpi_c_interface, only : c_Status
+    use :: mpi_c_interface, only : MPIR_Waitsome_c
+
+    implicit none
+
+    integer, intent(in) :: incount
+    type(MPI_Request), intent(inout) :: array_of_requests(incount)
+    integer, intent(out) :: outcount
+    integer, intent(out) :: array_of_indices(*)
+    type(MPI_Status), target :: array_of_statuses(*)
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: incount_c
+    integer(c_Request) :: array_of_requests_c(incount)
+    integer(c_int) :: outcount_c
+    integer(c_int) :: array_of_indices_c(incount)
+    type(c_Status), target :: array_of_statuses_c(incount)
+    integer(c_int) :: ierror_c
+    integer :: i
+
+    if (c_int == kind(0)) then
+        if (c_associated(c_loc(array_of_statuses), c_loc(MPI_STATUSES_IGNORE))) then
+            ierror_c = MPIR_Waitsome_c(incount, array_of_requests%MPI_VAL, outcount, array_of_indices, MPIR_C_MPI_STATUSES_IGNORE)
+        else
+            ierror_c = MPIR_Waitsome_c(incount, array_of_requests%MPI_VAL, outcount, array_of_indices, c_loc(array_of_statuses))
+        end if
+    else
+        incount_c = incount
+        array_of_requests_c = array_of_requests%MPI_VAL
+        if (c_associated(c_loc(array_of_statuses), c_loc(MPI_STATUSES_IGNORE))) then
+            ierror_c = MPIR_Waitsome_c(incount_c, array_of_requests_c, outcount_c, array_of_indices_c, MPIR_C_MPI_STATUSES_IGNORE)
+        else
+            ierror_c = MPIR_Waitsome_c(incount_c, array_of_requests_c, outcount_c, array_of_indices_c, c_loc(array_of_statuses_c))
+            array_of_statuses(1:outcount_c) = array_of_statuses_c(1:outcount_c)
+        end if
+        array_of_indices(1:outcount_c) = array_of_indices_c(1:outcount_c)
+        array_of_requests%MPI_VAL = array_of_requests_c
+        outcount = outcount_c
+    end if
+
+    do i = 1, outcount
+        if (array_of_indices(i) >= 0) then
+            array_of_indices(i) = array_of_indices(i) + 1
+        end if
+    end do
+
+    if(present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Waitsome_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/win_call_errhandler_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/win_call_errhandler_f08ts.F90
new file mode 100644
index 0000000..5d21764
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/win_call_errhandler_f08ts.F90
@@ -0,0 +1,32 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Win_call_errhandler_f08(win, errorcode, ierror)
+    use :: mpi_f08, only : MPI_Win
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Win
+    use :: mpi_c_interface, only : MPIR_Win_call_errhandler_c
+
+    implicit none
+
+    type(MPI_Win), intent(in) :: win
+    integer, intent(in) :: errorcode
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Win) :: win_c
+    integer(c_int) :: errorcode_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Win_call_errhandler_c(win%MPI_VAL, errorcode)
+    else
+        win_c = win%MPI_VAL
+        errorcode_c = errorcode
+        ierror_c = MPIR_Win_call_errhandler_c(win_c, errorcode_c)
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Win_call_errhandler_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/win_complete_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/win_complete_f08ts.F90
new file mode 100644
index 0000000..6cd7a5d
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/win_complete_f08ts.F90
@@ -0,0 +1,29 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Win_complete_f08(win, ierror)
+    use :: mpi_f08, only : MPI_Win
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Win
+    use :: mpi_c_interface, only : MPIR_Win_complete_c
+
+    implicit none
+
+    type(MPI_Win), intent(in) :: win
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Win) :: win_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Win_complete_c(win%MPI_VAL)
+    else
+        win_c = win%MPI_VAL
+        ierror_c = MPIR_Win_complete_c(win_c)
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Win_complete_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/win_create_errhandler_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/win_create_errhandler_f08ts.F90
new file mode 100644
index 0000000..2efbcc3
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/win_create_errhandler_f08ts.F90
@@ -0,0 +1,34 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Win_create_errhandler_f08(win_errhandler_fn, errhandler, ierror)
+    use :: mpi_f08, only : MPI_Errhandler
+    use :: mpi_f08, only : MPI_Win_errhandler_function
+    use, intrinsic :: iso_c_binding, only : c_funloc
+    use, intrinsic :: iso_c_binding, only : c_int, c_funptr
+    use :: mpi_c_interface, only : c_Errhandler
+    use :: mpi_c_interface, only : MPIR_Win_create_errhandler_c
+
+    implicit none
+
+    procedure(MPI_Win_errhandler_function) :: win_errhandler_fn
+    type(MPI_Errhandler), intent(out) :: errhandler
+    integer, optional, intent(out) :: ierror
+
+    type(c_funptr) :: win_errhandler_fn_c
+    integer(c_Errhandler) :: errhandler_c
+    integer(c_int) :: ierror_c
+
+    win_errhandler_fn_c = c_funloc(win_errhandler_fn)
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Win_create_errhandler_c(win_errhandler_fn_c, errhandler%MPI_VAL)
+    else
+        ierror_c = MPIR_Win_create_errhandler_c(win_errhandler_fn_c, errhandler_c)
+        errhandler%MPI_VAL = errhandler_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Win_create_errhandler_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/win_create_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/win_create_f08ts.F90
new file mode 100644
index 0000000..a9dc3ef
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/win_create_f08ts.F90
@@ -0,0 +1,41 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Win_create_f08ts(base, size, disp_unit, info, comm, win, ierror)
+    use :: mpi_f08, only : MPI_Info, MPI_Comm, MPI_Win
+    use :: mpi_f08, only : MPI_ADDRESS_KIND
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Info, c_Comm, c_Win
+    use :: mpi_c_interface, only : MPIR_Win_create_cdesc
+
+    implicit none
+
+    type(*), dimension(..), asynchronous :: base
+    integer(MPI_ADDRESS_KIND), intent(in) :: size
+    integer, intent(in) :: disp_unit
+    type(MPI_Info), intent(in) :: info
+    type(MPI_Comm), intent(in) :: comm
+    type(MPI_Win), intent(out) :: win
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: disp_unit_c
+    integer(c_Info) :: info_c
+    integer(c_Comm) :: comm_c
+    integer(c_Win) :: win_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Win_create_cdesc(base, size, disp_unit, info%MPI_VAL, comm%MPI_VAL, win%MPI_VAL)
+    else
+        disp_unit_c = disp_unit
+        info_c = info%MPI_VAL
+        comm_c = comm%MPI_VAL
+        ierror_c = MPIR_Win_create_cdesc(base, size, disp_unit_c, info_c, comm_c, win_c)
+        win%MPI_VAL = win_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Win_create_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/win_create_keyval_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/win_create_keyval_f08ts.F90
new file mode 100644
index 0000000..78f5bbc
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/win_create_keyval_f08ts.F90
@@ -0,0 +1,38 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Win_create_keyval_f08(win_copy_attr_fn, win_delete_attr_fn, win_keyval, &
+    extra_state, ierror)
+    use, intrinsic :: iso_c_binding, only : c_funloc
+    use, intrinsic :: iso_c_binding, only : c_int, c_funptr
+    use :: mpi_f08, only : MPI_ADDRESS_KIND
+    use :: mpi_f08, only : MPI_Win_copy_attr_function
+    use :: mpi_f08, only : MPI_Win_delete_attr_function
+    use :: mpi_c_interface, only : MPIR_Win_create_keyval_c
+    use :: mpi_c_interface, only : MPIR_Keyval_set_proxy, MPIR_Win_copy_attr_f08_proxy, MPIR_Win_delete_attr_f08_proxy
+
+    implicit none
+
+    procedure(MPI_Win_copy_attr_function) :: win_copy_attr_fn
+    procedure(MPI_Win_delete_attr_function) :: win_delete_attr_fn
+    integer, intent(out) :: win_keyval
+    integer(MPI_ADDRESS_KIND), intent(in) :: extra_state
+    integer, optional, intent(out) :: ierror
+
+    type(c_funptr) :: win_copy_attr_fn_c
+    type(c_funptr) :: win_delete_attr_fn_c
+    integer(c_int) :: win_keyval_c
+    integer(c_int) :: ierror_c
+
+    win_copy_attr_fn_c = c_funloc(win_copy_attr_fn)
+    win_delete_attr_fn_c = c_funloc(win_delete_attr_fn)
+
+    ierror_c = MPIR_Win_create_keyval_c(win_copy_attr_fn_c, win_delete_attr_fn_c, win_keyval_c, extra_state)
+
+    call MPIR_Keyval_set_proxy(win_keyval_c, c_funloc(MPIR_Win_copy_attr_f08_proxy), c_funloc(MPIR_Win_delete_attr_f08_proxy))
+    win_keyval = win_keyval_c
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Win_create_keyval_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/win_delete_attr_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/win_delete_attr_f08ts.F90
new file mode 100644
index 0000000..4ea4937
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/win_delete_attr_f08ts.F90
@@ -0,0 +1,32 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Win_delete_attr_f08(win, win_keyval, ierror)
+    use :: mpi_f08, only : MPI_Win
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Win
+    use :: mpi_c_interface, only : MPIR_Win_delete_attr_c
+
+    implicit none
+
+    type(MPI_Win), intent(in) :: win
+    integer, intent(in) :: win_keyval
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Win) :: win_c
+    integer(c_int) :: win_keyval_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Win_delete_attr_c(win%MPI_VAL, win_keyval)
+    else
+        win_c = win%MPI_VAL
+        win_keyval_c = win_keyval
+        ierror_c = MPIR_Win_delete_attr_c(win_c, win_keyval_c)
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Win_delete_attr_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/win_fence_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/win_fence_f08ts.F90
new file mode 100644
index 0000000..e93e134
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/win_fence_f08ts.F90
@@ -0,0 +1,32 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Win_fence_f08(assert, win, ierror)
+    use :: mpi_f08, only : MPI_Win
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Win
+    use :: mpi_c_interface, only : MPIR_Win_fence_c
+
+    implicit none
+
+    integer, intent(in) :: assert
+    type(MPI_Win), intent(in) :: win
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: assert_c
+    integer(c_Win) :: win_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Win_fence_c(assert, win%MPI_VAL)
+    else
+        assert_c = assert
+        win_c = win%MPI_VAL
+        ierror_c = MPIR_Win_fence_c(assert_c, win_c)
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Win_fence_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/win_free_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/win_free_f08ts.F90
new file mode 100644
index 0000000..50b9db1
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/win_free_f08ts.F90
@@ -0,0 +1,30 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Win_free_f08(win, ierror)
+    use :: mpi_f08, only : MPI_Win
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Win
+    use :: mpi_c_interface, only : MPIR_Win_free_c
+
+    implicit none
+
+    type(MPI_Win), intent(inout) :: win
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Win) :: win_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Win_free_c(win%MPI_VAL)
+    else
+        win_c = win%MPI_VAL
+        ierror_c = MPIR_Win_free_c(win_c)
+        win%MPI_VAL = win_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Win_free_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/win_free_keyval_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/win_free_keyval_f08ts.F90
new file mode 100644
index 0000000..7c07d8d
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/win_free_keyval_f08ts.F90
@@ -0,0 +1,28 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Win_free_keyval_f08(win_keyval, ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : MPIR_Win_free_keyval_c
+
+    implicit none
+
+    integer, intent(inout) :: win_keyval
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: win_keyval_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Win_free_keyval_c(win_keyval)
+    else
+        win_keyval_c = win_keyval
+        ierror_c = MPIR_Win_free_keyval_c(win_keyval_c)
+        win_keyval = win_keyval_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Win_free_keyval_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/win_get_attr_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/win_get_attr_f08ts.F90
new file mode 100644
index 0000000..28b3cff
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/win_get_attr_f08ts.F90
@@ -0,0 +1,38 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Win_get_attr_f08(win, win_keyval, attribute_val, flag, ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_f08, only : MPI_Win
+    use :: mpi_f08, only : MPI_ADDRESS_KIND
+    use :: mpi_c_interface, only : c_Win
+    use :: mpi_c_interface, only : MPIR_ATTR_AINT
+    use :: mpi_c_interface, only : MPIR_Win_get_attr_c
+
+    implicit none
+
+    type(MPI_Win), intent(in) :: win
+    integer, intent(in) :: win_keyval
+    integer(MPI_ADDRESS_KIND), intent(out) :: attribute_val
+    logical, intent(out) :: flag
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Win) :: win_c
+    integer(c_int) :: win_keyval_c
+    integer(c_int) :: flag_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Win_get_attr_c(win%MPI_VAL, win_keyval, attribute_val, flag_c, MPIR_ATTR_AINT)
+    else
+        win_c = win%MPI_VAL
+        win_keyval_c = win_keyval
+        ierror_c = MPIR_Win_get_attr_c(win_c, win_keyval_c, attribute_val, flag_c, MPIR_ATTR_AINT)
+    end if
+
+    flag = (flag_c /= 0)
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Win_get_attr_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/win_get_errhandler_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/win_get_errhandler_f08ts.F90
new file mode 100644
index 0000000..e9f76b5
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/win_get_errhandler_f08ts.F90
@@ -0,0 +1,32 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Win_get_errhandler_f08(win, errhandler, ierror)
+    use :: mpi_f08, only : MPI_Win, MPI_Errhandler
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Win, c_Errhandler
+    use :: mpi_c_interface, only : MPIR_Win_get_errhandler_c
+
+    implicit none
+
+    type(MPI_Win), intent(in) :: win
+    type(MPI_Errhandler), intent(out) :: errhandler
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Win) :: win_c
+    integer(c_Errhandler) :: errhandler_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Win_get_errhandler_c(win%MPI_VAL, errhandler%MPI_VAL)
+    else
+        win_c = win%MPI_VAL
+        ierror_c = MPIR_Win_get_errhandler_c(win_c, errhandler_c)
+        errhandler%MPI_VAL = errhandler_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Win_get_errhandler_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/win_get_group_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/win_get_group_f08ts.F90
new file mode 100644
index 0000000..f158433
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/win_get_group_f08ts.F90
@@ -0,0 +1,32 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Win_get_group_f08(win, group, ierror)
+    use :: mpi_f08, only : MPI_Win, MPI_Group
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Win, c_Group
+    use :: mpi_c_interface, only : MPIR_Win_get_group_c
+
+    implicit none
+
+    type(MPI_Win), intent(in) :: win
+    type(MPI_Group), intent(out) :: group
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Win) :: win_c
+    integer(c_Group) :: group_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Win_get_group_c(win%MPI_VAL, group%MPI_VAL)
+    else
+        win_c = win%MPI_VAL
+        ierror_c = MPIR_Win_get_group_c(win_c, group_c)
+        group%MPI_VAL = group_c
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Win_get_group_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/win_get_name_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/win_get_name_f08ts.F90
new file mode 100644
index 0000000..ff0362c
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/win_get_name_f08ts.F90
@@ -0,0 +1,38 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Win_get_name_f08(win, win_name, resultlen, ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_char
+    use :: mpi_f08, only : MPI_Win
+    use :: mpi_f08, only : MPI_MAX_OBJECT_NAME
+    use :: mpi_c_interface, only : c_Win
+    use :: mpi_c_interface, only : MPIR_Win_get_name_c
+    use :: mpi_c_interface, only : MPIR_Fortran_string_c2f
+
+    implicit none
+
+    type(MPI_Win), intent(in) :: win
+    character(len=MPI_MAX_OBJECT_NAME), intent(out) :: win_name
+    integer, intent(out) :: resultlen
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Win) :: win_c
+    character(kind=c_char) :: win_name_c(MPI_MAX_OBJECT_NAME+1)
+    integer(c_int) :: resultlen_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Win_get_name_c(win%MPI_VAL, win_name_c, resultlen)
+    else
+        win_c = win%MPI_VAL
+        ierror_c = MPIR_Win_get_name_c(win_c, win_name_c, resultlen_c)
+        resultlen = resultlen_c
+    end if
+
+    call MPIR_Fortran_string_c2f(win_name_c, win_name)
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Win_get_name_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/win_lock_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/win_lock_f08ts.F90
new file mode 100644
index 0000000..54c690d
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/win_lock_f08ts.F90
@@ -0,0 +1,38 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Win_lock_f08(lock_type, rank, assert, win, ierror)
+    use :: mpi_f08, only : MPI_Win
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Win
+    use :: mpi_c_interface, only : MPIR_Win_lock_c
+
+    implicit none
+
+    integer, intent(in) :: lock_type
+    integer, intent(in) :: rank
+    integer, intent(in) :: assert
+    type(MPI_Win), intent(in) :: win
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: lock_type_c
+    integer(c_int) :: rank_c
+    integer(c_int) :: assert_c
+    integer(c_Win) :: win_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Win_lock_c(lock_type, rank, assert, win%MPI_VAL)
+    else
+        lock_type_c = lock_type
+        rank_c = rank
+        assert_c = assert
+        win_c = win%MPI_VAL
+        ierror_c = MPIR_Win_lock_c(lock_type_c, rank_c, assert_c, win_c)
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Win_lock_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/win_post_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/win_post_f08ts.F90
new file mode 100644
index 0000000..6cefcd5
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/win_post_f08ts.F90
@@ -0,0 +1,35 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Win_post_f08(group, assert, win, ierror)
+    use :: mpi_f08, only : MPI_Group, MPI_Win
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Win, c_Group
+    use :: mpi_c_interface, only : MPIR_Win_post_c
+
+    implicit none
+
+    type(MPI_Group), intent(in) :: group
+    integer, intent(in) :: assert
+    type(MPI_Win), intent(in) :: win
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Group) :: group_c
+    integer(c_int) :: assert_c
+    integer(c_Win) :: win_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Win_post_c(group%MPI_VAL, assert, win%MPI_VAL)
+    else
+        group_c = group%MPI_VAL
+        assert_c = assert
+        win_c = win%MPI_VAL
+        ierror_c = MPIR_Win_post_c(group_c, assert_c, win_c)
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Win_post_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/win_set_attr_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/win_set_attr_f08ts.F90
new file mode 100644
index 0000000..a753dc2
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/win_set_attr_f08ts.F90
@@ -0,0 +1,35 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Win_set_attr_f08(win, win_keyval, attribute_val, ierror)
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_f08, only : MPI_Win
+    use :: mpi_f08, only : MPI_ADDRESS_KIND
+    use :: mpi_c_interface, only : c_Win
+    use :: mpi_c_interface, only : MPIR_ATTR_AINT
+    use :: mpi_c_interface, only : MPIR_Win_set_attr_c
+
+    implicit none
+
+    type(MPI_Win), intent(in) :: win
+    integer, intent(in) :: win_keyval
+    integer(MPI_ADDRESS_KIND), intent(in) :: attribute_val
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Win) :: win_c
+    integer(c_int) :: win_keyval_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Win_set_attr_c(win%MPI_VAL, win_keyval, attribute_val, MPIR_ATTR_AINT)
+    else
+        win_c = win%MPI_VAL
+        win_keyval_c = win_keyval
+        ierror_c = MPIR_Win_set_attr_c(win_c, win_keyval_c, attribute_val, MPIR_ATTR_AINT)
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Win_set_attr_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/win_set_errhandler_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/win_set_errhandler_f08ts.F90
new file mode 100644
index 0000000..d568214
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/win_set_errhandler_f08ts.F90
@@ -0,0 +1,32 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Win_set_errhandler_f08(win, errhandler, ierror)
+    use :: mpi_f08, only : MPI_Win, MPI_Errhandler
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Win, c_Errhandler
+    use :: mpi_c_interface, only : MPIR_Win_set_errhandler_c
+
+    implicit none
+
+    type(MPI_Win), intent(in) :: win
+    type(MPI_Errhandler), intent(in) :: errhandler
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Win) :: win_c
+    integer(c_Errhandler) :: errhandler_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Win_set_errhandler_c(win%MPI_VAL, errhandler%MPI_VAL)
+    else
+        win_c = win%MPI_VAL
+        errhandler_c = errhandler%MPI_VAL
+        ierror_c = MPIR_Win_set_errhandler_c(win_c, errhandler_c)
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Win_set_errhandler_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/win_set_name_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/win_set_name_f08ts.F90
new file mode 100644
index 0000000..0473530
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/win_set_name_f08ts.F90
@@ -0,0 +1,34 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Win_set_name_f08(win, win_name, ierror)
+    use, intrinsic :: iso_c_binding, only : c_int, c_char
+    use :: mpi_f08, only : MPI_Win
+    use :: mpi_c_interface, only : c_Win
+    use :: mpi_c_interface, only : MPIR_Win_set_name_c
+    use :: mpi_c_interface, only : MPIR_Fortran_string_f2c
+
+    implicit none
+
+    type(MPI_Win), intent(in) :: win
+    character(len=*), intent(in) :: win_name
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Win) :: win_c
+    character(kind=c_char) :: win_name_c(len_trim(win_name)+1)
+    integer(c_int) :: ierror_c
+
+    call MPIR_Fortran_string_f2c(win_name, win_name_c)
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Win_set_name_c(win%MPI_VAL, win_name_c)
+    else
+        win_c = win%MPI_VAL
+        ierror_c = MPIR_Win_set_name_c(win_c, win_name_c)
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Win_set_name_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/win_start_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/win_start_f08ts.F90
new file mode 100644
index 0000000..8a1243a
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/win_start_f08ts.F90
@@ -0,0 +1,35 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Win_start_f08(group, assert, win, ierror)
+    use :: mpi_f08, only : MPI_Group, MPI_Win
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Win, c_Group
+    use :: mpi_c_interface, only : MPIR_Win_start_c
+
+    implicit none
+
+    type(MPI_Group), intent(in) :: group
+    integer, intent(in) :: assert
+    type(MPI_Win), intent(in) :: win
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Group) :: group_c
+    integer(c_int) :: assert_c
+    integer(c_Win) :: win_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Win_start_c(group%MPI_VAL, assert, win%MPI_VAL)
+    else
+        group_c = group%MPI_VAL
+        assert_c = assert
+        win_c = win%MPI_VAL
+        ierror_c = MPIR_Win_start_c(group_c, assert_c, win_c)
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Win_start_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/win_test_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/win_test_f08ts.F90
new file mode 100644
index 0000000..57f6997
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/win_test_f08ts.F90
@@ -0,0 +1,32 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Win_test_f08(win, flag, ierror)
+    use :: mpi_f08, only : MPI_Win
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Win
+    use :: mpi_c_interface, only : MPIR_Win_test_c
+
+    implicit none
+
+    logical, intent(out) :: flag
+    type(MPI_Win), intent(in) :: win
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: flag_c
+    integer(c_Win) :: win_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Win_test_c(win%MPI_VAL, flag_c)
+    else
+        win_c = win%MPI_VAL
+        ierror_c = MPIR_Win_test_c(win_c, flag_c)
+    end if
+
+    flag = (flag_c /= 0)
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Win_test_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/win_unlock_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/win_unlock_f08ts.F90
new file mode 100644
index 0000000..521a60b
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/win_unlock_f08ts.F90
@@ -0,0 +1,32 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Win_unlock_f08(rank, win, ierror)
+    use :: mpi_f08, only : MPI_Win
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Win
+    use :: mpi_c_interface, only : MPIR_Win_unlock_c
+
+    implicit none
+
+    integer, intent(in) :: rank
+    type(MPI_Win), intent(in) :: win
+    integer, optional, intent(out) :: ierror
+
+    integer(c_int) :: rank_c
+    integer(c_Win) :: win_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Win_unlock_c(rank, win%MPI_VAL)
+    else
+        rank_c = rank
+        win_c = win%MPI_VAL
+        ierror_c = MPIR_Win_unlock_c(rank_c, win_c)
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Win_unlock_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/win_wait_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/win_wait_f08ts.F90
new file mode 100644
index 0000000..3e8df74
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/win_wait_f08ts.F90
@@ -0,0 +1,29 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+subroutine MPI_Win_wait_f08(win, ierror)
+    use :: mpi_f08, only : MPI_Win
+    use, intrinsic :: iso_c_binding, only : c_int
+    use :: mpi_c_interface, only : c_Win
+    use :: mpi_c_interface, only : MPIR_Win_wait_c
+
+    implicit none
+
+    type(MPI_Win), intent(in) :: win
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Win) :: win_c
+    integer(c_int) :: ierror_c
+
+    if (c_int == kind(0)) then
+        ierror_c = MPIR_Win_wait_c(win%MPI_VAL)
+    else
+        win_c = win%MPI_VAL
+        ierror_c = MPIR_Win_wait_c(win_c)
+    end if
+
+    if (present(ierror)) ierror = ierror_c
+
+end subroutine MPI_Win_wait_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/wtick_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/wtick_f08ts.F90
new file mode 100644
index 0000000..4f96eff
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/wtick_f08ts.F90
@@ -0,0 +1,14 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+function MPI_Wtick_f08() result(res)
+    use,intrinsic :: iso_c_binding, only: c_double
+    use :: mpi_c_interface_nobuf, only: MPIR_Wtick_c
+    double precision :: res
+    real(c_double)   :: tick_c
+
+    res_c = MPIR_Wtick_c()
+    res = res_c
+end function MPI_Wtick_f08
diff --git a/src/binding/fortran/use_mpi_f08/wrappers_f/wtime_f08ts.F90 b/src/binding/fortran/use_mpi_f08/wrappers_f/wtime_f08ts.F90
new file mode 100644
index 0000000..7164f71
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/wrappers_f/wtime_f08ts.F90
@@ -0,0 +1,14 @@
+!   -*- Mode: Fortran; -*-
+!
+!   (C) 2014 by Argonne National Laboratory.
+!   See COPYRIGHT in top-level directory.
+!
+function MPI_Wtime_f08( ) Result(time)
+    use,intrinsic :: iso_c_binding, only: c_double
+    use :: mpi_c_interface_nobuf, only: MPIR_Wtime_c
+    double precision :: time
+    real(c_double)   :: time_c
+
+    time_c = MPIR_Wtime_c()
+    time = time_c
+end function MPI_Wtime_f08
diff --git a/src/include/mpi.h.in b/src/include/mpi.h.in
index abdfcfa..0d6b53b 100644
--- a/src/include/mpi.h.in
+++ b/src/include/mpi.h.in
@@ -736,6 +736,26 @@ extern MPIU_DLL_SPEC MPI_Fint * MPI_F_STATUSES_IGNORE;
 #define MPI_ARGV_NULL (char **)0
 #define MPI_ARGVS_NULL (char ***)0
 
+/* C type for MPI_STATUS in F08.
+   The field order should match that in mpi_f08_types.f90, and mpi_c_interface_types.f90.
+ */
+typedef struct {
+    int count_lo;
+    int count_hi_and_cancelled;
+    MPI_Fint MPI_SOURCE;
+    MPI_Fint MPI_TAG;
+    MPI_Fint MPI_ERROR;
+} MPI_F08_Status;
+
+extern MPI_F08_Status MPIR_F08_MPI_STATUS_IGNORE_OBJ;
+extern MPI_F08_Status MPIR_F08_MPI_STATUSES_IGNORE_OBJ[1];
+extern MPI_Fint MPIR_F08_MPI_IN_PLACE_OBJ;
+
+/* Pointers to above objects */
+extern MPI_F08_Status *MPI_F08_STATUS_IGNORE;
+extern MPI_F08_Status *MPI_F08_STATUSES_IGNORE;
+extern void *MPIR_F08_MPI_IN_PLACE;
+
 /* For supported thread levels */
 #define MPI_THREAD_SINGLE 0
 #define MPI_THREAD_FUNNELED 1
diff --git a/src/mpi/init/initthread.c b/src/mpi/init/initthread.c
index 413043c..751b3c3 100644
--- a/src/mpi/init/initthread.c
+++ b/src/mpi/init/initthread.c
@@ -285,6 +285,25 @@ int MPIR_Thread_CS_Finalize( void )
 #endif /* !MPID_DEVICE_DEFINES_THREAD_CS */
 #endif /* MPICH_IS_THREADED */
 
+#ifdef HAVE_F08_BINDING
+MPI_Status *MPIR_C_MPI_STATUS_IGNORE;
+MPI_Status *MPIR_C_MPI_STATUSES_IGNORE;
+char ** MPIR_C_MPI_ARGV_NULL;
+char ***MPIR_C_MPI_ARGVS_NULL;
+int *MPIR_C_MPI_UNWEIGHTED;
+int *MPIR_C_MPI_WEIGHTS_EMPTY;
+int *MPIR_C_MPI_ERRCODES_IGNORE;
+
+MPI_F08_Status MPIR_F08_MPI_STATUS_IGNORE_OBJ;
+MPI_F08_Status MPIR_F08_MPI_STATUSES_IGNORE_OBJ[1];
+MPI_Fint MPIR_F08_MPI_IN_PLACE_OBJ;
+
+/* Althought the two STATUS pointers are required but the MPI3.0,  they are not used in MPICH F08 binding */
+MPI_F08_Status *MPI_F08_STATUS_IGNORE = &MPIR_F08_MPI_STATUS_IGNORE_OBJ;
+MPI_F08_Status *MPI_F08_STATUSES_IGNORE = &MPIR_F08_MPI_STATUSES_IGNORE_OBJ[0];
+
+void *MPIR_F08_MPI_IN_PLACE = &MPIR_F08_MPI_IN_PLACE_OBJ;
+#endif
 
 #undef FUNCNAME
 #define FUNCNAME MPIR_Init_thread
@@ -371,6 +390,17 @@ int MPIR_Init_thread(int * argc, char ***argv, int required, int * provided)
     MPIR_Process.cxx_call_op_fn = 0;
 
 #endif
+
+#ifdef HAVE_F08_BINDING
+    MPIR_C_MPI_STATUS_IGNORE = MPI_STATUS_IGNORE;
+    MPIR_C_MPI_STATUSES_IGNORE = MPI_STATUSES_IGNORE;
+    MPIR_C_MPI_ARGV_NULL = MPI_ARGV_NULL;
+    MPIR_C_MPI_ARGVS_NULL = MPI_ARGVS_NULL;
+    MPIR_C_MPI_UNWEIGHTED = MPI_UNWEIGHTED;
+    MPIR_C_MPI_WEIGHTS_EMPTY = MPI_WEIGHTS_EMPTY;
+    MPIR_C_MPI_ERRCODES_IGNORE = MPI_ERRCODES_IGNORE;
+#endif
+
     /* This allows the device to select an alternative function for 
        dimsCreate */
     MPIR_Process.dimsCreate     = 0;

http://git.mpich.org/mpich.git/commitdiff/f653bd7cb8d8017578a105040d2ec8aec74af1fc

commit f653bd7cb8d8017578a105040d2ec8aec74af1fc
Author: Junchao Zhang <jczhang at mcs.anl.gov>
Date:   Fri Apr 18 15:23:47 2014 -0500

    Remove support subarray in mpi_f08_constants.f90
    
    The MPI-3 standard is broken in a bunch of ways with respect to
    subarrays support.  For example, it is unclear as to which functions
    can be passed a subarray and which cannot.  This is being fixed by the
    WG.  In the meanwhile, we'll disable subarray types.
    
    No review since F08 binding is experimental now.

diff --git a/src/binding/fortran/use_mpi_f08/mpi_f08_constants.f90 b/src/binding/fortran/use_mpi_f08/mpi_f08_constants.f90
index 6f87c19..c646915 100644
--- a/src/binding/fortran/use_mpi_f08/mpi_f08_constants.f90
+++ b/src/binding/fortran/use_mpi_f08/mpi_f08_constants.f90
@@ -166,7 +166,7 @@ type(MPI_Message),parameter    :: MPI_MESSAGE_NO_PROC = MPI_Message(1811939328)
 
 ! Fortran Support Method Specific Constants
 ! A.1.1 p. 664
-logical,parameter :: MPI_SUBARRAYS_SUPPORTED        = .true.  ! Value differs from mpif.h
+logical,parameter :: MPI_SUBARRAYS_SUPPORTED        = .false.
 logical,parameter :: MPI_ASYNC_PROTECTS_NONBLOCKING = .true.  ! Value differs from mpif.h
 
 ! Status size and reserved index values

http://git.mpich.org/mpich.git/commitdiff/c00d40083b0e6b5ab7a60251ba6b99a01cd3dfe6

commit c00d40083b0e6b5ab7a60251ba6b99a01cd3dfe6
Author: Junchao Zhang <jczhang at mcs.anl.gov>
Date:   Tue Feb 25 20:18:03 2014 -0800

    Add an example f08 binding
    
    The code is provided by Steve Oyanagi and Bill Long from Cray.
    
    No review since F08 binding is experimental now.

diff --git a/src/binding/fortran/use_mpi_f08/Makefile b/src/binding/fortran/use_mpi_f08/Makefile
new file mode 100644
index 0000000..b96ef02
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/Makefile
@@ -0,0 +1,42 @@
+
+FC = gfortran
+COBJ = mpi_c_interface.o mpi_c_interface_types.o mpi_c_interface_nobuf.o mpi_c_interface_cdesc.o
+FOBJ = mpi_f08.o mpi_f08_types.o mpi_f08_constants.o mpi_f08_callbacks.o
+
+FFLAGS = -c
+
+all:	libmpichf08.a
+
+libmpichf08.a:	 $(FOBJ) $(COBJ)
+	ar -r $@  $^
+
+mpi_c_interface.o:	mpi_c_interface.f90 mpi_c_interface_types.o mpi_c_interface_nobuf.o mpi_c_interface_cdesc.o
+	$(FC)  $(FFLAGS) $<
+
+mpi_c_interface_types.o:	mpi_c_interface_types.f90
+	$(FC)  $(FFLAGS) $<
+
+mpi_c_interface_nobuf.o: mpi_c_interface_nobuf.f90  mpi_c_interface_types.o
+	$(FC)  $(FFLAGS) $<
+
+mpi_c_interface_cdesc.o: mpi_c_interface_cdesc.f90  mpi_c_interface_types.o
+	$(FC)  $(FFLAGS) $<
+
+
+mpi_f08_types.o: mpi_f08_types.f90  mpi_c_interface_types.o
+	$(FC) $(FFLAGS) $<
+
+mpi_f08_constants.o: mpi_f08_constants.f90 mpi_f08_types.o mpi_c_interface_types.o
+	$(FC) $(FFLAGS) $<
+
+mpi_f08_callbacks.o: mpi_f08_callbacks.f90 mpi_f08_types.o mpi_f08_constants.o
+	$(FC) $(FFLAGS) $<
+
+mpi_f08.o: mpi_f08.f90  mpi_f08_callbacks.o mpi_f08_types.o mpi_f08_constants.o mpi_c_interface.o
+	$(FC) -em $(FFLAGS) $<
+
+clean:
+	rm -f *.o *.mod *.a
+
+clobber:	clean
+	rm -f libmpi_f08.a
diff --git a/src/binding/fortran/use_mpi_f08/f08ts/Makefile b/src/binding/fortran/use_mpi_f08/f08ts/Makefile
new file mode 100644
index 0000000..aa70f59
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/f08ts/Makefile
@@ -0,0 +1,47 @@
+FC=gfortran
+
+FSRCS = \
+	abort_f08ts.f90  \
+	barrier_f08ts.f90  \
+	bsend_f08ts.f90  \
+	bsend_init_f08ts.f90  \
+	buffer_attach_f08ts.f90  \
+	buffer_detach_f08ts.f90  \
+	cancel_f08ts.f90  \
+	comm_rank_f08ts.f90  \
+	comm_size_f08ts.f90  \
+	error_string_f08ts.f90  \
+	finalize_f08ts.f90  \
+	init_f08ts.f90  \
+	irecv_f08ts.f90  \
+	isend_f08ts.f90  \
+	recv_f08ts.f90  \
+	send_f08ts.f90  \
+	test_f08ts.f90  \
+	type_create_f90_complex_f08ts.f90  \
+	type_create_f90_integer_f08ts.f90  \
+	type_create_f90_real_f08ts.f90  \
+	type_match_size_f08ts.f90  \
+	wait_f08ts.f90  \
+	wtick_f08ts.f90  \
+	wtime_f08ts.f90
+
+FOBJS=$(FSRCS:.f90=.o)
+
+FFLAGS =
+
+%.o : %.f90
+	$(FC) -c -o $@ $(FFLAGS) $< -I ../
+
+LIBFCALLC=libf08ts.a
+
+all : $(LIBFCALLC)
+
+$(LIBFCALLC) : $(FOBJS)
+	ar -cr $@ $^
+
+clean:
+	rm -f *.o *.a
+
+clobber : clean
+	rm -f $(LIBFCALLC)
diff --git a/src/binding/fortran/use_mpi_f08/f08ts/abort_f08ts.f90 b/src/binding/fortran/use_mpi_f08/f08ts/abort_f08ts.f90
new file mode 100644
index 0000000..4283dfa
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/f08ts/abort_f08ts.f90
@@ -0,0 +1,18 @@
+
+subroutine MPI_Abort_f08(comm, errorcode, ierror)
+     use,intrinsic :: iso_c_binding, only: c_int
+     use :: mpi_f08,          only: MPI_Comm
+     use :: mpi_c_interface      ,  only: c_Comm, MPIR_Abort_c
+     type(MPI_Comm),      intent(in)  :: comm
+     integer,             intent(in)  :: errorcode
+     integer, optional,   intent(out) :: ierror
+     integer(c_Comm) :: comm_c
+     integer(c_int)  :: errorcode_c
+     integer(c_int)  :: res
+
+     comm_c = comm%MPI_VAL
+     errorcode_c = errorcode
+     res = MPIR_Abort_c (comm_c, errorcode_c)
+     if (present(ierror)) ierror = res
+
+end subroutine MPI_Abort_f08
diff --git a/src/binding/fortran/use_mpi_f08/f08ts/barrier_f08ts.f90 b/src/binding/fortran/use_mpi_f08/f08ts/barrier_f08ts.f90
new file mode 100644
index 0000000..408d654
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/f08ts/barrier_f08ts.f90
@@ -0,0 +1,17 @@
+
+subroutine MPI_Barrier_f08(comm, ierror)
+    use,intrinsic :: iso_c_binding, only: c_int
+    use :: mpi_f08, only : MPI_Comm
+    use :: mpi_c_interface, only: c_Comm, MPIR_Barrier_c
+
+    type(MPI_Comm),      intent(in)  :: comm
+    integer, optional,   intent(out) :: ierror
+
+    integer(c_Comm) :: comm_c
+    integer(c_int)  :: res
+
+    comm_c = comm%MPI_VAL
+    res = MPIR_Barrier_C (comm_c)
+    if (present(ierror)) ierror = res
+
+end subroutine MPI_Barrier_f08
diff --git a/src/binding/fortran/use_mpi_f08/f08ts/bsend_f08ts.f90 b/src/binding/fortran/use_mpi_f08/f08ts/bsend_f08ts.f90
new file mode 100644
index 0000000..760fe07
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/f08ts/bsend_f08ts.f90
@@ -0,0 +1,27 @@
+
+subroutine MPI_Bsend_f08ts(buf, count, datatype, dest, tag, comm, ierror)
+     use,intrinsic :: iso_c_binding, only: c_int
+     use :: mpi_f08,           only: MPI_Datatype, MPI_Comm
+     use :: mpi_c_interface,        only: c_Datatype, c_Comm, MPIR_Bsend_cdesc
+     type(*), DIMENSION(..), intent(in) :: buf
+     integer, intent(in) :: count, dest, tag
+     type(MPI_Datatype), intent(in) :: datatype
+     type(MPI_Comm), intent(in) :: comm
+     integer, optional, intent(out) :: ierror
+
+     integer(c_int)          :: count_c
+     integer(c_Datatype)     :: datatype_c
+     integer(c_int)          :: dest_c
+     integer(c_int)          :: tag_c
+     integer(c_Comm)         :: comm_c
+     integer(c_int)          :: res
+
+     count_c = count
+     datatype_c = datatype%MPI_VAL
+     dest_c = dest
+     tag_c = tag
+     comm_c = comm%MPI_VAL
+     res = MPIR_Bsend_cdesc (buf, count_c, datatype_c, dest_c, tag_c, comm_c)
+     if (present(ierror)) ierror = res
+
+end subroutine MPI_Bsend_f08ts
\ No newline at end of file
diff --git a/src/binding/fortran/use_mpi_f08/f08ts/bsend_init_f08ts.f90 b/src/binding/fortran/use_mpi_f08/f08ts/bsend_init_f08ts.f90
new file mode 100644
index 0000000..2ff3302
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/f08ts/bsend_init_f08ts.f90
@@ -0,0 +1,30 @@
+
+subroutine MPI_Bsend_init_f08ts(buf, count, datatype, dest, tag, comm, ierror, request)
+     use,intrinsic :: iso_c_binding, only: c_int
+     use :: mpi_f08,           only: MPI_Datatype, MPI_Comm, MPI_Request
+     use :: mpi_c_interface,        only: c_Datatype, c_Comm, c_Request, MPIR_Bsend_init_cdesc
+     type(*), DIMENSION(..), intent(in) :: buf
+     integer, intent(in) :: count, dest, tag
+     type(MPI_Datatype), intent(in) :: datatype
+     type(MPI_Comm), intent(in) :: comm
+     type(MPI_Request), intent(out) :: request
+     integer, optional, intent(out) :: ierror
+     integer(c_int)          :: count_c
+     integer(c_Datatype)     :: datatype_c
+     integer(c_int)          :: dest_c
+     integer(c_int)          :: tag_c
+     integer(c_comm)         :: comm_c
+     integer(c_Request)      :: request_c
+     integer(c_int)          :: res
+
+     count_c = count
+     datatype_c = datatype%MPI_VAL
+     dest_c = dest
+     tag_c = tag
+     comm_c = comm%MPI_VAL
+     res = MPIR_Bsend_init_cdesc (buf, count_c, datatype_c, dest_c, tag_c, comm_c, request_c)
+     request%MPI_VAL = request_c
+     if (present(ierror)) ierror = res
+
+end subroutine MPI_Bsend_init_f08ts
+
diff --git a/src/binding/fortran/use_mpi_f08/f08ts/buffer_attach_f08ts.f90 b/src/binding/fortran/use_mpi_f08/f08ts/buffer_attach_f08ts.f90
new file mode 100644
index 0000000..0f6e3a1
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/f08ts/buffer_attach_f08ts.f90
@@ -0,0 +1,15 @@
+subroutine MPI_Buffer_attach_f08ts(buffer, size, ierror)
+     use,intrinsic :: iso_c_binding, only: C_int
+     use :: mpi_c_interface,        only: MPIR_Buffer_attach_cdesc
+     type(*), DIMENSION(..), ASYNCHRONOUS :: buffer  !!! CORRECT
+     integer, intent(in) :: size
+     integer, optional, intent(out) :: ierror
+     integer(C_int)  :: size_c
+     integer(C_int)  :: res
+
+     size_c = size
+     res = MPIR_Buffer_attach_cdesc (buffer, size_c)
+     if (present(ierror)) ierror = res
+
+end subroutine MPI_Buffer_attach_f08ts
+
diff --git a/src/binding/fortran/use_mpi_f08/f08ts/buffer_detach_f08ts.f90 b/src/binding/fortran/use_mpi_f08/f08ts/buffer_detach_f08ts.f90
new file mode 100644
index 0000000..a49cf8a
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/f08ts/buffer_detach_f08ts.f90
@@ -0,0 +1,14 @@
+subroutine MPI_Buffer_detach_f08 (buffer_addr, size, ierror)
+     use,intrinsic :: iso_c_binding, only: c_int, c_ptr
+     use :: mpi_c_interface,        only: MPIR_Buffer_detach_c
+     type(c_ptr) :: buffer_addr
+     integer,intent(out) :: size
+     integer,intent(out),optional :: ierror
+     integer(c_int) :: size_c
+     integer(c_int) :: res
+
+     res = MPIR_Buffer_detach_c (buffer_addr, size_c)
+     size = size_c
+     if (present(ierror)) ierror = res
+
+end subroutine MPI_Buffer_detach_f08
diff --git a/src/binding/fortran/use_mpi_f08/f08ts/cancel_f08ts.f90 b/src/binding/fortran/use_mpi_f08/f08ts/cancel_f08ts.f90
new file mode 100644
index 0000000..189e5d8
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/f08ts/cancel_f08ts.f90
@@ -0,0 +1,14 @@
+subroutine MPI_Cancel_f08 (request, ierror)
+     use,intrinsic :: iso_c_binding, only: c_int
+     use :: mpi_f08,           only: MPI_Request
+     use :: mpi_c_interface,        only: C_Request, MPIR_Cancel_c
+     type(MPI_Request),intent(in) :: request
+     integer,intent(out),optional :: ierror
+     integer(C_Request) :: request_c
+     integer(c_int)     :: res
+
+     request_c = request%MPI_VAL
+     res = MPIR_Cancel_c (request_c)
+     if (present(ierror)) ierror = res
+
+end subroutine MPI_Cancel_f08
\ No newline at end of file
diff --git a/src/binding/fortran/use_mpi_f08/f08ts/comm_rank_f08ts.f90 b/src/binding/fortran/use_mpi_f08/f08ts/comm_rank_f08ts.f90
new file mode 100644
index 0000000..47421de
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/f08ts/comm_rank_f08ts.f90
@@ -0,0 +1,20 @@
+
+subroutine MPI_Comm_rank_f08(comm, rank, ierror)
+    use,intrinsic :: iso_c_binding, only: c_int
+    use :: mpi_f08, only : MPI_Comm
+    use :: mpi_c_interface, only : c_Comm, MPIR_Comm_rank_c
+
+    type(MPI_Comm), intent(in)     :: comm
+    integer, intent(out)           :: rank
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Comm) :: comm_c
+    integer(c_int)  :: rank_c
+    integer(c_int)  :: res
+
+    comm_c = comm%MPI_VAL
+    res = MPIR_Comm_rank_c(comm_c, rank_c)
+    rank = rank_c
+    if (present(ierror)) ierror = res
+
+end subroutine MPI_Comm_rank_f08
diff --git a/src/binding/fortran/use_mpi_f08/f08ts/comm_size_f08ts.f90 b/src/binding/fortran/use_mpi_f08/f08ts/comm_size_f08ts.f90
new file mode 100644
index 0000000..9c4dce8
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/f08ts/comm_size_f08ts.f90
@@ -0,0 +1,20 @@
+
+subroutine MPI_Comm_size_f08(comm, size, ierror)
+    use,intrinsic :: iso_c_binding, only: c_int
+    use :: mpi_f08, only : MPI_Comm
+    use :: mpi_c_interface, only: c_Comm, MPIR_Comm_size_c
+
+    type(MPI_Comm), intent(in)     :: comm
+    integer, intent(out)           :: size
+    integer, optional, intent(out) :: ierror
+
+    integer(c_Comm) :: comm_c
+    integer(c_int)  :: size_c
+    integer(c_int)  :: res
+
+    comm_c = comm%MPI_VAL
+    res = MPIR_Comm_size_c (comm_c, size_c)
+    size = size_c
+    if (present(ierror)) ierror = res
+
+end subroutine MPI_Comm_size_f08
diff --git a/src/binding/fortran/use_mpi_f08/f08ts/error_string_f08ts.f90 b/src/binding/fortran/use_mpi_f08/f08ts/error_string_f08ts.f90
new file mode 100644
index 0000000..5940872
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/f08ts/error_string_f08ts.f90
@@ -0,0 +1,21 @@
+!--> MPIR_Error_string
+
+subroutine MPIR_Error_string_f08 (errorcode, string, resultlen, ierror)
+    use, intrinsic :: iso_c_binding, only: c_int
+    use :: mpi_f08, only : MPI_MAX_ERROR_STRING
+    use :: mpi_c_interface, only: c_char, MPIR_Error_string_c
+
+    integer,                              intent(in) :: errorcode
+    CHARACTER(LEN=MPI_MAX_ERROR_STRING), intent(out) :: string
+    integer,                             intent(out) :: resultlen
+    integer, optional,                   intent(out) :: ierror
+    integer(c_int) :: errorcode_c
+    integer(c_int) :: resultlen_c
+    integer(c_int) :: res
+
+    errorcode_c = errorcode
+    res = MPIR_Error_string_C (errorcode_c, string, resultlen_c)
+    resultlen = resultlen_c
+    if (present(ierror)) ierror = res
+
+end subroutine MPIR_Error_string_f08
diff --git a/src/binding/fortran/use_mpi_f08/f08ts/finalize_f08ts.f90 b/src/binding/fortran/use_mpi_f08/f08ts/finalize_f08ts.f90
new file mode 100644
index 0000000..d50a065
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/f08ts/finalize_f08ts.f90
@@ -0,0 +1,11 @@
+
+subroutine MPI_Finalize_f08(ierror )
+     use,intrinsic :: iso_c_binding, only: c_int
+     use mpi_c_interface, only: MPIR_Finalize_c
+     integer, optional,   intent(out) :: ierror
+     integer(c_int) :: res
+
+     res = MPIR_Finalize_c()
+     if (present(ierror)) ierror = res
+
+end subroutine MPI_Finalize_f08
diff --git a/src/binding/fortran/use_mpi_f08/f08ts/init_f08ts.f90 b/src/binding/fortran/use_mpi_f08/f08ts/init_f08ts.f90
new file mode 100644
index 0000000..3ba69a4
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/f08ts/init_f08ts.f90
@@ -0,0 +1,11 @@
+
+subroutine MPI_Init_f08(ierror)
+     use,intrinsic :: iso_c_binding, only: c_int
+     use mpi_c_interface, only: C_NULL_PTR, MPIR_Init_c
+     integer, optional,   intent(out) :: ierror
+     integer(c_int) :: res
+
+     res = MPIR_Init_c(C_NULL_PTR, C_NULL_PTR)
+     if (present(ierror)) ierror = res
+
+end subroutine MPI_Init_f08
diff --git a/src/binding/fortran/use_mpi_f08/f08ts/irecv_f08ts.f90 b/src/binding/fortran/use_mpi_f08/f08ts/irecv_f08ts.f90
new file mode 100644
index 0000000..f1451af
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/f08ts/irecv_f08ts.f90
@@ -0,0 +1,31 @@
+
+subroutine MPI_Irecv_f08ts(buf, count, datatype, source, tag, comm, request, ierror)
+    use,intrinsic :: iso_c_binding, only: c_int
+    use :: mpi_f08, only : MPI_Datatype, MPI_Request, MPI_Comm
+    use :: mpi_c_interface, only: c_Datatype, c_Comm, C_Request, MPIR_Irecv_cdesc
+
+    type(*), DIMENSION(..), ASYNCHRONOUS :: buf
+    integer,            intent(in)       :: count, source, tag
+    type(MPI_Datatype), intent(in)       :: datatype
+    type(MPI_Comm),     intent(in)       :: comm
+    type(MPI_Request), intent(out)       :: request
+    integer, optional, intent(out)       :: ierror
+    integer(c_int)      :: count_c
+    integer(c_Datatype) :: datatype_c
+    integer(c_int)      :: source_c
+    integer(c_int)      :: tag_c
+    integer(c_Comm)     :: comm_c
+    integer(C_Request)  :: request_c
+    integer(c_int)      :: res
+
+    count_c    = count
+    datatype_c = datatype%MPI_VAL
+    source_c   = source
+    tag_c      = tag
+    comm_c     = comm%MPI_VAL
+
+    res = MPIR_Irecv_cdesc (buf,count_c,datatype_c,source_c,tag_c,comm_c, request_c)
+    request%MPI_VAL = request_c
+    if (present(ierror)) ierror = res
+
+end subroutine MPI_Irecv_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/f08ts/isend_f08ts.f90 b/src/binding/fortran/use_mpi_f08/f08ts/isend_f08ts.f90
new file mode 100644
index 0000000..41da9bb
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/f08ts/isend_f08ts.f90
@@ -0,0 +1,31 @@
+
+subroutine MPI_Isend_f08ts(buf, count, datatype, dest, tag, comm, request, ierror)
+     use,intrinsic :: iso_c_binding, only: c_int
+     use :: mpi_f08, only : MPI_Datatype, MPI_Request, MPI_Comm
+     use :: mpi_c_interface, only:  c_Datatype, c_Comm, c_Request, MPIR_Isend_cdesc
+
+     type(*), DIMENSION(..), ASYNCHRONOUS :: buf
+     integer,            intent(in)       :: count, dest, tag
+     type(MPI_Datatype), intent(in)       :: datatype
+     type(MPI_Comm),     intent(in)       :: comm
+     type(MPI_Request), intent(out)       :: request
+     integer, optional, intent(out)       :: ierror
+     integer(c_int)      :: count_c
+     integer(c_Datatype) :: datatype_c
+     integer(c_int)      :: dest_c
+     integer(c_int)      :: tag_c
+     integer(c_Comm)     :: comm_c
+     integer(C_Request)  :: request_c
+     integer(c_int)      :: res
+
+     count_c    = count
+     datatype_c = datatype%MPI_VAL
+     dest_c   = dest
+     tag_c      = tag
+     comm_c     = comm%MPI_VAL
+
+     res = MPIR_Isend_cdesc (buf,count_c,datatype_c,dest_c,tag_c,comm_c, request_c)
+     request%MPI_VAL = request_c
+     if (present(ierror)) ierror = res
+
+end subroutine MPI_Isend_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/f08ts/recv_f08ts.f90 b/src/binding/fortran/use_mpi_f08/f08ts/recv_f08ts.f90
new file mode 100644
index 0000000..a5f004a
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/f08ts/recv_f08ts.f90
@@ -0,0 +1,32 @@
+
+subroutine MPI_Recv_f08ts(buf, count, datatype, source, tag, comm, status, ierror)
+    use,intrinsic :: iso_c_binding, only: c_int
+    use :: mpi_f08, only : MPI_Datatype, MPI_Status, MPI_Comm, assignment(=)
+    use :: mpi_c_interface, only: c_Datatype, c_Comm, MPIR_Recv_cdesc, c_Status
+
+    type(*), DIMENSION(..)        :: buf
+    integer,           intent(in) :: count, source, tag
+    type(MPI_Datatype),intent(in) :: datatype
+    type(MPI_Comm),    intent(in) :: comm
+    type(MPI_Status), intent(out) :: status
+    integer, optional,intent(out) :: ierror
+
+    integer(c_int)      :: count_c
+    integer(c_Datatype) :: datatype_c
+    integer(c_int)      :: source_c
+    integer(c_int)      :: tag_c
+    integer(c_Comm)     :: comm_c
+    type(c_Status)  :: status_c
+    integer(c_int)      :: res
+
+    count_c    = count
+    datatype_c = datatype%MPI_VAL
+    source_c   = source
+    tag_c      = tag
+    comm_c     = comm%MPI_VAL
+
+    res = MPIR_Recv_cdesc (buf,count_c,datatype_c,source_c,tag_c,comm_c, status_c)
+    status = status_c
+    if (present(ierror)) ierror = res
+
+end subroutine MPI_Recv_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/f08ts/send_f08ts.f90 b/src/binding/fortran/use_mpi_f08/f08ts/send_f08ts.f90
new file mode 100644
index 0000000..e693651
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/f08ts/send_f08ts.f90
@@ -0,0 +1,29 @@
+
+subroutine MPI_Send_f08ts(buf,count,datatype,dest,tag,comm,ierror)
+    use :: mpi_f08, only : MPI_Datatype, MPI_Comm
+    use,intrinsic :: iso_c_binding, only: c_int
+    use :: mpi_c_interface, only: c_Datatype, c_Comm, MPIR_Send_cdesc
+
+    type(*),DIMENSION(..),intent(in) :: buf
+    integer,              intent(in) :: count, dest, tag
+    type(MPI_Datatype),   intent(in) :: datatype
+    type(MPI_Comm),       intent(in) :: comm
+    integer, optional,   intent(out) :: ierror
+
+    integer(c_int)      :: count_c
+    integer(c_Datatype) :: datatype_c
+    integer(c_int)      :: dest_c
+    integer(c_int)      :: tag_c
+    integer(c_Comm)     :: comm_c
+    integer(c_int)      :: res
+
+    count_c    = count
+    datatype_c = datatype%MPI_VAL
+    dest_c     = dest
+    tag_c      = tag
+    comm_c     = comm%MPI_VAL
+
+    res = MPIR_Send_cdesc (buf, count_c, datatype_c, dest_c, tag_c, comm_c)
+    if (present(ierror)) ierror = res
+
+end subroutine MPI_Send_f08ts
diff --git a/src/binding/fortran/use_mpi_f08/f08ts/test_f08ts.f90 b/src/binding/fortran/use_mpi_f08/f08ts/test_f08ts.f90
new file mode 100644
index 0000000..94689cc
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/f08ts/test_f08ts.f90
@@ -0,0 +1,24 @@
+
+subroutine MPI_Test_f08 (request, flag, status, ierror)
+    use,intrinsic :: iso_c_binding, only: c_int
+    use :: mpi_f08, only : MPI_Request, MPI_Status, assignment(=)
+    use :: mpi_c_interface, only: C_Request, c_int, c_Status, MPIR_Test_c
+
+    type(MPI_Request), intent(inout) :: request
+    LOGICAL,           intent(out)   :: flag
+    type(MPI_Status)                 :: status
+    integer,optional,  intent(out)   :: ierror
+    integer(C_Request) :: request_c
+    integer(c_int)     :: flag_c
+    type(c_Status) :: status_c
+    integer(c_int)     :: res
+
+    request_c = request%MPI_VAL
+    status_c = status
+    res = MPIR_Test_C (request_c, flag_c, status_c)
+    request%MPI_VAL = request_c
+    status = status_c
+    flag = (flag_c /= 0)
+    if (present(ierror)) ierror = res
+
+end subroutine MPI_Test_f08
diff --git a/src/binding/fortran/use_mpi_f08/f08ts/type_create_f90_complex_f08ts.f90 b/src/binding/fortran/use_mpi_f08/f08ts/type_create_f90_complex_f08ts.f90
new file mode 100644
index 0000000..b49b03f
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/f08ts/type_create_f90_complex_f08ts.f90
@@ -0,0 +1,22 @@
+
+subroutine MPI_Type_create_f90_complex_f08 (p, r, newtype, ierror)
+    use, intrinsic :: iso_c_binding, only: c_int
+    use :: mpi_f08, only : MPI_Datatype
+    use :: mpi_c_interface, only: c_Datatype, MPIR_Type_create_f90_complex_c
+    integer,intent(in) :: p
+    integer,intent(in) :: r
+    type(MPI_Datatype),intent(out) :: newtype
+    integer,optional, intent(out) :: ierror
+
+    integer(c_int) :: p_c
+    integer(c_int) :: r_c
+    integer(c_Datatype) :: newtype_c
+    integer(c_int) :: res
+
+    p_c = p
+    r_c = r
+    res = MPIR_Type_create_f90_complex_c (p_c, r_c, newtype_c)
+    newtype%MPI_VAL = newtype_c
+    if (present(ierror)) ierror = res
+
+end subroutine MPI_Type_create_f90_complex_f08
diff --git a/src/binding/fortran/use_mpi_f08/f08ts/type_create_f90_integer_f08ts.f90 b/src/binding/fortran/use_mpi_f08/f08ts/type_create_f90_integer_f08ts.f90
new file mode 100644
index 0000000..e1f2885
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/f08ts/type_create_f90_integer_f08ts.f90
@@ -0,0 +1,18 @@
+
+subroutine MPI_Type_create_f90_integer_f08 (r, newtype, ierror)
+    use,intrinsic :: iso_c_binding, only: c_int
+    use :: mpi_f08, only : MPI_Datatype
+    use :: mpi_c_interface, only: c_Datatype, MPIR_Type_create_f90_integer_c
+    integer,intent(in) :: r
+    type(MPI_Datatype),intent(out) :: newtype
+    integer,optional, intent(out) :: ierror
+    integer(c_int) :: r_c
+    integer(c_Datatype) :: newtype_c
+    integer(c_int) :: res
+
+    r_c = r
+    res = MPIR_Type_create_f90_integer_c (r_c, newtype_c)
+    newtype%MPI_VAL = newtype_c
+    if (present(ierror)) ierror = res
+
+end subroutine MPI_Type_create_f90_integer_f08
diff --git a/src/binding/fortran/use_mpi_f08/f08ts/type_create_f90_real_f08ts.f90 b/src/binding/fortran/use_mpi_f08/f08ts/type_create_f90_real_f08ts.f90
new file mode 100644
index 0000000..34e0022
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/f08ts/type_create_f90_real_f08ts.f90
@@ -0,0 +1,25 @@
+
+subroutine MPI_Type_create_f90_real_f08 (p, r, newtype, ierror)
+    use,intrinsic :: iso_c_binding, only: c_int
+    use :: mpi_f08, only : MPI_Datatype
+    use :: mpi_c_interface, only: c_Datatype, MPIR_Type_create_f90_real_c
+
+    integer,intent(in) :: p
+    integer,intent(in) :: r
+    type(MPI_Datatype),intent(out) :: newtype
+    integer,optional, intent(out) :: ierror
+
+    integer(c_int) :: p_c
+    integer(c_int) :: r_c
+    integer(c_Datatype) :: newtype_c
+    integer(c_int) :: res
+
+    p_c = p
+    r_c = r
+    res = MPIR_Type_create_f90_real_c (p_c, r_c, newtype_c)
+    newtype%MPI_VAL = newtype_c
+    if (present(ierror)) ierror = res
+
+end subroutine MPI_Type_create_f90_real_f08
+
+
diff --git a/src/binding/fortran/use_mpi_f08/f08ts/type_match_size_f08ts.f90 b/src/binding/fortran/use_mpi_f08/f08ts/type_match_size_f08ts.f90
new file mode 100644
index 0000000..9a0a215
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/f08ts/type_match_size_f08ts.f90
@@ -0,0 +1,25 @@
+
+subroutine MPI_Type_match_size_f08 (typeclass, size, datatype, ierror)
+    use,intrinsic :: iso_c_binding, only: c_int
+    use :: mpi_f08, only : MPI_Datatype
+    use :: mpi_c_interface, only: c_Datatype, MPIR_Type_match_size_c
+
+    integer,intent(in) :: typeclass
+    integer,intent(in) :: size
+    type(MPI_Datatype),intent(out) :: datatype
+    integer,optional,intent(out) :: ierror
+
+    integer(c_int) :: typeclass_c
+    integer(c_int) :: size_c
+    integer(c_Datatype) :: datatype_c
+    integer(c_int) :: res
+
+    typeclass_c = typeclass
+    size_c = size
+    res = MPIR_Type_match_size_c (typeclass_c, size_c, datatype_c)
+    datatype%MPI_VAL = datatype_c
+    if (present(ierror)) ierror = res
+
+end subroutine MPI_Type_match_size_f08
+
+
diff --git a/src/binding/fortran/use_mpi_f08/f08ts/wait_f08ts.f90 b/src/binding/fortran/use_mpi_f08/f08ts/wait_f08ts.f90
new file mode 100644
index 0000000..7ec12ef
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/f08ts/wait_f08ts.f90
@@ -0,0 +1,22 @@
+
+subroutine MPI_Wait_f08(request, status, ierror)
+    use,intrinsic :: iso_c_binding, only: c_int
+    use :: mpi_f08, only : MPI_Request, MPI_Status, assignment(=)
+    use :: mpi_c_interface, only: c_Request, MPIR_Wait_c, c_Status
+
+    type(MPI_Request), intent(inout) :: request
+    type(MPI_Status)                 :: status
+    integer, optional, intent(out)   :: ierror
+
+    integer(C_Request) :: request_c
+    integer(c_int)     :: res
+    type(c_Status) :: status_c
+
+    request_c = request%MPI_VAL
+    res = MPIR_Wait_c (request_c, status_c)
+    request%MPI_VAL = request_c
+    status = status_c
+    if (present(ierror)) ierror = res
+
+end subroutine MPI_Wait_f08
+
diff --git a/src/binding/fortran/use_mpi_f08/f08ts/wtick_f08ts.f90 b/src/binding/fortran/use_mpi_f08/f08ts/wtick_f08ts.f90
new file mode 100644
index 0000000..78b8500
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/f08ts/wtick_f08ts.f90
@@ -0,0 +1,11 @@
+!--> MPIR_Wtick
+
+function MPI_Wtick_f08( ) Result(tick)
+     use,intrinsic :: iso_c_binding, only: c_double
+      use :: mpi_c_interface_nobuf, only: MPIR_Wtick_c
+      DOUBLE PRECISION :: tick
+      real(c_double)   :: tick_c
+
+      tick_c = MPIR_Wtick_c()
+      tick = tick_c
+end function MPI_Wtick_f08
\ No newline at end of file
diff --git a/src/binding/fortran/use_mpi_f08/f08ts/wtime_f08ts.f90 b/src/binding/fortran/use_mpi_f08/f08ts/wtime_f08ts.f90
new file mode 100644
index 0000000..683c8c5
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/f08ts/wtime_f08ts.f90
@@ -0,0 +1,9 @@
+function MPI_Wtime_f08( ) Result(time)
+     use,intrinsic :: iso_c_binding, only: c_double
+      use :: mpi_c_interface_nobuf, only: MPIR_Wtime_c
+      DOUBLE PRECISION :: time
+      real(c_double)   :: time_c
+
+      time_c = MPIR_Wtime_c()
+      time = time_c
+end function MPI_Wtime_f08
\ No newline at end of file
diff --git a/src/binding/fortran/use_mpi_f08/mpi_c_interface.f90 b/src/binding/fortran/use_mpi_f08/mpi_c_interface.f90
new file mode 100644
index 0000000..c6361c0
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/mpi_c_interface.f90
@@ -0,0 +1,5 @@
+module mpi_c_interface
+    use mpi_c_interface_types
+    use mpi_c_interface_nobuf
+    use mpi_c_interface_cdesc
+end module mpi_c_interface
diff --git a/src/binding/fortran/use_mpi_f08/mpi_c_interface_cdesc.f90 b/src/binding/fortran/use_mpi_f08/mpi_c_interface_cdesc.f90
new file mode 100644
index 0000000..d5017d7
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/mpi_c_interface_cdesc.f90
@@ -0,0 +1,100 @@
+module mpi_c_interface_cdesc
+implicit none
+
+interface
+
+function MPIR_Bsend_init_cdesc (buf, count, datatype, dest, tag, comm, request) &
+            BIND(C, name="MPIR_Bsend_init_cdesc") RESULT (res)
+    use :: mpi_c_interface_types, only: C_Datatype, C_Comm, C_request
+    use,intrinsic :: iso_c_binding, only: c_int
+    type(*),dimension(..)             :: buf
+    integer(c_int),      value,intent(in)  :: count
+    integer(c_Datatype), value,intent(in)  :: datatype
+    integer(c_int),      value,intent(in)  :: dest
+    integer(c_int),      value,intent(in)  :: tag
+    integer(c_Comm),     value,intent(in)  :: comm
+    integer(C_request),       intent(out)  :: request
+    integer(c_int)                         :: res
+end function MPIR_Bsend_init_cdesc
+
+function MPIR_Buffer_attach_cdesc (buffer, size) &
+            BIND(C, name="MPIR_Buffer_attach_cdesc") RESULT (res)
+    use,intrinsic :: iso_c_binding, only: c_int
+    type(*),dimension(..),asynchronous :: buffer
+    integer(c_int),       value, intent(in) :: size
+    integer(c_int)                          :: res
+end function MPIR_Buffer_attach_cdesc
+
+function MPIR_Bsend_cdesc (buf, count, datatype, dest, tag, comm) &
+            BIND(C, name="MPIR_Bsend_cdesc") RESULT (res)
+    use :: mpi_c_interface_types, only: C_Datatype, C_Comm
+    use,intrinsic :: iso_c_binding, only: c_int
+    type(*),dimension(..)             :: buf
+    integer(c_int),      value,intent(in)  :: count
+    integer(c_Datatype), value,intent(in)  :: datatype
+    integer(c_int),      value,intent(in)  :: dest
+    integer(c_int),      value,intent(in)  :: tag
+    integer(c_Comm),     value,intent(in)  :: comm
+    integer(c_int)                         :: res
+end function MPIR_Bsend_cdesc
+
+function MPIR_Irecv_cdesc (buf, count, datatype, source, tag, comm, request) &
+            BIND(C, name="MPIR_Irecv_cdesc") RESULT (res)
+    use :: mpi_c_interface_types, only: C_Datatype, C_Comm, C_Request
+    use,intrinsic :: iso_c_binding, only: c_int
+    type(*),dimension(..)             :: buf
+    integer(c_int),      value,intent(in)  :: count
+    integer(c_Datatype), value,intent(in)  :: datatype
+    integer(c_int),      value,intent(in)  :: source
+    integer(c_int),      value,intent(in)  :: tag
+    integer(c_Comm),     value,intent(in)  :: comm
+    integer(c_Request),        intent(out) :: request
+    integer(c_int)                    :: res
+end function MPIR_Irecv_cdesc
+
+
+function MPIR_Isend_cdesc (buf, count, datatype, dest, tag, comm, request) &
+            BIND(C, name="MPIR_Isend_cdesc") RESULT (res)
+    use :: mpi_c_interface_types, only: C_Datatype, C_Comm, C_Request
+    use,intrinsic :: iso_c_binding, only: c_int
+    type(*),dimension(..)                 :: buf
+    integer(c_int),      value,intent(in) :: count
+    integer(C_Datatype), value,intent(in) :: datatype
+    integer(c_int),      value,intent(in) :: dest
+    integer(c_int),      value,intent(in) :: tag
+    integer(C_Comm),     value,intent(in) :: comm
+    integer(C_Request),       intent(out) :: request
+    integer(c_int)                        :: res
+end function MPIR_Isend_cdesc
+
+
+function MPIR_Recv_cdesc (buf,count,datatype,source,tag,comm, status) &
+           BIND(C, name="MPIR_Recv_cdesc") RESULT (res)
+    use :: mpi_c_interface_types, only: c_Status, C_Datatype, C_Comm
+    use,intrinsic :: iso_c_binding, only: c_int
+    type(*),dimension(..)                 :: buf
+    integer(c_int),      value,intent(in) :: count
+    integer(C_Datatype), value,intent(in) :: datatype
+    integer(c_int),      value,intent(in) :: source
+    integer(c_int),      value,intent(in) :: tag
+    integer(C_Comm),     value,intent(in) :: comm
+    type(c_Status),       intent(out) :: status
+    integer(c_int)                        :: res
+end function MPIR_Recv_cdesc
+
+function MPIR_Send_cdesc (buf,count,datatype,dest,tag,comm) &
+           BIND(C, name="MPIR_Send_cdesc") RESULT (res)
+    use :: mpi_c_interface_types, only: C_Datatype, C_Comm
+    use,intrinsic :: iso_c_binding, only: c_int
+    type(*),dimension(..),    intent(in) :: buf
+    integer(c_int),     value,intent(in) :: count
+    integer(C_Datatype),value,intent(in) :: datatype
+    integer(c_int),     value,intent(in) :: dest
+    integer(c_int),     value,intent(in) :: tag
+    integer(C_Comm),    value,intent(in) :: comm
+    integer(c_int)                       :: res
+end function MPIR_Send_cdesc
+
+end interface
+
+end module mpi_c_interface_cdesc
diff --git a/src/binding/fortran/use_mpi_f08/mpi_c_interface_nobuf.f90 b/src/binding/fortran/use_mpi_f08/mpi_c_interface_nobuf.f90
new file mode 100644
index 0000000..e5d3c14
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/mpi_c_interface_nobuf.f90
@@ -0,0 +1,173 @@
+! mpi_c_interfaces_nobuf module
+! Provides interfaces for C functions in MPI 3 / mpich3 that do not have
+! a choice formal parameter
+!
+! This module is used by the module mpi_c_interfaces, which is later
+! used in the Fortran wrapper functions defined in the modules mpi and
+! mpi_f08.
+!
+! This module provides only BIND(C) interfaces for MPI_* and PMPI_*
+! routines in the base C library.  Within the interfaces, these
+! modules are used to access constants:
+!
+!  mpi_c_interface_types
+!  iso_c_binding
+!
+
+module mpi_c_interface_nobuf
+
+implicit none
+
+interface
+
+function MPIR_Init_c (argc, argv) &
+           BIND(C, name="MPI_Init") RESULT (res)
+    use,intrinsic :: iso_c_binding, only: c_int, c_ptr
+    type(c_ptr),value,intent(in) :: argc
+    type(c_ptr),value,intent(in) :: argv
+    integer(c_int)               :: res
+end function MPIR_Init_c
+
+function MPIR_Finalize_c() &
+            BIND(C, name="MPI_Finalize") RESULT (res)
+    use,intrinsic :: iso_c_binding, only:  c_int
+    integer(c_int) :: res
+end function MPIR_Finalize_c
+
+function MPIR_Comm_rank_c (comm, rank) &
+            BIND(C, name="MPI_Comm_rank") RESULT (res)
+    use :: mpi_c_interface_types, only:  C_comm
+    use,intrinsic :: iso_c_binding, only: c_int
+    integer(C_comm),value,intent(in) :: comm
+    integer(c_int), intent(out)      :: rank
+    integer(c_int)                   :: res
+end function MPIR_Comm_rank_c
+
+function MPIR_Comm_size_c (comm, size) &
+           BIND(C, name="MPI_Comm_size") RESULT (res)
+    use :: mpi_c_interface_types, only:  C_comm
+    use,intrinsic :: iso_c_binding, only: c_int
+    integer(C_comm),value,intent(in) :: comm
+    integer(c_int),intent(out)       :: size
+    integer(c_int)                   :: res
+end function MPIR_Comm_size_c
+
+function MPIR_Buffer_detach_c (buffer_addr, size) &
+           BIND(C, name="MPI_Buffer_detach") RESULT (res)
+    use,intrinsic :: iso_c_binding, only: c_ptr, c_int
+    type(c_ptr),intent(out)    :: buffer_addr
+    integer(c_int),intent(out) :: size
+    integer(c_int)             :: res
+end function MPIR_Buffer_detach_c
+
+function MPIR_cancel_c (request) &
+            BIND(C, name="MPI_cancel") RESULT (res)
+    use :: mpi_c_interface_types, only: C_Request
+    use,intrinsic :: iso_c_binding, only: c_int
+    integer(C_Request) :: request
+    integer(c_int)     :: res
+end function MPIR_cancel_c
+
+function MPIR_Abort_c (comm, errorcode) &
+           BIND(C, name="MPI_Abort") RESULT (res)
+    use :: mpi_c_interface_types, only: C_comm
+    use,intrinsic :: iso_c_binding, only: c_int
+    integer(C_comm),value,intent(in) :: comm
+    integer(c_int), value,intent(in) :: errorcode
+    integer(c_int)                   :: res
+end function MPIR_Abort_c
+
+function MPIR_Barrier_c (comm) &
+           BIND(C, name="MPI_Barrier") RESULT (res)
+    use :: mpi_c_interface_types, only:  C_comm
+    use,intrinsic :: iso_c_binding, only: c_int
+    integer(C_comm),value,intent(in) :: comm
+    integer(c_int)                  :: res
+end function MPIR_Barrier_c
+
+function MPIR_Error_string_c (errorcode, string, resultlen) &
+          BIND(C, name="MPI_Error_string") RESULT (res)
+    use,intrinsic :: iso_c_binding, only:  c_int, c_char
+    integer(c_int),value,intent(in)    :: errorcode
+    character(kind=c_char),intent(out) :: string(*)
+    integer(c_int),intent(out)         :: resultlen
+    integer(c_int)                     :: res
+end function MPIR_Error_string_c
+
+function MPIR_Test_c( request, flag, status) &
+           BIND(C, name="MPI_Test") RESULT (res)
+    use,intrinsic :: iso_c_binding, only: c_int
+    use :: mpi_c_interface_types, only:  C_request, c_Status
+    integer(C_request) :: request
+    integer(c_int)     :: flag
+    type(c_Status) :: status
+    integer(c_int)     :: res
+end function MPIR_Test_c
+
+function MPIR_Type_create_f90_complex_c (p, r, newtype) &
+           BIND(C, name="MPI_Type_create_f90_complex") RESULT (res)
+    use :: mpi_c_interface_types, only: C_Datatype
+    use,intrinsic :: iso_c_binding, only: c_int
+    integer(c_int),value :: p
+    integer(c_int),value :: r
+    integer(C_Datatype),intent(out) :: newtype
+    integer(c_int)       :: res
+end function MPIR_Type_create_f90_complex_c
+
+function MPIR_Type_create_f90_integer_c (r, newtype) &
+           BIND(C, name="MPI_Type_create_f90_integer") RESULT (res)
+    use :: mpi_c_interface_types, only: C_Datatype
+    use,intrinsic :: iso_c_binding, only: c_int
+    integer(c_int),value :: r
+    integer(C_Datatype),intent(out) :: newtype
+    integer(c_int)       :: res
+end function MPIR_Type_create_f90_integer_c
+
+function MPIR_Type_create_f90_real_c (p, r, newtype) &
+           BIND(C, name="MPI_Type_create_f90_real") RESULT (res)
+    use :: mpi_c_interface_types, only: C_Datatype
+    use,intrinsic :: iso_c_binding, only: c_int
+    integer(c_int),value :: p
+    integer(c_int),value :: r
+    integer(C_Datatype),intent(out) :: newtype
+    integer(c_int)       :: res
+end function MPIR_Type_create_f90_real_c
+
+function MPIR_Type_match_size_c (typeclass, size, datatype) &
+           BIND(C, name="MPI_Type_match_size") RESULT (res)
+    use :: mpi_c_interface_types, only: C_Datatype
+    use,intrinsic :: iso_c_binding, only: c_int
+    integer(c_int),value :: typeclass
+    integer(c_int),value :: size
+    integer(C_Datatype)  :: datatype
+    integer(c_int)       :: res
+end function MPIR_Type_match_size_c
+
+function MPIR_Wait_c (request, status) &
+           BIND(C, name="MPI_Wait") RESULT(res)
+    use :: mpi_c_interface_types, only:  c_Status, C_Request
+    use,intrinsic :: iso_c_binding, only: c_int
+    integer(C_Request)  :: request
+    type(c_Status)  :: status
+    integer(c_int)      :: res
+end function MPIR_Wait_c
+
+function MPIR_Wtick_c () &
+           BIND(C, name="MPI_Wtick") RESULT (res)
+    use,intrinsic :: iso_c_binding, only: c_double
+    real(c_double) :: res
+end function MPIR_Wtick_c
+
+
+function MPIR_Wtime_c () &
+           BIND(C, name="MPI_Wtime") RESULT (res)
+    use,intrinsic :: iso_c_binding, only:  c_double
+    real(c_double) :: res
+end function MPIR_Wtime_c
+
+
+end interface
+
+
+end module mpi_c_interface_nobuf
+
diff --git a/src/binding/fortran/use_mpi_f08/mpi_c_interface_types.f90 b/src/binding/fortran/use_mpi_f08/mpi_c_interface_types.f90
new file mode 100644
index 0000000..5e3cf47
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/mpi_c_interface_types.f90
@@ -0,0 +1,91 @@
+! mpich3 integer sizes for handles and status type
+!
+! Module mpi_c_types is a helper module used by the modules
+! specifying c interfaces:
+!
+! mpi_c_interfaces_cdesc - interfaces for MPI functions with a descriptor argument
+! mpi_c_interfaces_nobuf - interfaces for MPI functions with no choice argument
+!
+! It is not defined in the spec and not intended for end users.
+!--------------------------------------------------------------
+
+MODULE mpi_c_interface_types
+
+!=========================
+! Kinds for native C types
+!=========================
+ use,intrinsic :: iso_c_binding, only: c_int, c_long, c_long_long, &
+                                       c_ptr, c_double, C_NULL_PTR, &
+                                       c_char, c_intptr_t , c_sizeof
+ IMPLICIT NONE
+
+!=============================================================
+! Kinds for integer types in C prototypes; should match  mpi.h
+!=============================================================
+
+! C types (with MPI_ => C_ for the internal names here
+! A.1.2 p 676
+
+integer,parameter :: c_Aint       = c_long
+integer,parameter :: c_Fint       = KIND(0)
+integer,parameter :: c_Count      = c_long_long
+integer,parameter :: c_Offset     = c_long_long
+
+integer,parameter :: c_Datatype   = c_int
+integer,parameter :: c_Comm       = c_int
+integer,parameter :: c_Group      = c_int
+integer,parameter :: c_Win        = c_int
+integer,parameter :: c_Op         = c_int
+integer,parameter :: c_Info       = c_int
+integer,parameter :: c_Errhandler = c_int
+integer,parameter :: c_Request    = c_int
+integer,parameter :: c_Message    = c_int
+integer,parameter :: c_file       = c_intptr_t
+
+! Rolf's alternate suggested names
+
+!integer,parameter :: MPI_C_DATATYPE_KIND   = c_int
+!integer,parameter :: MPI_C_COMM_KIND       = c_int
+!integer,parameter :: MPI_C_GROUP_KIND      = c_int
+!integer,parameter :: MPI_C_WIN_KIND        = c_int
+!integer,parameter :: MPI_C_OP_KIND         = c_int
+!integer,parameter :: MPI_C_INFO_KIND       = c_int
+!integer,parameter :: MPI_C_ERRHANDLER_KIND = c_int
+!integer,parameter :: MPI_C_REQUEST_KIND    = c_int
+!integer,parameter :: MPI_C_MESSAGE_KIND    = c_int
+!integer,parameter :: MPI_C_FILE_KIND       = c_intptr_t
+
+
+
+!/* Extracted from 'grep typedef mpi.h'
+!typedef int MPI_Datatype;
+!typedef int MPI_Comm;
+!typedef int MPI_Group;
+!typedef int MPI_Win;
+!typedef int MPI_Op;
+!typedef int MPI_Errhandler;
+!typedef int MPI_Request;
+!typedef int MPI_Message;
+!typedef int MPI_Info;
+!typedef long MPI_Aint;
+!typedef int MPI_Fint;   ! replaced above with compiler-flag dependent value
+!typedef long long MPI_Count;
+!typedef long long MPI_Offset;
+
+
+!================================================
+! C struct for STATUS values; should match  mpi.h
+!================================================
+
+! MPI_Status, with name changed to c_Status for internal disambiguation
+! A.1.2 p 676
+
+type, bind(c) :: c_Status
+   integer(c_int)  :: count_lo
+   integer(c_int)  :: count_hi_and_cancelled
+   integer(c_int)  :: MPI_SOURCE
+   integer(c_int)  :: MPI_TAG
+   integer(c_int)  :: MPI_ERROR
+end type c_Status
+
+end MODULE mpi_c_interface_types
diff --git a/src/binding/fortran/use_mpi_f08/mpi_f08.f90 b/src/binding/fortran/use_mpi_f08/mpi_f08.f90
new file mode 100644
index 0000000..5435d1a
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/mpi_f08.f90
@@ -0,0 +1,3792 @@
+
+! MPI-3.0 A.3
+module mpi_f08
+use :: mpi_f08_types
+use :: mpi_f08_constants
+use :: mpi_f08_callbacks
+
+implicit none
+
+interface MPI_Bsend
+    subroutine MPI_Bsend_f08ts(buf, count, datatype, dest, tag, comm, ierror)
+        use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm, MPI_Request
+        implicit none
+        type(*), dimension(..), intent(in) :: buf
+        integer, intent(in) :: count, dest, tag
+        type(MPI_Datatype), intent(in) :: datatype
+        type(MPI_Comm), intent(in) :: comm
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Bsend_f08ts
+end interface MPI_Bsend
+
+interface  MPI_Bsend_init
+    subroutine MPI_Bsend_init_f08ts(buf, count, datatype, dest, tag, comm, request, ierror)
+        use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm, MPI_Request
+        implicit none
+        type(*), dimension(..) :: buf
+        integer, intent(in) :: count, dest, tag
+        type(MPI_Datatype), intent(in) :: datatype
+        type(MPI_Comm), intent(in) :: comm
+        type(MPI_Request), intent(out) :: request
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Bsend_init_f08ts
+end interface  MPI_Bsend_init
+
+interface  MPI_Buffer_attach
+    subroutine MPI_Buffer_attach_f08ts(buffer, size, ierror)
+        implicit none
+        type(*), dimension(..) :: buffer
+        integer, intent(in) :: size
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Buffer_attach_f08ts
+end interface  MPI_Buffer_attach
+
+interface  MPI_Buffer_detach
+    subroutine MPI_Buffer_detach_f08ts(buffer_addr, size, ierror)
+        implicit none
+        type(*), dimension(..) :: buffer_addr
+        integer, intent(out) :: size
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Buffer_detach_f08ts
+end interface  MPI_Buffer_detach
+
+interface  MPI_Cancel
+    subroutine MPI_Cancel_f08(request, ierror)
+        use :: mpi_f08_types, only : MPI_Request
+        implicit none
+        type(MPI_Request), intent(in) :: request
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Cancel_f08
+end interface  MPI_Cancel
+
+interface  MPI_Get_count
+    subroutine MPI_Get_count_f08(status, datatype, count, ierror)
+        use :: mpi_f08_types, only : MPI_Status, MPI_Datatype
+        implicit none
+        type(MPI_Status), intent(in) :: status
+        type(MPI_Datatype), intent(in) :: datatype
+        integer, intent(out) :: count
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Get_count_f08
+end interface  MPI_Get_count
+
+interface  MPI_Ibsend
+    subroutine MPI_Ibsend_f08ts(buf, count, datatype, dest, tag, comm, request, ierror)
+        use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm, MPI_Request
+        implicit none
+        type(*), dimension(..), intent(in) :: buf
+        integer, intent(in) :: count, dest, tag
+        type(MPI_Datatype), intent(in) :: datatype
+        type(MPI_Comm), intent(in) :: comm
+        type(MPI_Request), intent(out) :: request
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Ibsend_f08ts
+end interface  MPI_Ibsend
+
+interface  MPI_Iprobe
+    subroutine MPI_Iprobe_f08(source, tag, comm, flag, status, ierror)
+        use :: mpi_f08_types, only : MPI_Comm, MPI_Status
+        implicit none
+        integer, intent(in) :: source, tag
+        type(MPI_Comm), intent(in) :: comm
+        LOGICAL, intent(out) :: flag
+        type(MPI_Status), intent(out) :: status
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Iprobe_f08
+end interface  MPI_Iprobe
+
+interface  MPI_Irecv
+    subroutine MPI_Irecv_f08ts(buf, count, datatype, source, tag, comm, request, ierror)
+        use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm, MPI_Request
+        implicit none
+        type(*), dimension(..) :: buf
+        integer, intent(in) :: count, source, tag
+        type(MPI_Datatype), intent(in) :: datatype
+        type(MPI_Comm), intent(in) :: comm
+        type(MPI_Request), intent(out) :: request
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Irecv_f08ts
+end interface  MPI_Irecv
+
+interface  MPI_Irsend
+    subroutine MPI_Irsend_f08ts(buf, count, datatype, dest, tag, comm, request, ierror)
+        use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm, MPI_Request
+        implicit none
+        type(*), dimension(..), intent(in) :: buf
+        integer, intent(in) :: count, dest, tag
+        type(MPI_Datatype), intent(in) :: datatype
+        type(MPI_Comm), intent(in) :: comm
+        type(MPI_Request), intent(out) :: request
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Irsend_f08ts
+end interface  MPI_Irsend
+
+interface  MPI_Isend
+    subroutine MPI_Isend_f08ts(buf, count, datatype, dest, tag, comm, request, ierror)
+        use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm, MPI_Request
+        implicit none
+        type(*), dimension(..), intent(in) :: buf
+        integer, intent(in) :: count, dest, tag
+        type(MPI_Datatype), intent(in) :: datatype
+        type(MPI_Comm), intent(in) :: comm
+        type(MPI_Request), intent(out) :: request
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Isend_f08ts
+end interface  MPI_Isend
+
+interface  MPI_Issend
+    subroutine MPI_Issend_f08ts(buf, count, datatype, dest, tag, comm, request, ierror)
+        use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm, MPI_Request
+        implicit none
+        type(*), dimension(..), intent(in) :: buf
+        integer, intent(in) :: count, dest, tag
+        type(MPI_Datatype), intent(in) :: datatype
+        type(MPI_Comm), intent(in) :: comm
+        type(MPI_Request), intent(out) :: request
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Issend_f08ts
+end interface  MPI_Issend
+
+interface  MPI_Probe
+    subroutine MPI_Probe_f08(source, tag, comm, status, ierror)
+        use :: mpi_f08_types, only : MPI_Comm, MPI_Status
+        implicit none
+        integer, intent(in) :: source, tag
+        type(MPI_Comm), intent(in) :: comm
+        type(MPI_Status), intent(out) :: status
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Probe_f08
+end interface  MPI_Probe
+
+interface  MPI_Recv
+    subroutine MPI_Recv_f08ts(buf, count, datatype, source, tag, comm, status, ierror)
+        use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm, MPI_Status
+        implicit none
+        type(*), dimension(..) :: buf
+        integer, intent(in) :: count, source, tag
+        type(MPI_Datatype), intent(in) :: datatype
+        type(MPI_Comm), intent(in) :: comm
+        type(MPI_Status) :: status
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Recv_f08ts
+end interface  MPI_Recv
+
+interface  MPI_Recv_init
+    subroutine MPI_Recv_init_f08ts(buf, count, datatype, source, tag, comm, request, ierror)
+        use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm, MPI_Request
+        implicit none
+        type(*), dimension(..) :: buf
+        integer, intent(in) :: count, source, tag
+        type(MPI_Datatype), intent(in) :: datatype
+        type(MPI_Comm), intent(in) :: comm
+        type(MPI_Request), intent(out) :: request
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Recv_init_f08ts
+end interface  MPI_Recv_init
+
+interface  MPI_Request_free
+    subroutine MPI_Request_free_f08(request, ierror)
+        use :: mpi_f08_types, only : MPI_Request
+        implicit none
+        type(MPI_Request), intent(inout) :: request
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Request_free_f08
+end interface  MPI_Request_free
+
+interface  MPI_Request_get_status
+    subroutine MPI_Request_get_status_f08(request, flag, status, ierror)
+        use :: mpi_f08_types, only : MPI_Request, MPI_Status
+        implicit none
+        type(MPI_Request), intent(in) :: request
+        LOGICAL, intent(out) :: flag
+        type(MPI_Status) :: status
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Request_get_status_f08
+end interface  MPI_Request_get_status
+
+interface  MPI_Rsend
+    subroutine MPI_Rsend_f08ts(buf, count, datatype, dest, tag, comm, ierror)
+        use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm
+        implicit none
+        type(*), dimension(..), intent(in) :: buf
+        integer, intent(in) :: count, dest, tag
+        type(MPI_Datatype), intent(in) :: datatype
+        type(MPI_Comm), intent(in) :: comm
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Rsend_f08ts
+end interface  MPI_Rsend
+
+interface  MPI_Rsend_init
+    subroutine MPI_Rsend_init_f08ts(buf, count, datatype, dest, tag, comm, request, ierror)
+        use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm, MPI_Request
+        implicit none
+        type(*), dimension(..) :: buf
+        integer, intent(in) :: count, dest, tag
+        type(MPI_Datatype), intent(in) :: datatype
+        type(MPI_Comm), intent(in) :: comm
+        type(MPI_Request), intent(out) :: request
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Rsend_init_f08ts
+end interface  MPI_Rsend_init
+
+interface  MPI_Send
+    subroutine MPI_Send_f08ts(buf, count, datatype, dest, tag, comm, ierror)
+        use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm
+        implicit none
+        type(*), dimension(..), intent(in) :: buf
+        integer, intent(in) :: count, dest, tag
+        type(MPI_Datatype), intent(in) :: datatype
+        type(MPI_Comm), intent(in) :: comm
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Send_f08ts
+end interface  MPI_Send
+
+interface  MPI_Sendrecv
+    subroutine MPI_Sendrecv_f08ts(sendbuf, sendcount, sendtype, dest, sendtag, recvbuf, &
+                   recvcount, recvtype, source, recvtag, comm, status, ierror)
+        use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm, MPI_Status
+        implicit none
+        type(*), dimension(..), intent(in) :: sendbuf
+        type(*), dimension(..) :: recvbuf
+        integer, intent(in) :: sendcount, dest, sendtag, recvcount, source, recvtag
+        type(MPI_Datatype), intent(in) :: sendtype, recvtype
+        type(MPI_Comm), intent(in) :: comm
+        type(MPI_Status) :: status
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Sendrecv_f08ts
+end interface  MPI_Sendrecv
+
+interface  MPI_Sendrecv_replace
+    subroutine MPI_Sendrecv_replace_f08ts(buf, count, datatype, dest, sendtag, source, recvtag, &
+                   comm, status, ierror)
+        use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm, MPI_Status
+        implicit none
+        type(*), dimension(..) :: buf
+        integer, intent(in) :: count, dest, sendtag, source, recvtag
+        type(MPI_Datatype), intent(in) :: datatype
+        type(MPI_Comm), intent(in) :: comm
+        type(MPI_Status) :: status
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Sendrecv_replace_f08ts
+end interface  MPI_Sendrecv_replace
+
+interface  MPI_Send_init
+    subroutine MPI_Send_init_f08ts(buf, count, datatype, dest, tag, comm, request, ierror)
+        use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm, MPI_Request
+        implicit none
+        type(*), dimension(..) :: buf
+        integer, intent(in) :: count, dest, tag
+        type(MPI_Datatype), intent(in) :: datatype
+        type(MPI_Comm), intent(in) :: comm
+        type(MPI_Request), intent(out) :: request
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Send_init_f08ts
+end interface  MPI_Send_init
+
+interface  MPI_Ssend
+    subroutine MPI_Ssend_f08ts(buf, count, datatype, dest, tag, comm, ierror)
+        use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm
+        implicit none
+        type(*), dimension(..), intent(in) :: buf
+        integer, intent(in) :: count, dest, tag
+        type(MPI_Datatype), intent(in) :: datatype
+        type(MPI_Comm), intent(in) :: comm
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Ssend_f08ts
+end interface  MPI_Ssend
+
+interface  MPI_Ssend_init
+    subroutine MPI_Ssend_init_f08ts(buf, count, datatype, dest, tag, comm, request, ierror)
+        use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm, MPI_Request
+        implicit none
+        type(*), dimension(..) :: buf
+        integer, intent(in) :: count, dest, tag
+        type(MPI_Datatype), intent(in) :: datatype
+        type(MPI_Comm), intent(in) :: comm
+        type(MPI_Request), intent(out) :: request
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Ssend_init_f08ts
+end interface  MPI_Ssend_init
+
+interface  MPI_Start
+    subroutine MPI_Start_f08(request, ierror)
+        use :: mpi_f08_types, only : MPI_Request
+        implicit none
+        type(MPI_Request), intent(inout) :: request
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Start_f08
+end interface  MPI_Start
+
+interface  MPI_Startall
+    subroutine MPI_Startall_f08(count, array_of_requests, ierror)
+        use :: mpi_f08_types, only : MPI_Request
+        implicit none
+        integer, intent(in) :: count
+        type(MPI_Request), intent(inout) :: array_of_requests(count)
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Startall_f08
+end interface  MPI_Startall
+
+interface  MPI_Test
+    subroutine MPI_Test_f08(request, flag, status, ierror)
+        use :: mpi_f08_types, only : MPI_Request, MPI_Status
+        implicit none
+        type(MPI_Request), intent(inout) :: request
+        LOGICAL, intent(out) :: flag
+        type(MPI_Status) :: status
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Test_f08
+end interface  MPI_Test
+
+interface  MPI_Testall
+    subroutine MPI_Testall_f08(count, array_of_requests, flag, array_of_statuses, ierror)
+        use :: mpi_f08_types, only : MPI_Request, MPI_Status
+        implicit none
+        integer, intent(in) :: count
+        type(MPI_Request), intent(inout) :: array_of_requests(count)
+        LOGICAL, intent(out) :: flag
+        type(MPI_Status) :: array_of_statuses(*)
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Testall_f08
+end interface  MPI_Testall
+
+interface  MPI_Testany
+    subroutine MPI_Testany_f08(count, array_of_requests, index, flag, status, ierror)
+        use :: mpi_f08_types, only : MPI_Request, MPI_Status
+        implicit none
+        integer, intent(in) :: count
+        type(MPI_Request), intent(inout) :: array_of_requests(count)
+        integer, intent(out) :: index
+        LOGICAL, intent(out) :: flag
+        type(MPI_Status) :: status
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Testany_f08
+end interface  MPI_Testany
+
+interface  MPI_Testsome
+    subroutine MPI_Testsome_f08(incount, array_of_requests, outcount, &
+                   array_of_indices, array_of_statuses, ierror)
+        use :: mpi_f08_types, only : MPI_Request, MPI_Status
+        implicit none
+        integer, intent(in) :: incount
+        type(MPI_Request), intent(inout) :: array_of_requests(incount)
+        integer, intent(out) :: outcount, array_of_indices(*)
+        type(MPI_Status) :: array_of_statuses(*)
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Testsome_f08
+end interface  MPI_Testsome
+
+interface  MPI_Test_cancelled
+    subroutine MPI_Test_cancelled_f08(status, flag, ierror)
+        use :: mpi_f08_types, only : MPI_Status
+        implicit none
+        type(MPI_Status), intent(in) :: status
+        LOGICAL, intent(out) :: flag
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Test_cancelled_f08
+end interface  MPI_Test_cancelled
+
+interface  MPI_Wait
+    subroutine MPI_Wait_f08(request, status, ierror)
+        use :: mpi_f08_types, only : MPI_Request, MPI_Status
+        implicit none
+        type(MPI_Request), intent(inout) :: request
+        type(MPI_Status) :: status
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Wait_f08
+end interface  MPI_Wait
+
+interface  MPI_Waitall
+    subroutine MPI_Waitall_f08(count, array_of_requests, array_of_statuses, ierror)
+        use :: mpi_f08_types, only : MPI_Request, MPI_Status
+        implicit none
+        integer, intent(in) :: count
+        type(MPI_Request), intent(inout) :: array_of_requests(count)
+        type(MPI_Status) :: array_of_statuses(*)
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Waitall_f08
+end interface  MPI_Waitall
+
+interface  MPI_Waitany
+    subroutine MPI_Waitany_f08(count, array_of_requests, index, status, ierror)
+        use :: mpi_f08_types, only : MPI_Request, MPI_Status
+        implicit none
+        integer, intent(in) :: count
+        type(MPI_Request), intent(inout) :: array_of_requests(count)
+        integer, intent(out) :: index
+        type(MPI_Status) :: status
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Waitany_f08
+end interface  MPI_Waitany
+
+interface  MPI_Waitsome
+    subroutine MPI_Waitsome_f08(incount, array_of_requests, outcount, &
+                   array_of_indices, array_of_statuses, ierror)
+        use :: mpi_f08_types, only : MPI_Request, MPI_Status
+        implicit none
+        integer, intent(in) :: incount
+        type(MPI_Request), intent(inout) :: array_of_requests(incount)
+        integer, intent(out) :: outcount, array_of_indices(*)
+        type(MPI_Status) :: array_of_statuses(*)
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Waitsome_f08
+end interface  MPI_Waitsome
+
+interface  MPI_Get_address
+    subroutine MPI_Get_address_f08ts(location, address, ierror)
+        use :: mpi_f08_constants, only : MPI_ADDRESS_KinD
+        implicit none
+        type(*), dimension(..) :: location
+        integer(MPI_ADDRESS_KinD), intent(out) :: address
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Get_address_f08ts
+end interface  MPI_Get_address
+
+interface  MPI_Get_elements
+    subroutine MPI_Get_elements_f08(status, datatype, count, ierror)
+        use :: mpi_f08_types, only : MPI_Status, MPI_Datatype
+        implicit none
+        type(MPI_Status), intent(in) :: status
+        type(MPI_Datatype), intent(in) :: datatype
+        integer, intent(out) :: count
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Get_elements_f08
+end interface  MPI_Get_elements
+
+interface  MPI_Get_elements_x
+    subroutine MPI_Get_elements_x_f08(status, datatype, count, ierror)
+        use :: mpi_f08_types, only : MPI_Status, MPI_Datatype
+        use :: mpi_f08_constants, only : MPI_COUNT_KinD
+        implicit none
+        type(MPI_Status), intent(in) :: status
+        type(MPI_Datatype), intent(in) :: datatype
+        integer(MPI_COUNT_KinD), intent(out) :: count
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Get_elements_x_f08
+end interface  MPI_Get_elements_x
+
+interface  MPI_Pack
+    subroutine MPI_Pack_f08ts(inbuf, incount, datatype, outbuf, outsize, position, comm, ierror)
+        use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm
+        implicit none
+        type(*), dimension(..), intent(in) :: inbuf
+        type(*), dimension(..) :: outbuf
+        integer, intent(in) :: incount, outsize
+        type(MPI_Datatype), intent(in) :: datatype
+        integer, intent(inout) :: position
+        type(MPI_Comm), intent(in) :: comm
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Pack_f08ts
+end interface  MPI_Pack
+
+interface  MPI_Pack_external
+    subroutine MPI_Pack_external_f08ts(datarep, inbuf, incount, datatype, outbuf, outsize, &
+                                      position, ierror)
+        use :: mpi_f08_types, only : MPI_Datatype
+        use :: mpi_f08_constants, only : MPI_ADDRESS_KinD
+        implicit none
+        CHARACTER(LEN=*), intent(in) :: datarep
+        type(*), dimension(..), intent(in) :: inbuf
+        type(*), dimension(..) :: outbuf
+        integer, intent(in) :: incount
+        type(MPI_Datatype), intent(in) :: datatype
+        integer(MPI_ADDRESS_KinD), intent(in) :: outsize
+        integer(MPI_ADDRESS_KinD), intent(inout) :: position
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Pack_external_f08ts
+end interface  MPI_Pack_external
+
+interface  MPI_Pack_external_size
+    subroutine MPI_Pack_external_size_f08(datarep, incount, datatype, size, ierror)
+        use :: mpi_f08_types, only : MPI_Datatype
+        use :: mpi_f08_constants, only : MPI_ADDRESS_KinD
+        implicit none
+        type(MPI_Datatype), intent(in) :: datatype
+        integer, intent(in) :: incount
+        CHARACTER(LEN=*), intent(in) :: datarep
+        integer(MPI_ADDRESS_KinD), intent(out) :: size
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Pack_external_size_f08
+end interface  MPI_Pack_external_size
+
+interface  MPI_Pack_size
+    subroutine MPI_Pack_size_f08(incount, datatype, comm, size, ierror)
+        use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm
+        implicit none
+        integer, intent(in) :: incount
+        type(MPI_Datatype), intent(in) :: datatype
+        type(MPI_Comm), intent(in) :: comm
+        integer, intent(out) :: size
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Pack_size_f08
+end interface  MPI_Pack_size
+
+interface  MPI_Type_commit
+    subroutine MPI_Type_commit_f08(datatype, ierror)
+        use :: mpi_f08_types, only : MPI_Datatype
+        implicit none
+        type(MPI_Datatype), intent(inout) :: datatype
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Type_commit_f08
+end interface  MPI_Type_commit
+
+interface  MPI_Type_contiguous
+    subroutine MPI_Type_contiguous_f08(count, oldtype, newtype, ierror)
+        use :: mpi_f08_types, only : MPI_Datatype
+        implicit none
+        integer, intent(in) :: count
+        type(MPI_Datatype), intent(in) :: oldtype
+        type(MPI_Datatype), intent(out) :: newtype
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Type_contiguous_f08
+end interface  MPI_Type_contiguous
+
+interface  MPI_Type_create_darray
+    subroutine MPI_Type_create_darray_f08(size, rank, ndims, array_of_gsizes, &
+                   array_of_distribs, array_of_dargs, array_of_psizes, order, &
+                   oldtype, newtype, ierror)
+        use :: mpi_f08_types, only : MPI_Datatype
+        implicit none
+        integer, intent(in) :: size, rank, ndims, order
+        integer, intent(in) :: array_of_gsizes(ndims), array_of_distribs(ndims)
+        integer, intent(in) :: array_of_dargs(ndims), array_of_psizes(ndims)
+        type(MPI_Datatype), intent(in) :: oldtype
+        type(MPI_Datatype), intent(out) :: newtype
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Type_create_darray_f08
+end interface  MPI_Type_create_darray
+
+interface  MPI_Type_create_hindexed
+    subroutine MPI_Type_create_hindexed_f08(count, array_of_blocklengths, &
+                   array_of_displacements, oldtype, newtype, ierror)
+        use :: mpi_f08_types, only : MPI_Datatype
+        use :: mpi_f08_constants, only : MPI_ADDRESS_KinD
+        implicit none
+        integer, intent(in) :: count
+        integer, intent(in) :: array_of_blocklengths(count)
+        integer(MPI_ADDRESS_KinD), intent(in) :: array_of_displacements(count)
+        type(MPI_Datatype), intent(in) :: oldtype
+        type(MPI_Datatype), intent(out) :: newtype
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Type_create_hindexed_f08
+end interface  MPI_Type_create_hindexed
+
+interface  MPI_Type_create_hvector
+    subroutine MPI_Type_create_hvector_f08(count, blocklength, stride, oldtype, newtype, ierror)
+        use :: mpi_f08_types, only : MPI_Datatype
+        use :: mpi_f08_constants, only : MPI_ADDRESS_KinD
+        implicit none
+        integer, intent(in) :: count, blocklength
+        integer(MPI_ADDRESS_KinD), intent(in) :: stride
+        type(MPI_Datatype), intent(in) :: oldtype
+        type(MPI_Datatype), intent(out) :: newtype
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Type_create_hvector_f08
+end interface  MPI_Type_create_hvector
+
+interface  MPI_Type_create_indexed_block
+    subroutine MPI_Type_create_indexed_block_f08(count, blocklength, &
+                   array_of_displacements, oldtype, newtype, ierror)
+        use :: mpi_f08_types, only : MPI_Datatype
+        implicit none
+        integer, intent(in) :: count, blocklength
+        integer, intent(in) :: array_of_displacements(count)
+        type(MPI_Datatype), intent(in) :: oldtype
+        type(MPI_Datatype), intent(out) :: newtype
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Type_create_indexed_block_f08
+end interface  MPI_Type_create_indexed_block
+
+interface  MPI_Type_create_hindexed_block
+    subroutine MPI_Type_create_hindexed_block_f08(count, blocklength, &
+                                array_of_displacements, oldtype, newtype, ierror)
+        use :: mpi_f08_types, only : MPI_Datatype
+        use :: mpi_f08_constants, only : MPI_ADDRESS_KinD
+        implicit none
+        integer, intent(in) :: count, blocklength
+        integer(MPI_ADDRESS_KinD), intent(in) :: array_of_displacements(count)
+        type(MPI_Datatype), intent(in) :: oldtype
+        type(MPI_Datatype), intent(out) :: newtype
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Type_create_hindexed_block_f08
+end interface  MPI_Type_create_hindexed_block
+
+interface  MPI_Type_create_resized
+    subroutine MPI_Type_create_resized_f08(oldtype, lb, extent, newtype, ierror)
+        use :: mpi_f08_types, only : MPI_Datatype
+        use :: mpi_f08_constants, only : MPI_ADDRESS_KinD
+        implicit none
+        integer(MPI_ADDRESS_KinD), intent(in) :: lb, extent
+        type(MPI_Datatype), intent(in) :: oldtype
+        type(MPI_Datatype), intent(out) :: newtype
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Type_create_resized_f08
+end interface  MPI_Type_create_resized
+
+interface  MPI_Type_create_struct
+    subroutine MPI_Type_create_struct_f08(count, array_of_blocklengths, &
+                                array_of_displacements, array_of_types, newtype, ierror)
+        use :: mpi_f08_types, only : MPI_Datatype
+        use :: mpi_f08_constants, only : MPI_ADDRESS_KinD
+        implicit none
+        integer, intent(in) :: count
+        integer, intent(in) :: array_of_blocklengths(count)
+        integer(MPI_ADDRESS_KinD), intent(in) :: array_of_displacements(count)
+        type(MPI_Datatype), intent(in) :: array_of_types(count)
+        type(MPI_Datatype), intent(out) :: newtype
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Type_create_struct_f08
+end interface  MPI_Type_create_struct
+
+interface  MPI_Type_create_subarray
+    subroutine MPI_Type_create_subarray_f08(ndims, array_of_sizes, array_of_subsizes, &
+                         array_of_starts, order, oldtype, newtype, ierror)
+        use :: mpi_f08_types, only : MPI_Datatype
+        implicit none
+        integer, intent(in) :: ndims, order
+        integer, intent(in) :: array_of_sizes(ndims), array_of_subsizes(ndims)
+        integer, intent(in) :: array_of_starts(ndims)
+        type(MPI_Datatype), intent(in) :: oldtype
+        type(MPI_Datatype), intent(out) :: newtype
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Type_create_subarray_f08
+end interface  MPI_Type_create_subarray
+
+interface  MPI_Type_dup
+    subroutine MPI_Type_dup_f08(oldtype, newtype, ierror)
+        use :: mpi_f08_types, only : MPI_Datatype
+        implicit none
+        type(MPI_Datatype), intent(in) :: oldtype
+        type(MPI_Datatype), intent(out) :: newtype
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Type_dup_f08
+end interface  MPI_Type_dup
+
+interface  MPI_Type_free
+    subroutine MPI_Type_free_f08(datatype, ierror)
+        use :: mpi_f08_types, only : MPI_Datatype
+        implicit none
+        type(MPI_Datatype), intent(inout) :: datatype
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Type_free_f08
+end interface  MPI_Type_free
+
+interface  MPI_Type_get_contents
+    subroutine MPI_Type_get_contents_f08(datatype, max_integers, max_addresses, max_datatypes, &
+                                          array_of_integers, array_of_addresses, array_of_datatypes, &
+                                          ierror)
+        use :: mpi_f08_types, only : MPI_Datatype
+        use :: mpi_f08_constants, only : MPI_ADDRESS_KinD
+        implicit none
+        type(MPI_Datatype), intent(in) :: datatype
+        integer, intent(in) :: max_integers, max_addresses, max_datatypes
+        integer, intent(out) :: array_of_integers(max_integers)
+        integer(MPI_ADDRESS_KinD), intent(out) :: array_of_addresses(max_addresses)
+        type(MPI_Datatype), intent(out) :: array_of_datatypes(max_datatypes)
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Type_get_contents_f08
+end interface  MPI_Type_get_contents
+
+interface  MPI_Type_get_envelope
+    subroutine MPI_Type_get_envelope_f08(datatype, num_integers, num_addresses, num_datatypes, &
+                                          combiner, ierror)
+        use :: mpi_f08_types, only : MPI_Datatype
+        implicit none
+        type(MPI_Datatype), intent(in) :: datatype
+        integer, intent(out) :: num_integers, num_addresses, num_datatypes, combiner
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Type_get_envelope_f08
+end interface  MPI_Type_get_envelope
+
+interface  MPI_Type_get_extent
+    subroutine MPI_Type_get_extent_f08(datatype, lb, extent, ierror)
+        use :: mpi_f08_types, only : MPI_Datatype
+        use :: mpi_f08_constants, only : MPI_ADDRESS_KinD
+        implicit none
+        type(MPI_Datatype), intent(in) :: datatype
+        integer(MPI_ADDRESS_KinD), intent(out) :: lb, extent
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Type_get_extent_f08
+end interface  MPI_Type_get_extent
+
+interface  MPI_Type_get_extent_x
+    subroutine MPI_Type_get_extent_x_f08(datatype, lb, extent, ierror)
+        use :: mpi_f08_types, only : MPI_Datatype
+        use :: mpi_f08_constants, only : MPI_ADDRESS_KinD
+        use :: mpi_f08_constants, only : MPI_COUNT_KinD
+        implicit none
+        type(MPI_Datatype), intent(in) :: datatype
+        integer(MPI_COUNT_KinD), intent(out) :: lb, extent
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Type_get_extent_x_f08
+end interface  MPI_Type_get_extent_x
+
+interface  MPI_Type_get_true_extent
+    subroutine MPI_Type_get_true_extent_f08(datatype, true_lb, true_extent, ierror)
+        use :: mpi_f08_types, only : MPI_Datatype
+        use :: mpi_f08_constants, only : MPI_ADDRESS_KinD
+        implicit none
+        type(MPI_Datatype), intent(in) :: datatype
+        integer(MPI_ADDRESS_KinD), intent(out) :: true_lb, true_extent
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Type_get_true_extent_f08
+end interface  MPI_Type_get_true_extent
+
+interface  MPI_Type_get_true_extent_x
+    subroutine MPI_Type_get_true_extent_x_f08(datatype, true_lb, true_extent, ierror)
+        use :: mpi_f08_types, only : MPI_Datatype
+        use :: mpi_f08_constants, only : MPI_ADDRESS_KinD
+        use :: mpi_f08_constants, only : MPI_COUNT_KinD
+        implicit none
+        type(MPI_Datatype), intent(in) :: datatype
+        integer(MPI_COUNT_KinD), intent(out) :: true_lb, true_extent
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Type_get_true_extent_x_f08
+end interface  MPI_Type_get_true_extent_x
+
+interface  MPI_Type_indexed
+    subroutine MPI_Type_indexed_f08(count, array_of_blocklengths, &
+                                     array_of_displacements, oldtype, newtype, ierror)
+        use :: mpi_f08_types, only : MPI_Datatype
+        implicit none
+        integer, intent(in) :: count
+        integer, intent(in) :: array_of_blocklengths(count), array_of_displacements(count)
+        type(MPI_Datatype), intent(in) :: oldtype
+        type(MPI_Datatype), intent(out) :: newtype
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Type_indexed_f08
+end interface  MPI_Type_indexed
+
+interface  MPI_Type_size
+    subroutine MPI_Type_size_f08(datatype, size, ierror)
+        use :: mpi_f08_types, only : MPI_Datatype
+        implicit none
+        type(MPI_Datatype), intent(in) :: datatype
+        integer, intent(out) :: size
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Type_size_f08
+end interface  MPI_Type_size
+
+interface  MPI_Type_size_x
+    subroutine MPI_Type_size_x_f08(datatype, size, ierror)
+        use :: mpi_f08_types, only : MPI_Datatype
+        use :: mpi_f08_constants, only : MPI_COUNT_KinD
+        implicit none
+        type(MPI_Datatype), intent(in) :: datatype
+        integer(MPI_COUNT_KinD), intent(out) :: size
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Type_size_x_f08
+end interface  MPI_Type_size_x
+
+interface  MPI_Type_vector
+    subroutine MPI_Type_vector_f08(count, blocklength, stride, oldtype, newtype, ierror)
+        use :: mpi_f08_types, only : MPI_Datatype
+        implicit none
+        integer, intent(in) :: count, blocklength, stride
+        type(MPI_Datatype), intent(in) :: oldtype
+        type(MPI_Datatype), intent(out) :: newtype
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Type_vector_f08
+end interface  MPI_Type_vector
+
+interface  MPI_Unpack
+    subroutine MPI_Unpack_f08ts(inbuf, insize, position, outbuf, outcount, datatype, comm, &
+                               ierror)
+        use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm
+        implicit none
+        type(*), dimension(..), intent(in) :: inbuf
+        type(*), dimension(..) :: outbuf
+        integer, intent(in) :: insize, outcount
+        integer, intent(inout) :: position
+        type(MPI_Datatype), intent(in) :: datatype
+        type(MPI_Comm), intent(in) :: comm
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Unpack_f08ts
+end interface  MPI_Unpack
+
+interface  MPI_Unpack_external
+    subroutine MPI_Unpack_external_f08ts(datarep, inbuf, insize, position, outbuf, outcount, &
+                                        datatype, ierror)
+        use :: mpi_f08_types, only : MPI_Datatype
+        use :: mpi_f08_constants, only : MPI_ADDRESS_KinD
+        implicit none
+        CHARACTER(LEN=*), intent(in) :: datarep
+        type(*), dimension(..), intent(in) :: inbuf
+        type(*), dimension(..) :: outbuf
+        integer(MPI_ADDRESS_KinD), intent(in) :: insize
+        integer(MPI_ADDRESS_KinD), intent(inout) :: position
+        integer, intent(in) :: outcount
+        type(MPI_Datatype), intent(in) :: datatype
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Unpack_external_f08ts
+end interface  MPI_Unpack_external
+
+interface  MPI_Allgather
+    subroutine MPI_Allgather_f08ts(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, &
+                                  comm, ierror)
+        use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm
+        implicit none
+        type(*), dimension(..), intent(in) :: sendbuf
+        type(*), dimension(..) :: recvbuf
+        integer, intent(in) :: sendcount, recvcount
+        type(MPI_Datatype), intent(in) :: sendtype, recvtype
+        type(MPI_Comm), intent(in) :: comm
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Allgather_f08ts
+end interface  MPI_Allgather
+
+interface  MPI_Iallgather
+    subroutine MPI_Iallgather_f08ts(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, &
+                                  comm, request, ierror)
+        use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm, MPI_Request
+        implicit none
+        type(*), dimension(..), intent(in) :: sendbuf
+        type(*), dimension(..) :: recvbuf
+        integer, intent(in) :: sendcount, recvcount
+        type(MPI_Datatype), intent(in) :: sendtype, recvtype
+        type(MPI_Comm), intent(in) :: comm
+        type(MPI_Request), intent(out) :: request
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Iallgather_f08ts
+end interface  MPI_Iallgather
+
+interface  MPI_Allgatherv
+    subroutine MPI_Allgatherv_f08ts(sendbuf, sendcount, sendtype, recvbuf, recvcounts, displs, &
+                                   recvtype, comm, ierror)
+        use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm
+        implicit none
+        type(*), dimension(..), intent(in) :: sendbuf
+        type(*), dimension(..) :: recvbuf
+        integer, intent(in) :: sendcount
+        integer, intent(in) :: recvcounts(*), displs(*)
+        type(MPI_Datatype), intent(in) :: sendtype, recvtype
+        type(MPI_Comm), intent(in) :: comm
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Allgatherv_f08ts
+end interface  MPI_Allgatherv
+
+interface  MPI_Iallgatherv
+    subroutine MPI_Iallgatherv_f08ts(sendbuf, sendcount, sendtype, recvbuf, recvcounts, displs, &
+                                   recvtype, comm, request, ierror)
+        use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm, MPI_Request
+        implicit none
+        type(*), dimension(..), intent(in) :: sendbuf
+        type(*), dimension(..) :: recvbuf
+        integer, intent(in) :: sendcount
+        integer, intent(in) :: recvcounts(*), displs(*)
+        type(MPI_Datatype), intent(in) :: sendtype, recvtype
+        type(MPI_Comm), intent(in) :: comm
+        type(MPI_Request), intent(out) :: request
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Iallgatherv_f08ts
+end interface  MPI_Iallgatherv
+
+interface  MPI_Allreduce
+    subroutine MPI_Allreduce_f08ts(sendbuf, recvbuf, count, datatype, op, comm, ierror)
+        use :: mpi_f08_types, only : MPI_Datatype, MPI_Op, MPI_Comm
+        implicit none
+        type(*), dimension(..), intent(in) :: sendbuf
+        type(*), dimension(..) :: recvbuf
+        integer, intent(in) :: count
+        type(MPI_Datatype), intent(in) :: datatype
+        type(MPI_Op), intent(in) :: op
+        type(MPI_Comm), intent(in) :: comm
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Allreduce_f08ts
+end interface  MPI_Allreduce
+
+interface  MPI_Iallreduce
+    subroutine MPI_Iallreduce_f08ts(sendbuf, recvbuf, count, datatype, op, comm, request, ierror)
+        use :: mpi_f08_types, only : MPI_Datatype, MPI_Op, MPI_Comm, MPI_Request
+        implicit none
+        type(*), dimension(..), intent(in) :: sendbuf
+        type(*), dimension(..) :: recvbuf
+        integer, intent(in) :: count
+        type(MPI_Datatype), intent(in) :: datatype
+        type(MPI_Op), intent(in) :: op
+        type(MPI_Comm), intent(in) :: comm
+        type(MPI_Request), intent(out) :: request
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Iallreduce_f08ts
+end interface  MPI_Iallreduce
+
+interface  MPI_Alltoall
+    subroutine MPI_Alltoall_f08ts(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, &
+                                 comm, ierror)
+        use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm
+        implicit none
+        type(*), dimension(..), intent(in) :: sendbuf
+        type(*), dimension(..) :: recvbuf
+        integer, intent(in) :: sendcount, recvcount
+        type(MPI_Datatype), intent(in) :: sendtype, recvtype
+        type(MPI_Comm), intent(in) :: comm
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Alltoall_f08ts
+end interface  MPI_Alltoall
+
+interface  MPI_Ialltoall
+    subroutine MPI_Ialltoall_f08ts(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, &
+                                 comm, request, ierror)
+        use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm, MPI_Request
+        implicit none
+        type(*), dimension(..), intent(in) :: sendbuf
+        type(*), dimension(..) :: recvbuf
+        integer, intent(in) :: sendcount, recvcount
+        type(MPI_Datatype), intent(in) :: sendtype, recvtype
+        type(MPI_Comm), intent(in) :: comm
+        type(MPI_Request), intent(out) :: request
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Ialltoall_f08ts
+end interface  MPI_Ialltoall
+
+interface  MPI_Alltoallv
+    subroutine MPI_Alltoallv_f08ts(sendbuf, sendcounts, sdispls, sendtype, recvbuf, recvcounts, &
+                                  rdispls, recvtype, comm, ierror)
+        use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm
+        implicit none
+        type(*), dimension(..), intent(in) :: sendbuf
+        type(*), dimension(..) :: recvbuf
+        integer, intent(in) :: sendcounts(*), sdispls(*), recvcounts(*), rdispls(*)
+        type(MPI_Datatype), intent(in) :: sendtype, recvtype
+        type(MPI_Comm), intent(in) :: comm
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Alltoallv_f08ts
+end interface  MPI_Alltoallv
+
+interface  MPI_Ialltoallv
+    subroutine MPI_Ialltoallv_f08ts(sendbuf, sendcounts, sdispls, sendtype, recvbuf, recvcounts, &
+                                  rdispls, recvtype, comm, request, ierror)
+        use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm, MPI_Request
+        implicit none
+        type(*), dimension(..), intent(in) :: sendbuf
+        type(*), dimension(..) :: recvbuf
+        integer, intent(in) :: sendcounts(*), sdispls(*), recvcounts(*), rdispls(*)
+        type(MPI_Datatype), intent(in) :: sendtype, recvtype
+        type(MPI_Comm), intent(in) :: comm
+        type(MPI_Request), intent(in) :: request
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Ialltoallv_f08ts
+end interface  MPI_Ialltoallv
+
+interface  MPI_Alltoallw
+    subroutine MPI_Alltoallw_f08ts(sendbuf, sendcounts, sdispls, sendtypes, recvbuf, recvcounts, &
+                                  rdispls, recvtypes, comm, ierror)
+        use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm
+        implicit none
+        type(*), dimension(..), intent(in) :: sendbuf
+        type(*), dimension(..) :: recvbuf
+        integer, intent(in) :: sendcounts(*), sdispls(*), recvcounts(*), rdispls(*)
+        type(MPI_Datatype), intent(in) :: sendtypes(*), recvtypes(*)
+        type(MPI_Comm), intent(in) :: comm
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Alltoallw_f08ts
+end interface  MPI_Alltoallw
+
+interface  MPI_Ialltoallw
+    subroutine MPI_Ialltoallw_f08ts(sendbuf, sendcounts, sdispls, sendtypes, recvbuf, recvcounts, &
+                                  rdispls, recvtypes, comm, request, ierror)
+        use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm, MPI_Request
+        implicit none
+        type(*), dimension(..), intent(in) :: sendbuf
+        type(*), dimension(..) :: recvbuf
+        integer, intent(in) :: sendcounts(*), sdispls(*), recvcounts(*), rdispls(*)
+        type(MPI_Datatype), intent(in) :: sendtypes(*), recvtypes(*)
+        type(MPI_Comm), intent(in) :: comm
+        type(MPI_Request), intent(in) :: request
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Ialltoallw_f08ts
+end interface  MPI_Ialltoallw
+
+interface  MPI_Barrier
+    subroutine MPI_Barrier_f08(comm, ierror)
+        use :: mpi_f08_types, only : MPI_Comm
+        implicit none
+        type(MPI_Comm), intent(in) :: comm
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Barrier_f08
+end interface  MPI_Barrier
+
+interface  MPI_Ibarrier
+    subroutine MPI_Ibarrier_f08(comm, request, ierror)
+        use :: mpi_f08_types, only : MPI_Comm, MPI_Request
+        implicit none
+        type(MPI_Comm), intent(in) :: comm
+        type(MPI_Request), intent(out) :: request
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Ibarrier_f08
+end interface  MPI_Ibarrier
+
+interface  MPI_Bcast
+    subroutine MPI_Bcast_f08ts(buffer, count, datatype, root, comm, ierror)
+        use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm
+        implicit none
+        type(*), dimension(..) :: buffer
+        integer, intent(in) :: count, root
+        type(MPI_Datatype), intent(in) :: datatype
+        type(MPI_Comm), intent(in) :: comm
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Bcast_f08ts
+end interface  MPI_Bcast
+
+interface  MPI_Ibcast
+    subroutine MPI_Ibcast_f08ts(buffer, count, datatype, root, comm, request, ierror)
+        use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm, MPI_Request
+        implicit none
+        type(*), dimension(..) :: buffer
+        integer, intent(in) :: count, root
+        type(MPI_Datatype), intent(in) :: datatype
+        type(MPI_Comm), intent(in) :: comm
+        type(MPI_Request), intent(out) :: request
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Ibcast_f08ts
+end interface  MPI_Ibcast
+
+interface  MPI_Exscan
+    subroutine MPI_Exscan_f08ts(sendbuf, recvbuf, count, datatype, op, comm, ierror)
+        use :: mpi_f08_types, only : MPI_Datatype, MPI_Op, MPI_Comm
+        implicit none
+        type(*), dimension(..), intent(in) :: sendbuf
+        type(*), dimension(..) :: recvbuf
+        integer, intent(in) :: count
+        type(MPI_Datatype), intent(in) :: datatype
+        type(MPI_Op), intent(in) :: op
+        type(MPI_Comm), intent(in) :: comm
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Exscan_f08ts
+end interface  MPI_Exscan
+
+interface  MPI_Iexscan
+    subroutine MPI_Iexscan_f08ts(sendbuf, recvbuf, count, datatype, op, comm, request, ierror)
+        use :: mpi_f08_types, only : MPI_Datatype, MPI_Op, MPI_Comm, MPI_Request
+        implicit none
+        type(*), dimension(..), intent(in) :: sendbuf
+        type(*), dimension(..) :: recvbuf
+        integer, intent(in) :: count
+        type(MPI_Datatype), intent(in) :: datatype
+        type(MPI_Op), intent(in) :: op
+        type(MPI_Comm), intent(in) :: comm
+        type(MPI_Request), intent(out) :: request
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Iexscan_f08ts
+end interface  MPI_Iexscan
+
+interface  MPI_Gather
+    subroutine MPI_Gather_f08ts(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, &
+                               root, comm, ierror)
+        use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm
+        implicit none
+        type(*), dimension(..), intent(in) :: sendbuf
+        type(*), dimension(..) :: recvbuf
+        integer, intent(in) :: sendcount, recvcount, root
+        type(MPI_Datatype), intent(in) :: sendtype, recvtype
+        type(MPI_Comm), intent(in) :: comm
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Gather_f08ts
+end interface  MPI_Gather
+
+interface  MPI_Igather
+    subroutine MPI_Igather_f08ts(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, &
+                               root, comm, request, ierror)
+        use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm, MPI_Request
+        implicit none
+        type(*), dimension(..), intent(in) :: sendbuf
+        type(*), dimension(..) :: recvbuf
+        integer, intent(in) :: sendcount, recvcount, root
+        type(MPI_Datatype), intent(in) :: sendtype, recvtype
+        type(MPI_Comm), intent(in) :: comm
+        type(MPI_Request), intent(out) :: request
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Igather_f08ts
+end interface  MPI_Igather
+
+interface  MPI_Gatherv
+    subroutine MPI_Gatherv_f08ts(sendbuf, sendcount, sendtype, recvbuf, recvcounts, displs, &
+                                recvtype, root, comm, ierror)
+        use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm
+        implicit none
+        type(*), dimension(..), intent(in) :: sendbuf
+        type(*), dimension(..) :: recvbuf
+        integer, intent(in) :: sendcount, root
+        integer, intent(in) :: recvcounts(*), displs(*)
+        type(MPI_Datatype), intent(in) :: sendtype, recvtype
+        type(MPI_Comm), intent(in) :: comm
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Gatherv_f08ts
+end interface  MPI_Gatherv
+
+interface  MPI_Igatherv
+    subroutine MPI_Igatherv_f08ts(sendbuf, sendcount, sendtype, recvbuf, recvcounts, displs, &
+                                recvtype, root, comm, request, ierror)
+        use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm, MPI_Request
+        implicit none
+        type(*), dimension(..), intent(in) :: sendbuf
+        type(*), dimension(..) :: recvbuf
+        integer, intent(in) :: sendcount, root
+        integer, intent(in) :: recvcounts(*), displs(*)
+        type(MPI_Datatype), intent(in) :: sendtype, recvtype
+        type(MPI_Comm), intent(in) :: comm
+        type(MPI_Request), intent(out) :: request
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Igatherv_f08ts
+end interface  MPI_Igatherv
+
+interface  MPI_Op_commutative
+    subroutine MPI_Op_commutative_f08(op, commute, ierror)
+        use :: mpi_f08_types, only : MPI_Op
+        implicit none
+        type(MPI_Op), intent(in) :: op
+        LOGICAL, intent(out) :: commute
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Op_commutative_f08
+end interface  MPI_Op_commutative
+
+interface  MPI_Op_create
+    subroutine MPI_Op_create_f08(user_fn, commute, op, ierror)
+        use :: mpi_f08_types, only : MPI_Op
+        use :: mpi_f08_callbacks, only : MPI_User_function
+        implicit none
+        PROCEDURE(MPI_User_function) :: user_fn
+        LOGICAL, intent(in) :: commute
+        type(MPI_Op), intent(out) :: op
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Op_create_f08
+end interface  MPI_Op_create
+
+interface  MPI_Op_free
+    subroutine MPI_Op_free_f08(op, ierror)
+        use :: mpi_f08_types, only : MPI_Op
+        implicit none
+        type(MPI_Op), intent(inout) :: op
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Op_free_f08
+end interface  MPI_Op_free
+
+interface  MPI_Reduce
+    subroutine MPI_Reduce_f08ts(sendbuf, recvbuf, count, datatype, op, root, comm, ierror)
+        use :: mpi_f08_types, only : MPI_Datatype, MPI_Op, MPI_Comm
+        implicit none
+        type(*), dimension(..), intent(in) :: sendbuf
+        type(*), dimension(..) :: recvbuf
+        integer, intent(in) :: count, root
+        type(MPI_Datatype), intent(in) :: datatype
+        type(MPI_Op), intent(in) :: op
+        type(MPI_Comm), intent(in) :: comm
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Reduce_f08ts
+end interface  MPI_Reduce
+
+interface  MPI_Ireduce
+    subroutine MPI_Ireduce_f08ts(sendbuf, recvbuf, count, datatype, op, root, comm, request, ierror)
+        use :: mpi_f08_types, only : MPI_Datatype, MPI_Op, MPI_Comm, MPI_Request
+        implicit none
+        type(*), dimension(..), intent(in) :: sendbuf
+        type(*), dimension(..) :: recvbuf
+        integer, intent(in) :: count, root
+        type(MPI_Datatype), intent(in) :: datatype
+        type(MPI_Op), intent(in) :: op
+        type(MPI_Comm), intent(in) :: comm
+        type(MPI_Request), intent(out) :: request
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Ireduce_f08ts
+end interface  MPI_Ireduce
+
+interface  MPI_Reduce_local
+    subroutine MPI_Reduce_local_f08ts(inbuf, inoutbuf, count, datatype, op, ierror)
+        use :: mpi_f08_types, only : MPI_Datatype, MPI_Op
+        implicit none
+        type(*), dimension(..), intent(in) :: inbuf
+        type(*), dimension(..) :: inoutbuf
+        integer, intent(in) :: count
+        type(MPI_Datatype), intent(in) :: datatype
+        type(MPI_Op), intent(in) :: op
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Reduce_local_f08ts
+end interface  MPI_Reduce_local
+
+interface  MPI_Reduce_scatter
+    subroutine MPI_Reduce_scatter_f08ts(sendbuf, recvbuf, recvcounts, datatype, op, comm, &
+                                       ierror)
+        use :: mpi_f08_types, only : MPI_Datatype, MPI_Op, MPI_Comm
+        implicit none
+        type(*), dimension(..), intent(in) :: sendbuf
+        type(*), dimension(..) :: recvbuf
+        integer, intent(in) :: recvcounts(*)
+        type(MPI_Datatype), intent(in) :: datatype
+        type(MPI_Op), intent(in) :: op
+        type(MPI_Comm), intent(in) :: comm
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Reduce_scatter_f08ts
+end interface  MPI_Reduce_scatter
+
+interface  MPI_Ireduce_scatter
+    subroutine MPI_Ireduce_scatter_f08ts(sendbuf, recvbuf, recvcounts, datatype, op, comm, &
+                                       request, ierror)
+        use :: mpi_f08_types, only : MPI_Datatype, MPI_Op, MPI_Comm, MPI_Request
+        implicit none
+        type(*), dimension(..), intent(in) :: sendbuf
+        type(*), dimension(..) :: recvbuf
+        integer, intent(in) :: recvcounts(*)
+        type(MPI_Datatype), intent(in) :: datatype
+        type(MPI_Op), intent(in) :: op
+        type(MPI_Comm), intent(in) :: comm
+        type(MPI_Request), intent(out) :: request
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Ireduce_scatter_f08ts
+end interface  MPI_Ireduce_scatter
+
+interface  MPI_Reduce_scatter_block
+    subroutine MPI_Reduce_scatter_block_f08ts(sendbuf, recvbuf, recvcount, datatype, op, comm, &
+                                             ierror)
+        use :: mpi_f08_types, only : MPI_Datatype, MPI_Op, MPI_Comm
+        implicit none
+        type(*), dimension(..), intent(in) :: sendbuf
+        type(*), dimension(..) :: recvbuf
+        integer, intent(in) :: recvcount
+        type(MPI_Datatype), intent(in) :: datatype
+        type(MPI_Op), intent(in) :: op
+        type(MPI_Comm), intent(in) :: comm
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Reduce_scatter_block_f08ts
+end interface  MPI_Reduce_scatter_block
+
+interface  MPI_Ireduce_scatter_block
+    subroutine MPI_Ireduce_scatter_block_f08ts(sendbuf, recvbuf, recvcount, datatype, op, comm, &
+                                             request, ierror)
+        use :: mpi_f08_types, only : MPI_Datatype, MPI_Op, MPI_Comm, MPI_Request
+        implicit none
+        type(*), dimension(..), intent(in) :: sendbuf
+        type(*), dimension(..) :: recvbuf
+        integer, intent(in) :: recvcount
+        type(MPI_Datatype), intent(in) :: datatype
+        type(MPI_Op), intent(in) :: op
+        type(MPI_Comm), intent(in) :: comm
+        type(MPI_Request), intent(out) :: request
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Ireduce_scatter_block_f08ts
+end interface  MPI_Ireduce_scatter_block
+
+interface  MPI_Scan
+    subroutine MPI_Scan_f08ts(sendbuf, recvbuf, count, datatype, op, comm, ierror)
+        use :: mpi_f08_types, only : MPI_Datatype, MPI_Op, MPI_Comm
+        implicit none
+        type(*), dimension(..), intent(in) :: sendbuf
+        type(*), dimension(..) :: recvbuf
+        integer, intent(in) :: count
+        type(MPI_Datatype), intent(in) :: datatype
+        type(MPI_Op), intent(in) :: op
+        type(MPI_Comm), intent(in) :: comm
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Scan_f08ts
+end interface  MPI_Scan
+
+interface  MPI_Iscan
+    subroutine MPI_Iscan_f08ts(sendbuf, recvbuf, count, datatype, op, comm, request, ierror)
+        use :: mpi_f08_types, only : MPI_Datatype, MPI_Op, MPI_Comm, MPI_Request
+        implicit none
+        type(*), dimension(..), intent(in) :: sendbuf
+        type(*), dimension(..) :: recvbuf
+        integer, intent(in) :: count
+        type(MPI_Datatype), intent(in) :: datatype
+        type(MPI_Op), intent(in) :: op
+        type(MPI_Comm), intent(in) :: comm
+        type(MPI_Request), intent(out) :: request
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Iscan_f08ts
+end interface  MPI_Iscan
+
+interface  MPI_Scatter
+    subroutine MPI_Scatter_f08ts(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, &
+                                root, comm, ierror)
+        use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm
+        implicit none
+        type(*), dimension(..), intent(in) :: sendbuf
+        type(*), dimension(..) :: recvbuf
+        integer, intent(in) :: sendcount, recvcount, root
+        type(MPI_Datatype), intent(in) :: sendtype, recvtype
+        type(MPI_Comm), intent(in) :: comm
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Scatter_f08ts
+end interface  MPI_Scatter
+
+interface  MPI_Iscatter
+    subroutine MPI_Iscatter_f08ts(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, &
+                                root, comm, request, ierror)
+        use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm, MPI_Request
+        implicit none
+        type(*), dimension(..), intent(in) :: sendbuf
+        type(*), dimension(..) :: recvbuf
+        integer, intent(in) :: sendcount, recvcount, root
+        type(MPI_Datatype), intent(in) :: sendtype, recvtype
+        type(MPI_Comm), intent(in) :: comm
+        type(MPI_Request), intent(out) :: request
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Iscatter_f08ts
+end interface  MPI_Iscatter
+
+interface  MPI_Scatterv
+    subroutine MPI_Scatterv_f08ts(sendbuf, sendcounts, displs, sendtype, recvbuf, recvcount, &
+                                 recvtype, root, comm, ierror)
+        use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm
+        implicit none
+        type(*), dimension(..), intent(in) :: sendbuf
+        type(*), dimension(..) :: recvbuf
+        integer, intent(in) :: recvcount, root
+        integer, intent(in) :: sendcounts(*), displs(*)
+        type(MPI_Datatype), intent(in) :: sendtype, recvtype
+        type(MPI_Comm), intent(in) :: comm
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Scatterv_f08ts
+end interface  MPI_Scatterv
+
+interface  MPI_Iscatterv
+    subroutine MPI_Iscatterv_f08ts(sendbuf, sendcounts, displs, sendtype, recvbuf, recvcount, &
+                                 recvtype, root, comm, request, ierror)
+        use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm, MPI_Request
+        implicit none
+        type(*), dimension(..), intent(in) :: sendbuf
+        type(*), dimension(..) :: recvbuf
+        integer, intent(in) :: recvcount, root
+        integer, intent(in) :: sendcounts(*), displs(*)
+        type(MPI_Datatype), intent(in) :: sendtype, recvtype
+        type(MPI_Comm), intent(in) :: comm
+        type(MPI_Request), intent(out) :: request
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Iscatterv_f08ts
+end interface  MPI_Iscatterv
+
+interface  MPI_Comm_compare
+    subroutine MPI_Comm_compare_f08(comm1,comm2,result, ierror)
+        use :: mpi_f08_types, only : MPI_Comm
+        implicit none
+        type(MPI_Comm), intent(in) :: comm1
+        type(MPI_Comm), intent(in) :: comm2
+        integer, intent(out) :: result
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Comm_compare_f08
+end interface  MPI_Comm_compare
+
+interface  MPI_Comm_create
+    subroutine MPI_Comm_create_f08(comm, group, newcomm, ierror)
+        use :: mpi_f08_types, only : MPI_Comm, MPI_Group
+        implicit none
+        type(MPI_Comm), intent(in) :: comm
+        type(MPI_Group), intent(in) :: group
+        type(MPI_Comm), intent(out) :: newcomm
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Comm_create_f08
+end interface  MPI_Comm_create
+
+interface  MPI_Comm_create_group
+    subroutine MPI_Comm_create_group_f08(comm, group, tag, newcomm, ierror)
+        use :: mpi_f08_types, only : MPI_Comm, MPI_Group
+        implicit none
+        type(MPI_Comm), intent(in) :: comm
+        type(MPI_Group), intent(in) :: group
+        integer, intent(in) :: tag
+        type(MPI_Comm), intent(out) :: newcomm
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Comm_create_group_f08
+end interface  MPI_Comm_create_group
+
+interface  MPI_Comm_create_keyval
+    subroutine MPI_Comm_create_keyval_f08(comm_copy_attr_fn, comm_delete_attr_fn, comm_keyval, &
+                                           extra_state, ierror)
+        use :: mpi_f08_constants, only : MPI_ADDRESS_KinD
+        use :: mpi_f08_callbacks, only : MPI_Comm_copy_attr_function
+        use :: mpi_f08_callbacks, only : MPI_Comm_delete_attr_function
+        implicit none
+        PROCEDURE(MPI_Comm_copy_attr_function) :: comm_copy_attr_fn
+        PROCEDURE(MPI_Comm_delete_attr_function) :: comm_delete_attr_fn
+        integer, intent(out) :: comm_keyval
+        integer(MPI_ADDRESS_KinD), intent(in) :: extra_state
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Comm_create_keyval_f08
+end interface  MPI_Comm_create_keyval
+
+interface  MPI_Comm_delete_attr
+    subroutine MPI_Comm_delete_attr_f08(comm, comm_keyval, ierror)
+        use :: mpi_f08_types, only : MPI_Comm
+        implicit none
+        type(MPI_Comm), intent(in) :: comm
+        integer, intent(in) :: comm_keyval
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Comm_delete_attr_f08
+end interface  MPI_Comm_delete_attr
+
+interface  MPI_Comm_dup
+    subroutine MPI_Comm_dup_f08(comm, newcomm, ierror)
+        use :: mpi_f08_types, only : MPI_Comm
+        implicit none
+        type(MPI_Comm), intent(in) :: comm
+        type(MPI_Comm), intent(out) :: newcomm
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Comm_dup_f08
+end interface  MPI_Comm_dup
+
+interface  MPI_Comm_dup_with_info
+    subroutine MPI_Comm_dup_with_info_f08(comm, info, newcomm, ierror)
+        use :: mpi_f08_types, only : MPI_Comm, MPI_Info
+        implicit none
+        type(MPI_Comm), intent(in) :: comm
+        type(MPI_Info), intent(in) :: info
+        type(MPI_Comm), intent(out) :: newcomm
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Comm_dup_with_info_f08
+end interface  MPI_Comm_dup_with_info
+
+interface  MPI_Comm_idup
+    subroutine MPI_Comm_idup_f08(comm, newcomm, request, ierror)
+        use :: mpi_f08_types, only : MPI_Comm, MPI_Request
+        implicit none
+        type(MPI_Comm), intent(in) :: comm
+        type(MPI_Comm), intent(out) :: newcomm
+        type(MPI_Request), intent(out) :: request
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Comm_idup_f08
+end interface  MPI_Comm_idup
+
+interface  MPI_Comm_free
+    subroutine MPI_Comm_free_f08(comm, ierror)
+        use :: mpi_f08_types, only : MPI_Comm
+        implicit none
+        type(MPI_Comm), intent(inout) :: comm
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Comm_free_f08
+end interface  MPI_Comm_free
+
+interface  MPI_Comm_free_keyval
+    subroutine MPI_Comm_free_keyval_f08(comm_keyval, ierror)
+        implicit none
+        integer, intent(inout) :: comm_keyval
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Comm_free_keyval_f08
+end interface  MPI_Comm_free_keyval
+
+interface  MPI_Comm_get_attr
+    subroutine MPI_Comm_get_attr_f08(comm, comm_keyval, attribute_val, flag, ierror)
+        use :: mpi_f08_types, only : MPI_Comm
+        use :: mpi_f08_constants, only : MPI_ADDRESS_KinD
+        implicit none
+        type(MPI_Comm), intent(in) :: comm
+        integer, intent(in) :: comm_keyval
+        integer(MPI_ADDRESS_KinD), intent(out) :: attribute_val
+        LOGICAL, intent(out) :: flag
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Comm_get_attr_f08
+end interface  MPI_Comm_get_attr
+
+interface  MPI_Comm_get_name
+    subroutine MPI_Comm_get_name_f08(comm, comm_name, resultlen, ierror)
+        use :: mpi_f08_types, only : MPI_Comm
+        use :: mpi_f08_constants, only : MPI_MAX_OBJECT_NAME
+        implicit none
+        type(MPI_Comm), intent(in) :: comm
+        CHARACTER(LEN=MPI_MAX_OBJECT_NAME), intent(out) :: comm_name
+        integer, intent(out) :: resultlen
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Comm_get_name_f08
+end interface  MPI_Comm_get_name
+
+interface  MPI_Comm_group
+    subroutine MPI_Comm_group_f08(comm, group, ierror)
+        use :: mpi_f08_types, only : MPI_Comm, MPI_Group
+        implicit none
+        type(MPI_Comm), intent(in) :: comm
+        type(MPI_Group), intent(out) :: group
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Comm_group_f08
+end interface  MPI_Comm_group
+
+interface  MPI_Comm_rank
+    subroutine MPI_Comm_rank_f08(comm, rank, ierror)
+        use :: mpi_f08_types, only : MPI_Comm
+        implicit none
+        type(MPI_Comm), intent(in) :: comm
+        integer, intent(out) :: rank
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Comm_rank_f08
+end interface  MPI_Comm_rank
+
+interface  MPI_Comm_remote_group
+    subroutine MPI_Comm_remote_group_f08(comm, group, ierror)
+        use :: mpi_f08_types, only : MPI_Comm, MPI_Group
+        implicit none
+        type(MPI_Comm), intent(in) :: comm
+        type(MPI_Group), intent(out) :: group
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Comm_remote_group_f08
+end interface  MPI_Comm_remote_group
+
+interface  MPI_Comm_remote_size
+    subroutine MPI_Comm_remote_size_f08(comm, size, ierror)
+        use :: mpi_f08_types, only : MPI_Comm
+        implicit none
+        type(MPI_Comm), intent(in) :: comm
+        integer, intent(out) :: size
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Comm_remote_size_f08
+end interface  MPI_Comm_remote_size
+
+interface  MPI_Comm_set_attr
+    subroutine MPI_Comm_set_attr_f08(comm, comm_keyval, attribute_val, ierror)
+        use :: mpi_f08_types, only : MPI_Comm
+        use :: mpi_f08_constants, only : MPI_ADDRESS_KinD
+        implicit none
+        type(MPI_Comm), intent(in) :: comm
+        integer, intent(in) :: comm_keyval
+        integer(MPI_ADDRESS_KinD), intent(in) :: attribute_val
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Comm_set_attr_f08
+end interface  MPI_Comm_set_attr
+
+interface  MPI_Comm_set_name
+    subroutine MPI_Comm_set_name_f08(comm, comm_name, ierror)
+        use :: mpi_f08_types, only : MPI_Comm
+        implicit none
+        type(MPI_Comm), intent(in) :: comm
+        CHARACTER(LEN=*), intent(in) :: comm_name
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Comm_set_name_f08
+end interface  MPI_Comm_set_name
+
+interface  MPI_Comm_size
+    subroutine MPI_Comm_size_f08(comm, size, ierror)
+        use :: mpi_f08_types, only : MPI_Comm
+        implicit none
+        type(MPI_Comm), intent(in) :: comm
+        integer, intent(out) :: size
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Comm_size_f08
+end interface  MPI_Comm_size
+
+interface  MPI_Comm_split
+    subroutine MPI_Comm_split_f08(comm, color, key, newcomm, ierror)
+        use :: mpi_f08_types, only : MPI_Comm
+        implicit none
+        type(MPI_Comm), intent(in) :: comm
+        integer, intent(in) :: color, key
+        type(MPI_Comm), intent(out) :: newcomm
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Comm_split_f08
+end interface  MPI_Comm_split
+
+interface  MPI_Comm_test_inter
+    subroutine MPI_Comm_test_inter_f08(comm, flag, ierror)
+        use :: mpi_f08_types, only : MPI_Comm
+        implicit none
+        type(MPI_Comm), intent(in) :: comm
+        LOGICAL, intent(out) :: flag
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Comm_test_inter_f08
+end interface  MPI_Comm_test_inter
+
+interface  MPI_Group_compare
+    subroutine MPI_Group_compare_f08(group1,group2,result, ierror)
+        use :: mpi_f08_types, only : MPI_Group
+        implicit none
+        type(MPI_Group), intent(in) :: group1, group2
+        integer, intent(out) :: result
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Group_compare_f08
+end interface  MPI_Group_compare
+
+interface  MPI_Group_difference
+    subroutine MPI_Group_difference_f08(group1,group2,newgroup, ierror)
+        use :: mpi_f08_types, only : MPI_Group
+        implicit none
+        type(MPI_Group), intent(in) :: group1, group2
+        type(MPI_Group), intent(out) :: newgroup
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Group_difference_f08
+end interface  MPI_Group_difference
+
+interface  MPI_Group_excl
+    subroutine MPI_Group_excl_f08(group, n,ranks, newgroup, ierror)
+        use :: mpi_f08_types, only : MPI_Group
+        implicit none
+        type(MPI_Group), intent(in) :: group
+        integer, intent(in) :: n, ranks(n)
+        type(MPI_Group), intent(out) :: newgroup
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Group_excl_f08
+end interface  MPI_Group_excl
+
+interface  MPI_Group_free
+    subroutine MPI_Group_free_f08(group, ierror)
+        use :: mpi_f08_types, only : MPI_Group
+        implicit none
+        type(MPI_Group), intent(inout) :: group
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Group_free_f08
+end interface  MPI_Group_free
+
+interface  MPI_Group_incl
+    subroutine MPI_Group_incl_f08(group, n,ranks, newgroup, ierror)
+        use :: mpi_f08_types, only : MPI_Group
+        implicit none
+        integer, intent(in) :: n, ranks(n)
+        type(MPI_Group), intent(in) :: group
+        type(MPI_Group), intent(out) :: newgroup
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Group_incl_f08
+end interface  MPI_Group_incl
+
+interface  MPI_Group_intersection
+    subroutine MPI_Group_intersection_f08(group1,group2,newgroup, ierror)
+        use :: mpi_f08_types, only : MPI_Group
+        implicit none
+        type(MPI_Group), intent(in) :: group1, group2
+        type(MPI_Group), intent(out) :: newgroup
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Group_intersection_f08
+end interface  MPI_Group_intersection
+
+interface  MPI_Group_range_excl
+    subroutine MPI_Group_range_excl_f08(group, n,ranges, newgroup, ierror)
+        use :: mpi_f08_types, only : MPI_Group
+        implicit none
+        type(MPI_Group), intent(in) :: group
+        integer, intent(in) :: n, ranges(3,n)
+        type(MPI_Group), intent(out) :: newgroup
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Group_range_excl_f08
+end interface  MPI_Group_range_excl
+
+interface  MPI_Group_range_incl
+    subroutine MPI_Group_range_incl_f08(group, n,ranges, newgroup, ierror)
+        use :: mpi_f08_types, only : MPI_Group
+        implicit none
+        type(MPI_Group), intent(in) :: group
+        integer, intent(in) :: n, ranges(3,n)
+        type(MPI_Group), intent(out) :: newgroup
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Group_range_incl_f08
+end interface  MPI_Group_range_incl
+
+interface  MPI_Group_rank
+    subroutine MPI_Group_rank_f08(group, rank, ierror)
+        use :: mpi_f08_types, only : MPI_Group
+        implicit none
+        type(MPI_Group), intent(in) :: group
+        integer, intent(out) :: rank
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Group_rank_f08
+end interface  MPI_Group_rank
+
+interface  MPI_Group_size
+    subroutine MPI_Group_size_f08(group, size, ierror)
+        use :: mpi_f08_types, only : MPI_Group
+        implicit none
+        type(MPI_Group), intent(in) :: group
+        integer, intent(out) :: size
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Group_size_f08
+end interface  MPI_Group_size
+
+interface  MPI_Group_translate_ranks
+    subroutine MPI_Group_translate_ranks_f08(group1,n, ranks1,group2,ranks2,ierror)
+        use :: mpi_f08_types, only : MPI_Group
+        implicit none
+        type(MPI_Group), intent(in) :: group1, group2
+        integer, intent(in) :: n
+        integer, intent(in) :: ranks1(n)
+        integer, intent(out) :: ranks2(n)
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Group_translate_ranks_f08
+end interface  MPI_Group_translate_ranks
+
+interface  MPI_Group_union
+    subroutine MPI_Group_union_f08(group1,group2,newgroup, ierror)
+        use :: mpi_f08_types, only : MPI_Group
+        implicit none
+        type(MPI_Group), intent(in) :: group1, group2
+        type(MPI_Group), intent(out) :: newgroup
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Group_union_f08
+end interface  MPI_Group_union
+
+interface  MPI_Intercomm_create
+    subroutine MPI_Intercomm_create_f08(local_comm, local_leader, peer_comm, remote_leader, &
+                                         tag, newintercomm, ierror)
+        use :: mpi_f08_types, only : MPI_Comm
+        implicit none
+        type(MPI_Comm), intent(in) :: local_comm, peer_comm
+        integer, intent(in) :: local_leader, remote_leader, tag
+        type(MPI_Comm), intent(out) :: newintercomm
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Intercomm_create_f08
+end interface  MPI_Intercomm_create
+
+interface  MPI_Intercomm_merge
+    subroutine MPI_Intercomm_merge_f08(intercomm, high, newintracomm, ierror)
+        use :: mpi_f08_types, only : MPI_Comm
+        implicit none
+        type(MPI_Comm), intent(in) :: intercomm
+        LOGICAL, intent(in) :: high
+        type(MPI_Comm), intent(out) :: newintracomm
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Intercomm_merge_f08
+end interface  MPI_Intercomm_merge
+
+interface  MPI_Type_create_keyval
+    subroutine MPI_Type_create_keyval_f08(type_copy_attr_fn, type_delete_attr_fn, type_keyval, &
+                                           extra_state, ierror)
+        use :: mpi_f08_constants, only : MPI_ADDRESS_KinD
+        use :: mpi_f08_callbacks, only : MPI_Type_copy_attr_function
+        use :: mpi_f08_callbacks, only : MPI_Type_delete_attr_function
+        implicit none
+        PROCEDURE(MPI_Type_copy_attr_function) :: type_copy_attr_fn
+        PROCEDURE(MPI_Type_delete_attr_function) :: type_delete_attr_fn
+        integer, intent(out) :: type_keyval
+        integer(MPI_ADDRESS_KinD), intent(in) :: extra_state
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Type_create_keyval_f08
+end interface  MPI_Type_create_keyval
+
+interface  MPI_Type_delete_attr
+    subroutine MPI_Type_delete_attr_f08(datatype, type_keyval, ierror)
+        use :: mpi_f08_types, only : MPI_Datatype
+        implicit none
+        type(MPI_Datatype), intent(in) :: datatype
+        integer, intent(in) :: type_keyval
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Type_delete_attr_f08
+end interface  MPI_Type_delete_attr
+
+interface  MPI_Type_free_keyval
+    subroutine MPI_Type_free_keyval_f08(type_keyval, ierror)
+        implicit none
+        integer, intent(inout) :: type_keyval
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Type_free_keyval_f08
+end interface  MPI_Type_free_keyval
+
+interface  MPI_Type_get_attr
+    subroutine MPI_Type_get_attr_f08(datatype, type_keyval, attribute_val, flag, ierror)
+        use :: mpi_f08_types, only : MPI_Datatype
+        use :: mpi_f08_constants, only : MPI_ADDRESS_KinD
+        implicit none
+        type(MPI_Datatype), intent(in) :: datatype
+        integer, intent(in) :: type_keyval
+        integer(MPI_ADDRESS_KinD), intent(out) :: attribute_val
+        LOGICAL, intent(out) :: flag
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Type_get_attr_f08
+end interface  MPI_Type_get_attr
+
+interface  MPI_Type_get_name
+    subroutine MPI_Type_get_name_f08(datatype, type_name, resultlen, ierror)
+        use :: mpi_f08_types, only : MPI_Datatype
+        use :: mpi_f08_constants, only : MPI_MAX_OBJECT_NAME
+        implicit none
+        type(MPI_Datatype), intent(in) :: datatype
+        CHARACTER(LEN=MPI_MAX_OBJECT_NAME), intent(out) :: type_name
+        integer, intent(out) :: resultlen
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Type_get_name_f08
+end interface  MPI_Type_get_name
+
+interface  MPI_Type_set_attr
+    subroutine MPI_Type_set_attr_f08(datatype, type_keyval, attribute_val, ierror)
+        use :: mpi_f08_types, only : MPI_Datatype
+        use :: mpi_f08_constants, only : MPI_ADDRESS_KinD
+        implicit none
+        type(MPI_Datatype), intent(in) :: datatype
+        integer, intent(in) :: type_keyval
+        integer(MPI_ADDRESS_KinD), intent(in) :: attribute_val
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Type_set_attr_f08
+end interface  MPI_Type_set_attr
+
+interface  MPI_Type_set_name
+    subroutine MPI_Type_set_name_f08(datatype, type_name, ierror)
+        use :: mpi_f08_types, only : MPI_Datatype
+        implicit none
+        type(MPI_Datatype), intent(in) :: datatype
+        CHARACTER(LEN=*), intent(in) :: type_name
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Type_set_name_f08
+end interface  MPI_Type_set_name
+
+interface  MPI_Win_create_keyval
+    subroutine MPI_Win_create_keyval_f08(win_copy_attr_fn, win_delete_attr_fn, win_keyval, &
+                                          extra_state, ierror)
+        use :: mpi_f08_constants, only : MPI_ADDRESS_KinD
+        use :: mpi_f08_callbacks, only : MPI_Win_copy_attr_function
+        use :: mpi_f08_callbacks, only : MPI_Win_delete_attr_function
+        implicit none
+        PROCEDURE(MPI_Win_copy_attr_function) :: win_copy_attr_fn
+        PROCEDURE(MPI_Win_delete_attr_function) :: win_delete_attr_fn
+        integer, intent(out) :: win_keyval
+        integer(MPI_ADDRESS_KinD), intent(in) :: extra_state
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Win_create_keyval_f08
+end interface  MPI_Win_create_keyval
+
+interface  MPI_Win_delete_attr
+    subroutine MPI_Win_delete_attr_f08(win, win_keyval, ierror)
+        use :: mpi_f08_types, only : MPI_Win
+        implicit none
+        type(MPI_Win), intent(in) :: win
+        integer, intent(in) :: win_keyval
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Win_delete_attr_f08
+end interface  MPI_Win_delete_attr
+
+interface  MPI_Win_free_keyval
+    subroutine MPI_Win_free_keyval_f08(win_keyval, ierror)
+        implicit none
+        integer, intent(inout) :: win_keyval
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Win_free_keyval_f08
+end interface  MPI_Win_free_keyval
+
+interface  MPI_Win_get_attr
+    subroutine MPI_Win_get_attr_f08(win, win_keyval, attribute_val, flag, ierror)
+        use :: mpi_f08_types, only : MPI_Win
+        use :: mpi_f08_constants, only : MPI_ADDRESS_KinD
+        implicit none
+        type(MPI_Win), intent(in) :: win
+        integer, intent(in) :: win_keyval
+        integer(MPI_ADDRESS_KinD), intent(out) :: attribute_val
+        LOGICAL, intent(out) :: flag
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Win_get_attr_f08
+end interface  MPI_Win_get_attr
+
+interface  MPI_Win_get_name
+    subroutine MPI_Win_get_name_f08(win, win_name, resultlen, ierror)
+        use :: mpi_f08_types, only : MPI_Win
+        use :: mpi_f08_constants, only : MPI_MAX_OBJECT_NAME
+        implicit none
+        type(MPI_Win), intent(in) :: win
+        CHARACTER(LEN=MPI_MAX_OBJECT_NAME), intent(out) :: win_name
+        integer, intent(out) :: resultlen
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Win_get_name_f08
+end interface  MPI_Win_get_name
+
+interface  MPI_Win_set_attr
+    subroutine MPI_Win_set_attr_f08(win, win_keyval, attribute_val, ierror)
+        use :: mpi_f08_types, only : MPI_Win
+        use :: mpi_f08_constants, only : MPI_ADDRESS_KinD
+        implicit none
+        type(MPI_Win), intent(in) :: win
+        integer, intent(in) :: win_keyval
+        integer(MPI_ADDRESS_KinD), intent(in) :: attribute_val
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Win_set_attr_f08
+end interface  MPI_Win_set_attr
+
+interface  MPI_Win_set_name
+    subroutine MPI_Win_set_name_f08(win, win_name, ierror)
+        use :: mpi_f08_types, only : MPI_Win
+        implicit none
+        type(MPI_Win), intent(in) :: win
+        CHARACTER(LEN=*), intent(in) :: win_name
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Win_set_name_f08
+end interface  MPI_Win_set_name
+
+interface  MPI_Cartdim_get
+    subroutine MPI_Cartdim_get_f08(comm, ndims, ierror)
+        use :: mpi_f08_types, only : MPI_Comm
+        implicit none
+        type(MPI_Comm), intent(in) :: comm
+        integer, intent(out) :: ndims
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Cartdim_get_f08
+end interface  MPI_Cartdim_get
+
+interface  MPI_Cart_coords
+    subroutine MPI_Cart_coords_f08(comm, rank, maxdims, coords, ierror)
+        use :: mpi_f08_types, only : MPI_Comm
+        implicit none
+        type(MPI_Comm), intent(in) :: comm
+        integer, intent(in) :: rank, maxdims
+        integer, intent(out) :: coords(maxdims)
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Cart_coords_f08
+end interface  MPI_Cart_coords
+
+interface  MPI_Cart_create
+    subroutine MPI_Cart_create_f08(comm_old, ndims, dims, periods, reorder, comm_cart, ierror)
+        use :: mpi_f08_types, only : MPI_Comm
+        implicit none
+        type(MPI_Comm), intent(in) :: comm_old
+        integer, intent(in) :: ndims, dims(ndims)
+        LOGICAL, intent(in) :: periods(ndims), reorder
+        type(MPI_Comm), intent(out) :: comm_cart
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Cart_create_f08
+end interface  MPI_Cart_create
+
+interface  MPI_Cart_get
+    subroutine MPI_Cart_get_f08(comm, maxdims, dims, periods, coords, ierror)
+        use :: mpi_f08_types, only : MPI_Comm
+        implicit none
+        type(MPI_Comm), intent(in) :: comm
+        integer, intent(in) :: maxdims
+        integer, intent(out) :: dims(maxdims), coords(maxdims)
+        LOGICAL, intent(out) :: periods(maxdims)
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Cart_get_f08
+end interface  MPI_Cart_get
+
+interface  MPI_Cart_map
+    subroutine MPI_Cart_map_f08(comm, ndims, dims, periods, newrank, ierror)
+        use :: mpi_f08_types, only : MPI_Comm
+        implicit none
+        type(MPI_Comm), intent(in) :: comm
+        integer, intent(in) :: ndims, dims(ndims)
+        LOGICAL, intent(in) :: periods(ndims)
+        integer, intent(out) :: newrank
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Cart_map_f08
+end interface  MPI_Cart_map
+
+interface  MPI_Cart_rank
+    subroutine MPI_Cart_rank_f08(comm, coords, rank, ierror)
+        use :: mpi_f08_types, only : MPI_Comm
+        implicit none
+        type(MPI_Comm), intent(in) :: comm
+        integer, intent(in) :: coords(*)
+        integer, intent(out) :: rank
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Cart_rank_f08
+end interface  MPI_Cart_rank
+
+interface  MPI_Cart_shift
+    subroutine MPI_Cart_shift_f08(comm, direction, disp, rank_source, rank_dest, ierror)
+        use :: mpi_f08_types, only : MPI_Comm
+        implicit none
+        type(MPI_Comm), intent(in) :: comm
+        integer, intent(in) :: direction, disp
+        integer, intent(out) :: rank_source, rank_dest
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Cart_shift_f08
+end interface  MPI_Cart_shift
+
+interface  MPI_Cart_sub
+    subroutine MPI_Cart_sub_f08(comm, remain_dims, newcomm, ierror)
+        use :: mpi_f08_types, only : MPI_Comm
+        implicit none
+        type(MPI_Comm), intent(in) :: comm
+        LOGICAL, intent(in) :: remain_dims(*)
+        type(MPI_Comm), intent(out) :: newcomm
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Cart_sub_f08
+end interface  MPI_Cart_sub
+
+interface  MPI_Dims_create
+    subroutine MPI_Dims_create_f08(nnodes, ndims, dims, ierror)
+        implicit none
+        integer, intent(in) :: nnodes, ndims
+        integer, intent(inout) :: dims(ndims)
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Dims_create_f08
+end interface  MPI_Dims_create
+
+interface  MPI_Dist_graph_create
+    subroutine MPI_Dist_graph_create_f08(comm_old, n,sources, degrees, destinations, weights, &
+                                          info, reorder, comm_dist_graph, ierror)
+        use :: mpi_f08_types, only : MPI_Comm, MPI_Info
+        implicit none
+        type(MPI_Comm), intent(in) :: comm_old
+        integer, intent(in) :: n, sources(n), degrees(n), destinations(*), weights(*)
+        type(MPI_Info), intent(in) :: info
+        LOGICAL, intent(in) :: reorder
+        type(MPI_Comm), intent(out) :: comm_dist_graph
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Dist_graph_create_f08
+end interface  MPI_Dist_graph_create
+
+interface  MPI_Dist_graph_create_adjacent
+    subroutine MPI_Dist_graph_create_adjacent_f08(comm_old, indegree, sources, sourceweights, &
+                                                   outdegree, destinations, destweights, info, reorder, &
+                                                   comm_dist_graph, ierror)
+        use :: mpi_f08_types, only : MPI_Comm, MPI_Info
+        implicit none
+        type(MPI_Comm), intent(in) :: comm_old
+        integer, intent(in) :: indegree, sources(indegree), outdegree, destinations(outdegree)
+        integer, intent(in) :: sourceweights(indegree), destweights(outdegree)
+        type(MPI_Info), intent(in) :: info
+        LOGICAL, intent(in) :: reorder
+        type(MPI_Comm), intent(out) :: comm_dist_graph
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Dist_graph_create_adjacent_f08
+end interface  MPI_Dist_graph_create_adjacent
+
+interface  MPI_Dist_graph_neighbors
+    subroutine MPI_Dist_graph_neighbors_f08(comm, maxindegree, sources, sourceweights, &
+                                             maxoutdegree, destinations, destweights, ierror)
+        use :: mpi_f08_types, only : MPI_Comm
+        implicit none
+        type(MPI_Comm), intent(in) :: comm
+        integer, intent(in) :: maxindegree, maxoutdegree
+        integer, intent(out) :: sources(maxindegree), destinations(maxoutdegree)
+        integer, intent(out) :: sourceweights(maxindegree), destweights(maxoutdegree)
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Dist_graph_neighbors_f08
+end interface  MPI_Dist_graph_neighbors
+
+interface  MPI_Dist_graph_neighbors_count
+    subroutine MPI_Dist_graph_neighbors_count_f08(comm, indegree, outdegree, weighted, ierror)
+        use :: mpi_f08_types, only : MPI_Comm
+        implicit none
+        type(MPI_Comm), intent(in) :: comm
+        integer, intent(out) :: indegree, outdegree
+        LOGICAL, intent(out) :: weighted
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Dist_graph_neighbors_count_f08
+end interface  MPI_Dist_graph_neighbors_count
+
+interface  MPI_Graphdims_get
+    subroutine MPI_Graphdims_get_f08(comm, nnodes, nedges, ierror)
+        use :: mpi_f08_types, only : MPI_Comm
+        implicit none
+        type(MPI_Comm), intent(in) :: comm
+        integer, intent(out) :: nnodes, nedges
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Graphdims_get_f08
+end interface  MPI_Graphdims_get
+
+interface  MPI_Graph_create
+    subroutine MPI_Graph_create_f08(comm_old, nnodes, index, edges, reorder, comm_graph, &
+                                     ierror)
+        use :: mpi_f08_types, only : MPI_Comm
+        implicit none
+        type(MPI_Comm), intent(in) :: comm_old
+        integer, intent(in) :: nnodes, index(nnodes), edges(*)
+        LOGICAL, intent(in) :: reorder
+        type(MPI_Comm), intent(out) :: comm_graph
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Graph_create_f08
+end interface  MPI_Graph_create
+
+interface  MPI_Graph_get
+    subroutine MPI_Graph_get_f08(comm, maxindex, maxedges, index, edges, ierror)
+        use :: mpi_f08_types, only : MPI_Comm
+        implicit none
+        type(MPI_Comm), intent(in) :: comm
+        integer, intent(in) :: maxindex, maxedges
+        integer, intent(out) :: index(maxindex), edges(maxedges)
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Graph_get_f08
+end interface  MPI_Graph_get
+
+interface  MPI_Graph_map
+    subroutine MPI_Graph_map_f08(comm, nnodes, index, edges, newrank, ierror)
+        use :: mpi_f08_types, only : MPI_Comm
+        implicit none
+        type(MPI_Comm), intent(in) :: comm
+        integer, intent(in) :: nnodes, index(nnodes), edges(*)
+        integer, intent(out) :: newrank
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Graph_map_f08
+end interface  MPI_Graph_map
+
+interface  MPI_Graph_neighbors
+    subroutine MPI_Graph_neighbors_f08(comm, rank, maxneighbors, neighbors, ierror)
+        use :: mpi_f08_types, only : MPI_Comm
+        implicit none
+        type(MPI_Comm), intent(in) :: comm
+        integer, intent(in) :: rank, maxneighbors
+        integer, intent(out) :: neighbors(maxneighbors)
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Graph_neighbors_f08
+end interface  MPI_Graph_neighbors
+
+interface  MPI_Graph_neighbors_count
+    subroutine MPI_Graph_neighbors_count_f08(comm, rank, nneighbors, ierror)
+        use :: mpi_f08_types, only : MPI_Comm
+        implicit none
+        type(MPI_Comm), intent(in) :: comm
+        integer, intent(in) :: rank
+        integer, intent(out) :: nneighbors
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Graph_neighbors_count_f08
+end interface  MPI_Graph_neighbors_count
+
+interface  MPI_Topo_test
+    subroutine MPI_Topo_test_f08(comm, status, ierror)
+        use :: mpi_f08_types, only : MPI_Comm, MPI_Status
+        implicit none
+        type(MPI_Comm), intent(in) :: comm
+        integer, intent(out) :: status
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Topo_test_f08
+end interface  MPI_Topo_test
+
+interface MPI_Wtick
+function  MPI_Wtick_f08( ) BinD(C, name="MPI_Wtick")
+        use, intrinsic :: ISO_C_BinDinG
+        implicit none
+        DOUBLE PRECISION :: MPI_Wtick_f08
+end function MPI_Wtick_f08
+end interface MPI_Wtick
+
+interface MPI_Wtime
+function  MPI_Wtime_f08( ) BinD(C, name="MPI_Wtime")
+        use, intrinsic :: ISO_C_BinDinG
+        implicit none
+        DOUBLE PRECISION :: MPI_Wtime_f08
+end function MPI_Wtime_f08
+end interface MPI_Wtime
+
+interface  MPI_Abort
+    subroutine MPI_Abort_f08(comm, errorcode, ierror)
+        use :: mpi_f08_types, only : MPI_Comm
+        implicit none
+        type(MPI_Comm), intent(in) :: comm
+        integer, intent(in) :: errorcode
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Abort_f08
+end interface  MPI_Abort
+
+interface  MPI_Add_error_class
+    subroutine MPI_Add_error_class_f08(errorclass, ierror)
+        implicit none
+        integer, intent(out) :: errorclass
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Add_error_class_f08
+end interface  MPI_Add_error_class
+
+interface  MPI_Add_error_code
+    subroutine MPI_Add_error_code_f08(errorclass, errorcode, ierror)
+        implicit none
+        integer, intent(in) :: errorclass
+        integer, intent(out) :: errorcode
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Add_error_code_f08
+end interface  MPI_Add_error_code
+
+interface  MPI_Add_error_string
+    subroutine MPI_Add_error_string_f08(errorcode, string, ierror)
+        implicit none
+        integer, intent(in) :: errorcode
+        character(len=*), intent(in) :: string
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Add_error_string_f08
+end interface  MPI_Add_error_string
+
+interface  MPI_Alloc_mem
+    subroutine MPI_Alloc_mem_f08(size, info, baseptr, ierror)
+        use, intrinsic :: ISO_C_BinDinG, only : C_PTR
+        use :: mpi_f08_types, only : MPI_Info
+        use :: mpi_f08_constants, only : MPI_ADDRESS_KinD
+        implicit none
+        integer(MPI_ADDRESS_KinD), intent(in) :: size
+        type(MPI_Info), intent(in) :: info
+        type(C_PTR), intent(out) :: baseptr
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Alloc_mem_f08
+end interface  MPI_Alloc_mem
+
+interface  MPI_Comm_call_errhandler
+    subroutine MPI_Comm_call_errhandler_f08(comm, errorcode, ierror)
+        use :: mpi_f08_types, only : MPI_Comm
+        implicit none
+        type(MPI_Comm), intent(in) :: comm
+        integer, intent(in) :: errorcode
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Comm_call_errhandler_f08
+end interface  MPI_Comm_call_errhandler
+
+interface  MPI_Comm_create_errhandler
+    subroutine MPI_Comm_create_errhandler_f08(comm_errhandler_fn, errhandler, ierror)
+        use :: mpi_f08_types, only : MPI_Errhandler
+        use :: mpi_f08_callbacks, only : MPI_Comm_errhandler_function
+        implicit none
+        PROCEDURE(MPI_Comm_errhandler_function) :: comm_errhandler_fn
+        type(MPI_Errhandler), intent(out) :: errhandler
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Comm_create_errhandler_f08
+end interface  MPI_Comm_create_errhandler
+
+interface  MPI_Comm_get_errhandler
+    subroutine MPI_Comm_get_errhandler_f08(comm, errhandler, ierror)
+        use :: mpi_f08_types, only : MPI_Comm, MPI_Errhandler
+        implicit none
+        type(MPI_Comm), intent(in) :: comm
+        type(MPI_Errhandler), intent(out) :: errhandler
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Comm_get_errhandler_f08
+end interface  MPI_Comm_get_errhandler
+
+interface  MPI_Comm_set_errhandler
+    subroutine MPI_Comm_set_errhandler_f08(comm, errhandler, ierror)
+        use :: mpi_f08_types, only : MPI_Comm, MPI_Errhandler
+        implicit none
+        type(MPI_Comm), intent(in) :: comm
+        type(MPI_Errhandler), intent(in) :: errhandler
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Comm_set_errhandler_f08
+end interface  MPI_Comm_set_errhandler
+
+interface  MPI_Errhandler_free
+    subroutine MPI_Errhandler_free_f08(errhandler, ierror)
+        use :: mpi_f08_types, only : MPI_Errhandler
+        implicit none
+        type(MPI_Errhandler), intent(inout) :: errhandler
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Errhandler_free_f08
+end interface  MPI_Errhandler_free
+
+interface  MPI_Error_class
+    subroutine MPI_Error_class_f08(errorcode, errorclass, ierror)
+        implicit none
+        integer, intent(in) :: errorcode
+        integer, intent(out) :: errorclass
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Error_class_f08
+end interface  MPI_Error_class
+
+interface  MPI_Error_string
+    subroutine MPI_Error_string_f08(errorcode, string, resultlen, ierror)
+        use :: mpi_f08_constants, only : MPI_MAX_ERROR_STRinG
+        implicit none
+        integer, intent(in) :: errorcode
+        character(len=MPI_MAX_ERROR_STRinG), intent(out) :: string
+        integer, intent(out) :: resultlen
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Error_string_f08
+end interface  MPI_Error_string
+
+interface  MPI_File_call_errhandler
+    subroutine MPI_File_call_errhandler_f08(fh, errorcode, ierror)
+        use :: mpi_f08_types, only : MPI_File
+        implicit none
+        type(MPI_File), intent(in) :: fh
+        integer, intent(in) :: errorcode
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_File_call_errhandler_f08
+end interface  MPI_File_call_errhandler
+
+interface  MPI_File_create_errhandler
+    subroutine MPI_File_create_errhandler_f08(file_errhandler_fn, errhandler, ierror)
+        use :: mpi_f08_types, only : MPI_Errhandler
+        use :: mpi_f08_callbacks, only : MPI_File_errhandler_function
+        implicit none
+        PROCEDURE(MPI_File_errhandler_function) :: file_errhandler_fn
+        type(MPI_Errhandler), intent(out) :: errhandler
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_File_create_errhandler_f08
+end interface  MPI_File_create_errhandler
+
+interface  MPI_File_get_errhandler
+    subroutine MPI_File_get_errhandler_f08(file, errhandler, ierror)
+        use :: mpi_f08_types, only : MPI_File, MPI_Errhandler
+        implicit none
+        type(MPI_File), intent(in) :: file
+        type(MPI_Errhandler), intent(out) :: errhandler
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_File_get_errhandler_f08
+end interface  MPI_File_get_errhandler
+
+interface  MPI_File_set_errhandler
+    subroutine MPI_File_set_errhandler_f08(file, errhandler, ierror)
+        use :: mpi_f08_types, only : MPI_File, MPI_Errhandler
+        implicit none
+        type(MPI_File), intent(in) :: file
+        type(MPI_Errhandler), intent(in) :: errhandler
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_File_set_errhandler_f08
+end interface  MPI_File_set_errhandler
+
+interface  MPI_Finalize
+    subroutine MPI_Finalize_f08(ierror)
+        implicit none
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Finalize_f08
+end interface  MPI_Finalize
+
+interface  MPI_Finalized
+    subroutine MPI_Finalized_f08(flag, ierror)
+        implicit none
+        LOGICAL, intent(out) :: flag
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Finalized_f08
+end interface  MPI_Finalized
+
+interface  MPI_Free_mem
+    subroutine MPI_Free_mem_f08(base, ierror)
+        use :: mpi_f08_constants, only : MPI_ADDRESS_KinD
+        implicit none
+        integer(MPI_ADDRESS_KinD), dimension(*) :: base
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Free_mem_f08
+end interface  MPI_Free_mem
+
+interface  MPI_Get_processor_name
+    subroutine MPI_Get_processor_name_f08(name, resultlen, ierror)
+        use :: mpi_f08_constants, only : MPI_MAX_PROCESSOR_NAME
+        implicit none
+        character(len=MPI_MAX_PROCESSOR_NAME), intent(out) :: name
+        integer, intent(out) :: resultlen
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Get_processor_name_f08
+end interface  MPI_Get_processor_name
+
+interface  MPI_Get_version
+    subroutine MPI_Get_version_f08(version, subversion, ierror)
+        implicit none
+        integer, intent(out) :: version, subversion
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Get_version_f08
+end interface  MPI_Get_version
+
+interface  MPI_Init
+    subroutine MPI_Init_f08(ierror)
+        implicit none
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Init_f08
+end interface  MPI_Init
+
+interface  MPI_Initialized
+    subroutine MPI_Initialized_f08(flag, ierror)
+        implicit none
+        LOGICAL, intent(out) :: flag
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Initialized_f08
+end interface  MPI_Initialized
+
+interface  MPI_Win_call_errhandler
+    subroutine MPI_Win_call_errhandler_f08(win, errorcode, ierror)
+        use :: mpi_f08_types, only : MPI_Win
+        implicit none
+        type(MPI_Win), intent(in) :: win
+        integer, intent(in) :: errorcode
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Win_call_errhandler_f08
+end interface  MPI_Win_call_errhandler
+
+interface  MPI_Win_create_errhandler
+    subroutine MPI_Win_create_errhandler_f08(win_errhandler_fn, errhandler, ierror)
+        use :: mpi_f08_types, only : MPI_Errhandler
+        use :: mpi_f08_callbacks, only : MPI_Win_errhandler_function
+        implicit none
+        PROCEDURE(MPI_Win_errhandler_function) :: win_errhandler_fn
+        type(MPI_Errhandler), intent(out) :: errhandler
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Win_create_errhandler_f08
+end interface  MPI_Win_create_errhandler
+
+interface  MPI_Win_get_errhandler
+    subroutine MPI_Win_get_errhandler_f08(win, errhandler, ierror)
+        use :: mpi_f08_types, only : MPI_Win, MPI_Errhandler
+        implicit none
+        type(MPI_Win), intent(in) :: win
+        type(MPI_Errhandler), intent(out) :: errhandler
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Win_get_errhandler_f08
+end interface  MPI_Win_get_errhandler
+
+interface  MPI_Win_set_errhandler
+    subroutine MPI_Win_set_errhandler_f08(win, errhandler, ierror)
+        use :: mpi_f08_types, only : MPI_Win, MPI_Errhandler
+        implicit none
+        type(MPI_Win), intent(in) :: win
+        type(MPI_Errhandler), intent(in) :: errhandler
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Win_set_errhandler_f08
+end interface  MPI_Win_set_errhandler
+
+interface  MPI_Info_create
+    subroutine MPI_Info_create_f08(info, ierror)
+        use :: mpi_f08_types, only : MPI_Info
+        implicit none
+        type(MPI_Info), intent(out) :: info
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Info_create_f08
+end interface  MPI_Info_create
+
+interface  MPI_Info_delete
+    subroutine MPI_Info_delete_f08(info, key, ierror)
+        use :: mpi_f08_types, only : MPI_Info
+        implicit none
+        type(MPI_Info), intent(in) :: info
+        CHARACTER(LEN=*), intent(in) :: key
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Info_delete_f08
+end interface  MPI_Info_delete
+
+interface  MPI_Info_dup
+    subroutine MPI_Info_dup_f08(info, newinfo, ierror)
+        use :: mpi_f08_types, only : MPI_Info
+        implicit none
+        type(MPI_Info), intent(in) :: info
+        type(MPI_Info), intent(out) :: newinfo
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Info_dup_f08
+end interface  MPI_Info_dup
+
+interface  MPI_Info_free
+    subroutine MPI_Info_free_f08(info, ierror)
+        use :: mpi_f08_types, only : MPI_Info
+        implicit none
+        type(MPI_Info), intent(inout) :: info
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Info_free_f08
+end interface  MPI_Info_free
+
+interface  MPI_Info_get
+    subroutine MPI_Info_get_f08(info, key, valuelen, value, flag, ierror)
+        use :: mpi_f08_types, only : MPI_Info
+        implicit none
+        type(MPI_Info), intent(in) :: info
+        CHARACTER(LEN=*), intent(in) :: key
+        integer, intent(in) :: valuelen
+        CHARACTER(LEN=valuelen), intent(out) :: value
+        LOGICAL, intent(out) :: flag
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Info_get_f08
+end interface  MPI_Info_get
+
+interface  MPI_Info_get_nkeys
+    subroutine MPI_Info_get_nkeys_f08(info, nkeys, ierror)
+        use :: mpi_f08_types, only : MPI_Info
+        implicit none
+        type(MPI_Info), intent(in) :: info
+        integer, intent(out) :: nkeys
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Info_get_nkeys_f08
+end interface  MPI_Info_get_nkeys
+
+interface  MPI_Info_get_nthkey
+    subroutine MPI_Info_get_nthkey_f08(info, n,key, ierror)
+        use :: mpi_f08_types, only : MPI_Info
+        implicit none
+        type(MPI_Info), intent(in) :: info
+        integer, intent(in) :: n
+        CHARACTER(lEN=*), intent(out) :: key
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Info_get_nthkey_f08
+end interface  MPI_Info_get_nthkey
+
+interface  MPI_Info_get_valuelen
+    subroutine MPI_Info_get_valuelen_f08(info, key, valuelen, flag, ierror)
+        use :: mpi_f08_types, only : MPI_Info
+        implicit none
+        type(MPI_Info), intent(in) :: info
+        CHARACTER(LEN=*), intent(in) :: key
+        integer, intent(out) :: valuelen
+        LOGICAL, intent(out) :: flag
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Info_get_valuelen_f08
+end interface  MPI_Info_get_valuelen
+
+interface  MPI_Info_set
+    subroutine MPI_Info_set_f08(info, key, value, ierror)
+        use :: mpi_f08_types, only : MPI_Info
+        implicit none
+        type(MPI_Info), intent(in) :: info
+        CHARACTER(LEN=*), intent(in) :: key, value
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Info_set_f08
+end interface  MPI_Info_set
+
+interface  MPI_Close_port
+    subroutine MPI_Close_port_f08(port_name, ierror)
+        implicit none
+        CHARACTER(LEN=*), intent(in) :: port_name
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Close_port_f08
+end interface  MPI_Close_port
+
+interface  MPI_Comm_accept
+    subroutine MPI_Comm_accept_f08(port_name, info, root, comm, newcomm, ierror)
+        use :: mpi_f08_types, only : MPI_Info, MPI_Comm
+        implicit none
+        CHARACTER(LEN=*), intent(in) :: port_name
+        type(MPI_Info), intent(in) :: info
+        integer, intent(in) :: root
+        type(MPI_Comm), intent(in) :: comm
+        type(MPI_Comm), intent(out) :: newcomm
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Comm_accept_f08
+end interface  MPI_Comm_accept
+
+interface  MPI_Comm_connect
+    subroutine MPI_Comm_connect_f08(port_name, info, root, comm, newcomm, ierror)
+        use :: mpi_f08_types, only : MPI_Info, MPI_Comm
+        implicit none
+        CHARACTER(LEN=*), intent(in) :: port_name
+        type(MPI_Info), intent(in) :: info
+        integer, intent(in) :: root
+        type(MPI_Comm), intent(in) :: comm
+        type(MPI_Comm), intent(out) :: newcomm
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Comm_connect_f08
+end interface  MPI_Comm_connect
+
+interface  MPI_Comm_disconnect
+    subroutine MPI_Comm_disconnect_f08(comm, ierror)
+        use :: mpi_f08_types, only : MPI_Comm
+        implicit none
+        type(MPI_Comm), intent(inout) :: comm
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Comm_disconnect_f08
+end interface  MPI_Comm_disconnect
+
+interface  MPI_Comm_get_parent
+    subroutine MPI_Comm_get_parent_f08(parent, ierror)
+        use :: mpi_f08_types, only : MPI_Comm
+        implicit none
+        type(MPI_Comm), intent(out) :: parent
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Comm_get_parent_f08
+end interface  MPI_Comm_get_parent
+
+interface  MPI_Comm_join
+    subroutine MPI_Comm_join_f08(fd, intercomm, ierror)
+        use :: mpi_f08_types, only : MPI_Comm
+        implicit none
+        integer, intent(in) :: fd
+        type(MPI_Comm), intent(out) :: intercomm
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Comm_join_f08
+end interface  MPI_Comm_join
+
+interface  MPI_Comm_spawn
+    subroutine MPI_Comm_spawn_f08(command, argv, maxprocs, info, root, comm, intercomm, &
+                                   array_of_errcodes, ierror)
+        use :: mpi_f08_types, only : MPI_Info, MPI_Comm
+        implicit none
+        CHARACTER(LEN=*), intent(in) :: command, argv(*)
+        integer, intent(in) :: maxprocs, root
+        type(MPI_Info), intent(in) :: info
+        type(MPI_Comm), intent(in) :: comm
+        type(MPI_Comm), intent(out) :: intercomm
+        integer :: array_of_errcodes(*)
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Comm_spawn_f08
+end interface  MPI_Comm_spawn
+
+interface  MPI_Comm_spawn_multiple
+    subroutine MPI_Comm_spawn_multiple_f08(count, array_of_commands, array_of_argv, array_of_maxprocs, &
+                                            array_of_info, root, comm, intercomm, &
+                                            array_of_errcodes, ierror)
+        use :: mpi_f08_types, only : MPI_Info, MPI_Comm
+        implicit none
+        integer, intent(in) :: count, array_of_maxprocs(*), root
+        CHARACTER(LEN=*), intent(in) :: array_of_commands(*), array_of_argv(count,*)
+        type(MPI_Info), intent(in) :: array_of_info(*)
+        type(MPI_Comm), intent(in) :: comm
+        type(MPI_Comm), intent(out) :: intercomm
+        integer :: array_of_errcodes(*)
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Comm_spawn_multiple_f08
+end interface  MPI_Comm_spawn_multiple
+
+interface  MPI_Lookup_name
+    subroutine MPI_Lookup_name_f08(service_name, info, port_name, ierror)
+        use :: mpi_f08_types, only : MPI_Info
+        use :: mpi_f08_constants, only : MPI_MAX_PORT_NAME
+        implicit none
+        CHARACTER(LEN=*), intent(in) :: service_name
+        type(MPI_Info), intent(in) :: info
+        CHARACTER(LEN=MPI_MAX_PORT_NAME), intent(out) :: port_name
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Lookup_name_f08
+end interface  MPI_Lookup_name
+
+interface  MPI_Open_port
+    subroutine MPI_Open_port_f08(info, port_name, ierror)
+        use :: mpi_f08_types, only : MPI_Info
+        use :: mpi_f08_constants, only : MPI_MAX_PORT_NAME
+        implicit none
+        type(MPI_Info), intent(in) :: info
+        CHARACTER(LEN=MPI_MAX_PORT_NAME), intent(out) :: port_name
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Open_port_f08
+end interface  MPI_Open_port
+
+interface  MPI_Publish_name
+    subroutine MPI_Publish_name_f08(service_name, info, port_name, ierror)
+        use :: mpi_f08_types, only : MPI_Info
+        implicit none
+        type(MPI_Info), intent(in) :: info
+        CHARACTER(LEN=*), intent(in) :: service_name, port_name
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Publish_name_f08
+end interface  MPI_Publish_name
+
+interface  MPI_Unpublish_name
+    subroutine MPI_Unpublish_name_f08(service_name, info, port_name, ierror)
+        use :: mpi_f08_types, only : MPI_Info
+        implicit none
+        CHARACTER(LEN=*), intent(in) :: service_name, port_name
+        type(MPI_Info), intent(in) :: info
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Unpublish_name_f08
+end interface  MPI_Unpublish_name
+
+interface  MPI_Accumulate
+    subroutine MPI_Accumulate_f08ts(origin_addr, origin_count, origin_datatype, target_rank, &
+                                   target_disp, target_count, target_datatype, op, win, ierror)
+        use :: mpi_f08_types, only : MPI_Datatype, MPI_Op, MPI_Win
+        use :: mpi_f08_constants, only : MPI_ADDRESS_KinD
+        implicit none
+        type(*), dimension(..), intent(in) :: origin_addr
+        integer, intent(in) :: origin_count, target_rank, target_count
+        type(MPI_Datatype), intent(in) :: origin_datatype
+        integer(MPI_ADDRESS_KinD), intent(in) :: target_disp
+        type(MPI_Datatype), intent(in) :: target_datatype
+        type(MPI_Op), intent(in) :: op
+        type(MPI_Win), intent(in) :: win
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Accumulate_f08ts
+end interface  MPI_Accumulate
+
+interface  MPI_Get
+    subroutine MPI_Get_f08ts(origin_addr, origin_count, origin_datatype, target_rank, &
+                                    target_disp, target_count, target_datatype, win, ierror)
+        use :: mpi_f08_types, only : MPI_Datatype, MPI_Win
+        use :: mpi_f08_constants, only : MPI_ADDRESS_KinD
+        implicit none
+        type(*), dimension(..) :: origin_addr
+        integer, intent(in) :: origin_count, target_rank, target_count
+        type(MPI_Datatype), intent(in) :: origin_datatype
+        integer(MPI_ADDRESS_KinD), intent(in) :: target_disp
+        type(MPI_Datatype), intent(in) :: target_datatype
+        type(MPI_Win), intent(in) :: win
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Get_f08ts
+end interface  MPI_Get
+
+interface  MPI_Put
+    subroutine MPI_Put_f08ts(origin_addr, origin_count, origin_datatype, target_rank, &
+                                    target_disp, target_count, target_datatype, win, ierror)
+        use :: mpi_f08_types, only : MPI_Datatype, MPI_Win
+        use :: mpi_f08_constants, only : MPI_ADDRESS_KinD
+        implicit none
+        type(*), dimension(..), intent(in) :: origin_addr
+        integer, intent(in) :: origin_count, target_rank, target_count
+        type(MPI_Datatype), intent(in) :: origin_datatype
+        integer(MPI_ADDRESS_KinD), intent(in) :: target_disp
+        type(MPI_Datatype), intent(in) :: target_datatype
+        type(MPI_Win), intent(in) :: win
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Put_f08ts
+end interface  MPI_Put
+
+interface  MPI_Win_complete
+    subroutine MPI_Win_complete_f08(win, ierror)
+        use :: mpi_f08_types, only : MPI_Info, MPI_Comm, MPI_Win
+        use :: mpi_f08_constants, only : MPI_ADDRESS_KinD
+        implicit none
+        type(MPI_Win), intent(in) :: win
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Win_complete_f08
+end interface  MPI_Win_complete
+
+interface  MPI_Win_create
+    subroutine MPI_Win_create_f08ts(base, size, disp_unit, info, comm, win, ierror)
+        use :: mpi_f08_types, only : MPI_Info, MPI_Comm, MPI_Win
+        use :: mpi_f08_constants, only : MPI_ADDRESS_KinD
+        implicit none
+        type(*), dimension(..) :: base
+        integer(MPI_ADDRESS_KinD), intent(in) :: size
+        integer, intent(in) :: disp_unit
+        type(MPI_Info), intent(in) :: info
+        type(MPI_Comm), intent(in) :: comm
+        type(MPI_Win), intent(out) :: win
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Win_create_f08ts
+end interface  MPI_Win_create
+
+interface  MPI_Win_fence
+    subroutine MPI_Win_fence_f08(assert, win, ierror)
+        use :: mpi_f08_types, only : MPI_Win
+        implicit none
+        integer, intent(in) :: assert
+        type(MPI_Win), intent(in) :: win
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Win_fence_f08
+end interface  MPI_Win_fence
+
+interface  MPI_Win_free
+    subroutine MPI_Win_free_f08(win, ierror)
+        use :: mpi_f08_types, only : MPI_Win
+        implicit none
+        type(MPI_Win), intent(inout) :: win
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Win_free_f08
+end interface  MPI_Win_free
+
+interface  MPI_Win_get_group
+    subroutine MPI_Win_get_group_f08(win, group, ierror)
+        use :: mpi_f08_types, only : MPI_Win, MPI_Group
+        implicit none
+        type(MPI_Win), intent(in) :: win
+        type(MPI_Group), intent(out) :: group
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Win_get_group_f08
+end interface  MPI_Win_get_group
+
+interface  MPI_Win_lock
+    subroutine MPI_Win_lock_f08(lock_type, rank, assert, win, ierror)
+        use :: mpi_f08_types, only : MPI_Win
+        implicit none
+        integer, intent(in) :: lock_type, rank, assert
+        type(MPI_Win), intent(in) :: win
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Win_lock_f08
+end interface  MPI_Win_lock
+
+interface  MPI_Win_post
+    subroutine MPI_Win_post_f08(group, assert, win, ierror)
+        use :: mpi_f08_types, only : MPI_Group, MPI_Win
+        implicit none
+        type(MPI_Group), intent(in) :: group
+        integer, intent(in) :: assert
+        type(MPI_Win), intent(in) :: win
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Win_post_f08
+end interface  MPI_Win_post
+
+interface  MPI_Win_start
+    subroutine MPI_Win_start_f08(group, assert, win, ierror)
+        use :: mpi_f08_types, only : MPI_Group, MPI_Win
+        implicit none
+        type(MPI_Group), intent(in) :: group
+        integer, intent(in) :: assert
+        type(MPI_Win), intent(in) :: win
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Win_start_f08
+end interface  MPI_Win_start
+
+interface  MPI_Win_test
+    subroutine MPI_Win_test_f08(win, flag, ierror)
+        use :: mpi_f08_types, only : MPI_Win
+        implicit none
+        LOGICAL, intent(out) :: flag
+        type(MPI_Win), intent(in) :: win
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Win_test_f08
+end interface  MPI_Win_test
+
+interface  MPI_Win_unlock
+    subroutine MPI_Win_unlock_f08(rank, win, ierror)
+        use :: mpi_f08_types, only : MPI_Win
+        implicit none
+        integer, intent(in) :: rank
+        type(MPI_Win), intent(in) :: win
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Win_unlock_f08
+end interface  MPI_Win_unlock
+
+interface  MPI_Win_wait
+    subroutine MPI_Win_wait_f08(win, ierror)
+        use :: mpi_f08_types, only : MPI_Win
+        implicit none
+        type(MPI_Win), intent(in) :: win
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Win_wait_f08
+end interface  MPI_Win_wait
+
+interface  MPI_Grequest_complete
+    subroutine MPI_Grequest_complete_f08(request, ierror)
+        use :: mpi_f08_types, only : MPI_Request
+        implicit none
+        type(MPI_Request), intent(in) :: request
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Grequest_complete_f08
+end interface  MPI_Grequest_complete
+
+interface  MPI_Grequest_start
+    subroutine MPI_Grequest_start_f08(query_fn, free_fn, cancel_fn, extra_state, request, &
+                                       ierror)
+        use :: mpi_f08_types, only : MPI_Request
+        use :: mpi_f08_constants, only : MPI_ADDRESS_KinD
+        use :: mpi_f08_callbacks, only : MPI_Grequest_query_function
+        use :: mpi_f08_callbacks, only : MPI_Grequest_free_function
+        use :: mpi_f08_callbacks, only : MPI_Grequest_cancel_function
+        implicit none
+        PROCEDURE(MPI_Grequest_query_function) :: query_fn
+        PROCEDURE(MPI_Grequest_free_function) :: free_fn
+        PROCEDURE(MPI_Grequest_cancel_function) :: cancel_fn
+        integer(MPI_ADDRESS_KinD), intent(in) :: extra_state
+        type(MPI_Request), intent(out) :: request
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Grequest_start_f08
+end interface  MPI_Grequest_start
+
+interface  MPI_Init_thread
+    subroutine MPI_Init_thread_f08(required, provided, ierror)
+        implicit none
+        integer, intent(in) :: required
+        integer, intent(out) :: provided
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Init_thread_f08
+end interface  MPI_Init_thread
+
+interface  MPI_Is_thread_main
+    subroutine MPI_Is_thread_main_f08(flag, ierror)
+        implicit none
+        LOGICAL, intent(out) :: flag
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Is_thread_main_f08
+end interface  MPI_Is_thread_main
+
+interface  MPI_Query_thread
+    subroutine MPI_Query_thread_f08(provided, ierror)
+        implicit none
+        integer, intent(out) :: provided
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Query_thread_f08
+end interface  MPI_Query_thread
+
+interface  MPI_Status_set_cancelled
+    subroutine MPI_Status_set_cancelled_f08(status, flag, ierror)
+        use :: mpi_f08_types, only : MPI_Status
+        implicit none
+        type(MPI_Status), intent(inout) :: status
+        LOGICAL, intent(out) :: flag
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Status_set_cancelled_f08
+end interface  MPI_Status_set_cancelled
+
+interface  MPI_Status_set_elements
+    subroutine MPI_Status_set_elements_f08(status, datatype, count, ierror)
+        use :: mpi_f08_types, only : MPI_Status, MPI_Datatype
+        implicit none
+        type(MPI_Status), intent(inout) :: status
+        type(MPI_Datatype), intent(in) :: datatype
+        integer, intent(in) :: count
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Status_set_elements_f08
+end interface  MPI_Status_set_elements
+
+interface  MPI_Status_set_elements_x
+    subroutine MPI_Status_set_elements_x_f08(status, datatype, count, ierror)
+        use :: mpi_f08_types, only : MPI_Status, MPI_Datatype
+        use :: mpi_f08_constants, only : MPI_COUNT_KinD
+        implicit none
+        type(MPI_Status), intent(inout) :: status
+        type(MPI_Datatype), intent(in) :: datatype
+        integer(MPI_COUNT_KinD), intent(in) :: count
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Status_set_elements_x_f08
+end interface  MPI_Status_set_elements_x
+
+interface  MPI_File_close
+    subroutine MPI_File_close_f08(fh, ierror)
+        use :: mpi_f08_types, only : MPI_File
+        implicit none
+        type(MPI_File), intent(inout) :: fh
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_File_close_f08
+end interface  MPI_File_close
+
+interface  MPI_File_delete
+    subroutine MPI_File_delete_f08(filename, info, ierror)
+        use :: mpi_f08_types, only : MPI_Info
+        implicit none
+        CHARACTER(LEN=*), intent(in) :: filename
+        type(MPI_Info), intent(in) :: info
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_File_delete_f08
+end interface  MPI_File_delete
+
+interface  MPI_File_get_amode
+    subroutine MPI_File_get_amode_f08(fh, amode, ierror)
+        use :: mpi_f08_types, only : MPI_File
+        implicit none
+        type(MPI_File), intent(in) :: fh
+        integer, intent(out) :: amode
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_File_get_amode_f08
+end interface  MPI_File_get_amode
+
+interface  MPI_File_get_atomicity
+    subroutine MPI_File_get_atomicity_f08(fh, flag, ierror)
+        use :: mpi_f08_types, only : MPI_File
+        implicit none
+        type(MPI_File), intent(in) :: fh
+        LOGICAL, intent(out) :: flag
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_File_get_atomicity_f08
+end interface  MPI_File_get_atomicity
+
+interface  MPI_File_get_byte_offset
+    subroutine MPI_File_get_byte_offset_f08(fh, offset, disp, ierror)
+        use :: mpi_f08_types, only : MPI_File
+        use :: mpi_f08_constants, only : MPI_OFFSET_KinD
+        implicit none
+        type(MPI_File), intent(in) :: fh
+        integer(MPI_OFFSET_KinD), intent(in) :: offset
+        integer(MPI_OFFSET_KinD), intent(out) :: disp
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_File_get_byte_offset_f08
+end interface  MPI_File_get_byte_offset
+
+interface  MPI_File_get_group
+    subroutine MPI_File_get_group_f08(fh, group, ierror)
+        use :: mpi_f08_types, only : MPI_File, MPI_Group
+        implicit none
+        type(MPI_File), intent(in) :: fh
+        type(MPI_Group), intent(out) :: group
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_File_get_group_f08
+end interface  MPI_File_get_group
+
+interface  MPI_File_get_info
+    subroutine MPI_File_get_info_f08(fh, info_used, ierror)
+        use :: mpi_f08_types, only : MPI_File, MPI_Info
+        implicit none
+        type(MPI_File), intent(in) :: fh
+        type(MPI_Info), intent(out) :: info_used
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_File_get_info_f08
+end interface  MPI_File_get_info
+
+interface  MPI_File_get_position
+    subroutine MPI_File_get_position_f08(fh, offset, ierror)
+        use :: mpi_f08_types, only : MPI_File
+        use :: mpi_f08_constants, only : MPI_OFFSET_KinD
+        implicit none
+        type(MPI_File), intent(in) :: fh
+        integer(MPI_OFFSET_KinD), intent(out) :: offset
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_File_get_position_f08
+end interface  MPI_File_get_position
+
+interface  MPI_File_get_position_shared
+    subroutine MPI_File_get_position_shared_f08(fh, offset, ierror)
+        use :: mpi_f08_types, only : MPI_File
+        use :: mpi_f08_constants, only : MPI_OFFSET_KinD
+        implicit none
+        type(MPI_File), intent(in) :: fh
+        integer(MPI_OFFSET_KinD), intent(out) :: offset
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_File_get_position_shared_f08
+end interface  MPI_File_get_position_shared
+
+interface  MPI_File_get_size
+    subroutine MPI_File_get_size_f08(fh, size, ierror)
+        use :: mpi_f08_types, only : MPI_File
+        use :: mpi_f08_constants, only : MPI_OFFSET_KinD
+        implicit none
+        type(MPI_File), intent(in) :: fh
+        integer(MPI_OFFSET_KinD), intent(out) :: size
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_File_get_size_f08
+end interface  MPI_File_get_size
+
+interface  MPI_File_get_type_extent
+    subroutine MPI_File_get_type_extent_f08(fh, datatype, extent, ierror)
+        use :: mpi_f08_types, only : MPI_File, MPI_Datatype
+        use :: mpi_f08_constants, only : MPI_ADDRESS_KinD
+        implicit none
+        type(MPI_File), intent(in) :: fh
+        type(MPI_Datatype), intent(in) :: datatype
+        integer(MPI_ADDRESS_KinD), intent(out) :: extent
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_File_get_type_extent_f08
+end interface  MPI_File_get_type_extent
+
+interface  MPI_File_get_view
+    subroutine MPI_File_get_view_f08(fh, disp, etype, filetype, datarep, ierror)
+        use :: mpi_f08_types, only : MPI_File, MPI_Datatype
+        use :: mpi_f08_constants, only : MPI_OFFSET_KinD
+        implicit none
+        type(MPI_File), intent(in) :: fh
+        integer(MPI_OFFSET_KinD), intent(out) :: disp
+        type(MPI_Datatype), intent(out) :: etype
+        type(MPI_Datatype), intent(out) :: filetype
+        CHARACTER(LEN=*), intent(out) :: datarep
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_File_get_view_f08
+end interface  MPI_File_get_view
+
+interface  MPI_File_iread
+    subroutine MPI_File_iread_f08ts(fh, buf, count, datatype, request, ierror)
+        use :: mpi_f08_types, only : MPI_File, MPI_Datatype, MPI_Request
+        implicit none
+        type(MPI_File), intent(in) :: fh
+        type(*), dimension(..) :: buf
+        integer, intent(in) :: count
+        type(MPI_Datatype), intent(in) :: datatype
+        type(MPI_Request), intent(out) :: request
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_File_iread_f08ts
+end interface  MPI_File_iread
+
+interface  MPI_File_iread_at
+    subroutine MPI_File_iread_at_f08ts(fh, offset, buf, count, datatype, request, ierror)
+        use :: mpi_f08_types, only : MPI_File, MPI_Datatype, MPI_Request
+        use :: mpi_f08_constants, only : MPI_OFFSET_KinD
+        implicit none
+        type(MPI_File), intent(in) :: fh
+        integer(MPI_OFFSET_KinD), intent(in) :: offset
+        type(*), dimension(..) :: buf
+        integer, intent(in) :: count
+        type(MPI_Datatype), intent(in) :: datatype
+        type(MPI_Request), intent(out) :: request
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_File_iread_at_f08ts
+end interface  MPI_File_iread_at
+
+interface  MPI_File_iread_shared
+    subroutine MPI_File_iread_shared_f08ts(fh, buf, count, datatype, request, ierror)
+        use :: mpi_f08_types, only : MPI_File, MPI_Datatype, MPI_Request
+        implicit none
+        type(MPI_File), intent(in) :: fh
+        type(*), dimension(..) :: buf
+        integer, intent(in) :: count
+        type(MPI_Datatype), intent(in) :: datatype
+        type(MPI_Request), intent(out) :: request
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_File_iread_shared_f08ts
+end interface  MPI_File_iread_shared
+
+interface  MPI_File_iwrite
+    subroutine MPI_File_iwrite_f08ts(fh, buf, count, datatype, request, ierror)
+        use :: mpi_f08_types, only : MPI_File, MPI_Datatype, MPI_Request
+        implicit none
+        type(MPI_File), intent(in) :: fh
+        type(*), dimension(..), intent(in) :: buf
+        integer, intent(in) :: count
+        type(MPI_Datatype), intent(in) :: datatype
+        type(MPI_Request), intent(out) :: request
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_File_iwrite_f08ts
+end interface  MPI_File_iwrite
+
+interface  MPI_File_iwrite_at
+    subroutine MPI_File_iwrite_at_f08ts(fh, offset, buf, count, datatype, request, ierror)
+        use :: mpi_f08_types, only : MPI_File, MPI_Datatype, MPI_Request
+        use :: mpi_f08_constants, only : MPI_OFFSET_KinD
+        implicit none
+        type(MPI_File), intent(in) :: fh
+        integer(MPI_OFFSET_KinD), intent(in) :: offset
+        type(*), dimension(..), intent(in) :: buf
+        integer, intent(in) :: count
+        type(MPI_Datatype), intent(in) :: datatype
+        type(MPI_Request), intent(out) :: request
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_File_iwrite_at_f08ts
+end interface  MPI_File_iwrite_at
+
+interface  MPI_File_iwrite_shared
+    subroutine MPI_File_iwrite_shared_f08ts(fh, buf, count, datatype, request, ierror)
+        use :: mpi_f08_types, only : MPI_File, MPI_Datatype, MPI_Request
+        implicit none
+        type(*), dimension(..), intent(in) :: buf
+        type(MPI_File), intent(in) :: fh
+        integer, intent(in) :: count
+        type(MPI_Datatype), intent(in) :: datatype
+        type(MPI_Request), intent(out) :: request
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_File_iwrite_shared_f08ts
+end interface  MPI_File_iwrite_shared
+
+interface  MPI_File_open
+    subroutine MPI_File_open_f08(comm, filename, amode, info, fh, ierror)
+        use :: mpi_f08_types, only : MPI_Comm, MPI_Info, MPI_File
+        implicit none
+        type(MPI_Comm), intent(in) :: comm
+        CHARACTER(LEN=*), intent(in) :: filename
+        integer, intent(in) :: amode
+        type(MPI_Info), intent(in) :: info
+        type(MPI_File), intent(out) :: fh
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_File_open_f08
+end interface  MPI_File_open
+
+interface  MPI_File_preallocate
+    subroutine MPI_File_preallocate_f08(fh, size, ierror)
+        use :: mpi_f08_types, only : MPI_File
+        use :: mpi_f08_constants, only : MPI_OFFSET_KinD
+        implicit none
+        type(MPI_File), intent(in) :: fh
+        integer(MPI_OFFSET_KinD), intent(in) :: size
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_File_preallocate_f08
+end interface  MPI_File_preallocate
+
+interface  MPI_File_read
+    subroutine MPI_File_read_f08ts(fh, buf, count, datatype, status, ierror)
+        use :: mpi_f08_types, only : MPI_File, MPI_Datatype, MPI_Status
+        implicit none
+        type(MPI_File), intent(in) :: fh
+        type(*), dimension(..) :: buf
+        integer, intent(in) :: count
+        type(MPI_Datatype), intent(in) :: datatype
+        type(MPI_Status) :: status
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_File_read_f08ts
+end interface  MPI_File_read
+
+interface  MPI_File_read_all
+    subroutine MPI_File_read_all_f08ts(fh, buf, count, datatype, status, ierror)
+        use :: mpi_f08_types, only : MPI_File, MPI_Datatype, MPI_Status
+        implicit none
+        type(MPI_File), intent(in) :: fh
+        type(*), dimension(..) :: buf
+        integer, intent(in) :: count
+        type(MPI_Datatype), intent(in) :: datatype
+        type(MPI_Status) :: status
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_File_read_all_f08ts
+end interface  MPI_File_read_all
+
+interface  MPI_File_read_all_begin
+    subroutine MPI_File_read_all_begin_f08ts(fh, buf, count, datatype, ierror)
+        use :: mpi_f08_types, only : MPI_File, MPI_Datatype
+        implicit none
+        type(MPI_File), intent(in) :: fh
+        type(*), dimension(..) :: buf
+        integer, intent(in) :: count
+        type(MPI_Datatype), intent(in) :: datatype
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_File_read_all_begin_f08ts
+end interface  MPI_File_read_all_begin
+
+interface  MPI_File_read_all_end
+    subroutine MPI_File_read_all_end_f08ts(fh, buf, status, ierror)
+        use :: mpi_f08_types, only : MPI_File, MPI_Status
+        implicit none
+        type(MPI_File), intent(in) :: fh
+        type(*), dimension(..) :: buf
+        type(MPI_Status) :: status
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_File_read_all_end_f08ts
+end interface  MPI_File_read_all_end
+
+interface  MPI_File_read_at
+    subroutine MPI_File_read_at_f08ts(fh, offset, buf, count, datatype, status, ierror)
+        use :: mpi_f08_types, only : MPI_File, MPI_Datatype, MPI_Status
+        use :: mpi_f08_constants, only : MPI_OFFSET_KinD
+        implicit none
+        type(MPI_File), intent(in) :: fh
+        integer(MPI_OFFSET_KinD), intent(in) :: offset
+        type(*), dimension(..) :: buf
+        integer, intent(in) :: count
+        type(MPI_Datatype), intent(in) :: datatype
+        type(MPI_Status) :: status
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_File_read_at_f08ts
+end interface  MPI_File_read_at
+
+interface  MPI_File_read_at_all
+    subroutine MPI_File_read_at_all_f08ts(fh, offset, buf, count, datatype, status, ierror)
+        use :: mpi_f08_types, only : MPI_File, MPI_Datatype, MPI_Status
+        use :: mpi_f08_constants, only : MPI_OFFSET_KinD
+        implicit none
+        type(MPI_File), intent(in) :: fh
+        integer(MPI_OFFSET_KinD), intent(in) :: offset
+        type(*), dimension(..) :: buf
+        integer, intent(in) :: count
+        type(MPI_Datatype), intent(in) :: datatype
+        type(MPI_Status) :: status
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_File_read_at_all_f08ts
+end interface  MPI_File_read_at_all
+
+interface  MPI_File_read_at_all_begin
+    subroutine MPI_File_read_at_all_begin_f08ts(fh, offset, buf, count, datatype, ierror)
+        use :: mpi_f08_types, only : MPI_File, MPI_Datatype
+        use :: mpi_f08_constants, only : MPI_OFFSET_KinD
+        implicit none
+        type(MPI_File), intent(in) :: fh
+        integer(MPI_OFFSET_KinD), intent(in) :: offset
+        type(*), dimension(..) :: buf
+        integer, intent(in) :: count
+        type(MPI_Datatype), intent(in) :: datatype
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_File_read_at_all_begin_f08ts
+end interface  MPI_File_read_at_all_begin
+
+interface  MPI_File_read_at_all_end
+    subroutine MPI_File_read_at_all_end_f08ts(fh, buf, status, ierror)
+        use :: mpi_f08_types, only : MPI_File, MPI_Status
+        implicit none
+        type(MPI_File), intent(in) :: fh
+        type(*), dimension(..) :: buf
+        type(MPI_Status) :: status
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_File_read_at_all_end_f08ts
+end interface  MPI_File_read_at_all_end
+
+interface  MPI_File_read_ordered
+    subroutine MPI_File_read_ordered_f08ts(fh, buf, count, datatype, status, ierror)
+        use :: mpi_f08_types, only : MPI_File, MPI_Datatype, MPI_Status
+        implicit none
+        type(MPI_File), intent(in) :: fh
+        type(*), dimension(..) :: buf
+        integer, intent(in) :: count
+        type(MPI_Datatype), intent(in) :: datatype
+        type(MPI_Status) :: status
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_File_read_ordered_f08ts
+end interface  MPI_File_read_ordered
+
+interface  MPI_File_read_ordered_begin
+    subroutine MPI_File_read_ordered_begin_f08ts(fh, buf, count, datatype, ierror)
+        use :: mpi_f08_types, only : MPI_File, MPI_Datatype
+        implicit none
+        type(MPI_File), intent(in) :: fh
+        type(*), dimension(..) :: buf
+        integer, intent(in) :: count
+        type(MPI_Datatype), intent(in) :: datatype
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_File_read_ordered_begin_f08ts
+end interface  MPI_File_read_ordered_begin
+
+interface  MPI_File_read_ordered_end
+    subroutine MPI_File_read_ordered_end_f08ts(fh, buf, status, ierror)
+        use :: mpi_f08_types, only : MPI_File, MPI_Status
+        implicit none
+        type(MPI_File), intent(in) :: fh
+        type(*), dimension(..) :: buf
+        type(MPI_Status) :: status
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_File_read_ordered_end_f08ts
+end interface  MPI_File_read_ordered_end
+
+interface  MPI_File_read_shared
+    subroutine MPI_File_read_shared_f08ts(fh, buf, count, datatype, status, ierror)
+        use :: mpi_f08_types, only : MPI_File, MPI_Datatype, MPI_Status
+        implicit none
+        type(MPI_File), intent(in) :: fh
+        type(*), dimension(..) :: buf
+        integer, intent(in) :: count
+        type(MPI_Datatype), intent(in) :: datatype
+        type(MPI_Status) :: status
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_File_read_shared_f08ts
+end interface  MPI_File_read_shared
+
+interface  MPI_File_seek
+    subroutine MPI_File_seek_f08(fh, offset, whence, ierror)
+        use :: mpi_f08_types, only : MPI_File
+        use :: mpi_f08_constants, only : MPI_OFFSET_KinD
+        implicit none
+        type(MPI_File), intent(in) :: fh
+        integer(MPI_OFFSET_KinD), intent(in) :: offset
+        integer, intent(in) :: whence
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_File_seek_f08
+end interface  MPI_File_seek
+
+interface  MPI_File_seek_shared
+    subroutine MPI_File_seek_shared_f08(fh, offset, whence, ierror)
+        use :: mpi_f08_types, only : MPI_File
+        use :: mpi_f08_constants, only : MPI_OFFSET_KinD
+        implicit none
+        type(MPI_File), intent(in) :: fh
+        integer(MPI_OFFSET_KinD), intent(in) :: offset
+        integer, intent(in) :: whence
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_File_seek_shared_f08
+end interface  MPI_File_seek_shared
+
+interface  MPI_File_set_atomicity
+    subroutine MPI_File_set_atomicity_f08(fh, flag, ierror)
+        use :: mpi_f08_types, only : MPI_File
+        implicit none
+        type(MPI_File), intent(in) :: fh
+        LOGICAL, intent(in) :: flag
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_File_set_atomicity_f08
+end interface  MPI_File_set_atomicity
+
+interface  MPI_File_set_info
+    subroutine MPI_File_set_info_f08(fh, info, ierror)
+        use :: mpi_f08_types, only : MPI_File, MPI_Info
+        implicit none
+        type(MPI_File), intent(in) :: fh
+        type(MPI_Info), intent(in) :: info
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_File_set_info_f08
+end interface  MPI_File_set_info
+
+interface  MPI_File_set_size
+    subroutine MPI_File_set_size_f08(fh, size, ierror)
+        use :: mpi_f08_types, only : MPI_File
+        use :: mpi_f08_constants, only : MPI_OFFSET_KinD
+        implicit none
+        type(MPI_File), intent(in) :: fh
+        integer(MPI_OFFSET_KinD), intent(in) :: size
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_File_set_size_f08
+end interface  MPI_File_set_size
+
+interface  MPI_File_set_view
+    subroutine MPI_File_set_view_f08(fh, disp, etype, filetype, datarep, info, ierror)
+        use :: mpi_f08_types, only : MPI_File, MPI_Datatype, MPI_Info
+        use :: mpi_f08_constants, only : MPI_OFFSET_KinD
+        implicit none
+        type(MPI_File), intent(in) :: fh
+        integer(MPI_OFFSET_KinD), intent(in) :: disp
+        type(MPI_Datatype), intent(in) :: etype
+        type(MPI_Datatype), intent(in) :: filetype
+        CHARACTER(LEN=*), intent(in) :: datarep
+        type(MPI_Info), intent(in) :: info
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_File_set_view_f08
+end interface  MPI_File_set_view
+
+interface  MPI_File_sync
+    subroutine MPI_File_sync_f08(fh, ierror)
+        use :: mpi_f08_types, only : MPI_File
+        implicit none
+        type(MPI_File), intent(in) :: fh
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_File_sync_f08
+end interface  MPI_File_sync
+
+interface  MPI_File_write
+    subroutine MPI_File_write_f08ts(fh, buf, count, datatype, status, ierror)
+        use :: mpi_f08_types, only : MPI_File, MPI_Datatype, MPI_Status
+        implicit none
+        type(MPI_File), intent(in) :: fh
+        type(*), dimension(..), intent(in) :: buf
+        integer, intent(in) :: count
+        type(MPI_Datatype), intent(in) :: datatype
+        type(MPI_Status) :: status
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_File_write_f08ts
+end interface  MPI_File_write
+
+interface  MPI_File_write_all
+    subroutine MPI_File_write_all_f08ts(fh, buf, count, datatype, status, ierror)
+        use :: mpi_f08_types, only : MPI_File, MPI_Datatype, MPI_Status
+        implicit none
+        type(MPI_File), intent(in) :: fh
+        type(*), dimension(..), intent(in) :: buf
+        integer, intent(in) :: count
+        type(MPI_Datatype), intent(in) :: datatype
+        type(MPI_Status) :: status
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_File_write_all_f08ts
+end interface  MPI_File_write_all
+
+interface  MPI_File_write_all_begin
+    subroutine MPI_File_write_all_begin_f08ts(fh, buf, count, datatype, ierror)
+        use :: mpi_f08_types, only : MPI_File, MPI_Datatype
+        implicit none
+        type(MPI_File), intent(in) :: fh
+        type(*), dimension(..), intent(in) :: buf
+        integer, intent(in) :: count
+        type(MPI_Datatype), intent(in) :: datatype
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_File_write_all_begin_f08ts
+end interface  MPI_File_write_all_begin
+
+interface  MPI_File_write_all_end
+    subroutine MPI_File_write_all_end_f08ts(fh, buf, status, ierror)
+        use :: mpi_f08_types, only : MPI_File, MPI_Status
+        implicit none
+        type(MPI_File), intent(in) :: fh
+        type(*), dimension(..), intent(in) :: buf
+        type(MPI_Status) :: status
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_File_write_all_end_f08ts
+end interface  MPI_File_write_all_end
+
+interface  MPI_File_write_at
+    subroutine MPI_File_write_at_f08ts(fh, offset, buf, count, datatype, status, ierror)
+        use :: mpi_f08_types, only : MPI_File, MPI_Datatype, MPI_Status
+        use :: mpi_f08_constants, only : MPI_OFFSET_KinD
+        implicit none
+        type(MPI_File), intent(in) :: fh
+        integer(MPI_OFFSET_KinD), intent(in) :: offset
+        type(*), dimension(..), intent(in) :: buf
+        integer, intent(in) :: count
+        type(MPI_Datatype), intent(in) :: datatype
+        type(MPI_Status) :: status
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_File_write_at_f08ts
+end interface  MPI_File_write_at
+
+interface  MPI_File_write_at_all
+    subroutine MPI_File_write_at_all_f08ts(fh, offset, buf, count, datatype, status, ierror)
+        use :: mpi_f08_types, only : MPI_File, MPI_Datatype, MPI_Status
+        use :: mpi_f08_constants, only : MPI_OFFSET_KinD
+        implicit none
+        type(MPI_File), intent(in) :: fh
+        integer(MPI_OFFSET_KinD), intent(in) :: offset
+        type(*), dimension(..) :: buf
+        integer, intent(in) :: count
+        type(MPI_Datatype), intent(in) :: datatype
+        type(MPI_Status) :: status
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_File_write_at_all_f08ts
+end interface  MPI_File_write_at_all
+
+interface  MPI_File_write_at_all_begin
+    subroutine MPI_File_write_at_all_begin_f08ts(fh, offset, buf, count, datatype, ierror)
+        use :: mpi_f08_types, only : MPI_File, MPI_Datatype
+        use :: mpi_f08_constants, only : MPI_OFFSET_KinD
+        implicit none
+        type(MPI_File), intent(in) :: fh
+        integer(MPI_OFFSET_KinD), intent(in) :: offset
+        type(*), dimension(..), intent(in) :: buf
+        integer, intent(in) :: count
+        type(MPI_Datatype), intent(in) :: datatype
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_File_write_at_all_begin_f08ts
+end interface  MPI_File_write_at_all_begin
+
+interface  MPI_File_write_at_all_end
+    subroutine MPI_File_write_at_all_end_f08ts(fh, buf, status, ierror)
+        use :: mpi_f08_types, only : MPI_File, MPI_Status
+        implicit none
+        type(MPI_File), intent(in) :: fh
+        type(*), dimension(..), intent(in) :: buf
+        type(MPI_Status) :: status
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_File_write_at_all_end_f08ts
+end interface  MPI_File_write_at_all_end
+
+interface  MPI_File_write_ordered
+    subroutine MPI_File_write_ordered_f08ts(fh, buf, count, datatype, status, ierror)
+        use :: mpi_f08_types, only : MPI_File, MPI_Datatype, MPI_Status
+        implicit none
+        type(MPI_File), intent(in) :: fh
+        type(*), dimension(..), intent(in) :: buf
+        integer, intent(in) :: count
+        type(MPI_Datatype), intent(in) :: datatype
+        type(MPI_Status) :: status
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_File_write_ordered_f08ts
+end interface  MPI_File_write_ordered
+
+interface  MPI_File_write_ordered_begin
+    subroutine MPI_File_write_ordered_begin_f08ts(fh, buf, count, datatype, ierror)
+        use :: mpi_f08_types, only : MPI_File, MPI_Datatype
+        implicit none
+        type(MPI_File), intent(in) :: fh
+        type(*), dimension(..), intent(in) :: buf
+        integer, intent(in) :: count
+        type(MPI_Datatype), intent(in) :: datatype
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_File_write_ordered_begin_f08ts
+end interface  MPI_File_write_ordered_begin
+
+interface  MPI_File_write_ordered_end
+    subroutine MPI_File_write_ordered_end_f08ts(fh, buf, status, ierror)
+        use :: mpi_f08_types, only : MPI_File, MPI_Status
+        implicit none
+        type(MPI_File), intent(in) :: fh
+        type(*), dimension(..), intent(in) :: buf
+        type(MPI_Status) :: status
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_File_write_ordered_end_f08ts
+end interface  MPI_File_write_ordered_end
+
+interface  MPI_File_write_shared
+    subroutine MPI_File_write_shared_f08ts(fh, buf, count, datatype, status, ierror)
+        use :: mpi_f08_types, only : MPI_File, MPI_Datatype, MPI_Status
+        implicit none
+        type(MPI_File), intent(in) :: fh
+        type(*), dimension(..), intent(in) :: buf
+        integer, intent(in) :: count
+        type(MPI_Datatype), intent(in) :: datatype
+        type(MPI_Status) :: status
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_File_write_shared_f08ts
+end interface  MPI_File_write_shared
+
+interface  MPI_Register_datarep
+    subroutine MPI_Register_datarep_f08(datarep, read_conversion_fn, write_conversion_fn, &
+                                                 dtype_file_extent_fn, extra_state, ierror)
+        use :: mpi_f08_constants, only : MPI_ADDRESS_KinD
+        use :: mpi_f08_callbacks, only : MPI_Datarep_conversion_function
+        use :: mpi_f08_callbacks, only : MPI_Datarep_extent_function
+        implicit none
+        CHARACTER(LEN=*), intent(in) :: datarep
+        PROCEDURE(MPI_Datarep_conversion_function) :: read_conversion_fn
+        PROCEDURE(MPI_Datarep_conversion_function) :: write_conversion_fn
+        PROCEDURE(MPI_Datarep_extent_function) :: dtype_file_extent_fn
+        integer(MPI_ADDRESS_KinD), intent(in) :: extra_state
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Register_datarep_f08
+end interface  MPI_Register_datarep
+
+
+interface  MPI_Type_create_f90_complex
+    subroutine MPI_Type_create_f90_complex_f08(p, r, newtype, ierror)
+        use :: mpi_f08_types, only : MPI_Datatype
+        implicit none
+        integer, intent(in) :: p, r
+        type(MPI_Datatype), intent(out) :: newtype
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Type_create_f90_complex_f08
+end interface  MPI_Type_create_f90_complex
+
+interface  MPI_Type_create_f90_integer
+    subroutine MPI_Type_create_f90_integer_f08(r, newtype, ierror)
+        use :: mpi_f08_types, only : MPI_Datatype
+        implicit none
+        integer, intent(in) :: r
+        type(MPI_Datatype), intent(out) :: newtype
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Type_create_f90_integer_f08
+end interface  MPI_Type_create_f90_integer
+
+interface  MPI_Type_create_f90_real
+    subroutine MPI_Type_create_f90_real_f08(p, r, newtype, ierror)
+        use :: mpi_f08_types, only : MPI_Datatype
+        implicit none
+        integer, intent(in) :: p, r
+        type(MPI_Datatype), intent(out) :: newtype
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Type_create_f90_real_f08
+end interface  MPI_Type_create_f90_real
+
+interface  MPI_Type_match_size
+    subroutine MPI_Type_match_size_f08(typeclass, size, datatype, ierror)
+        use :: mpi_f08_types, only : MPI_Datatype
+        implicit none
+        integer, intent(in) :: typeclass, size
+        type(MPI_Datatype), intent(out) :: datatype
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Type_match_size_f08
+end interface  MPI_Type_match_size
+
+interface  MPI_Pcontrol
+    subroutine MPI_Pcontrol_f08(level)
+        implicit none
+        integer, intent(in) :: level
+    end subroutine MPI_Pcontrol_f08
+end interface  MPI_Pcontrol
+
+interface  MPI_Comm_split_type
+    subroutine MPI_Comm_split_type_f08(comm, split_type, key, info, newcomm, ierror)
+        use :: mpi_f08_types, only : MPI_Comm, MPI_Info
+        implicit none
+        type(MPI_Comm), intent(in) :: comm
+        integer, intent(in) :: split_type
+        integer, intent(in) :: key
+        type(MPI_Info), intent(in) :: info
+        type(MPI_Comm), intent(out) :: newcomm
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Comm_split_type_f08
+end interface  MPI_Comm_split_type
+
+interface  MPI_F_sync_reg
+    subroutine MPI_F_sync_reg_f08ts(buf)
+        implicit none
+        type(*), dimension(..) :: buf
+    end subroutine MPI_F_sync_reg_f08ts
+end interface  MPI_F_sync_reg
+
+interface  MPI_Get_library_version
+    subroutine MPI_Get_library_version_f08(name, resultlen, ierror)
+        use :: mpi_f08_constants, only : MPI_MAX_PROCESSOR_NAME
+        implicit none
+        character(len=MPI_MAX_PROCESSOR_NAME), intent(out) :: name
+        integer, intent(out) :: resultlen
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Get_library_version_f08
+end interface  MPI_Get_library_version
+
+interface  MPI_Mprobe
+    subroutine MPI_Mprobe_f08(source, tag, comm, message, status, ierror)
+        use :: mpi_f08_types, only : MPI_Comm, MPI_Message, MPI_Status
+        implicit none
+        integer, intent(in) :: source, tag
+        type(MPI_Comm), intent(in) :: comm
+        type(MPI_Message), intent(out) :: message
+        type(MPI_Status), intent(out) :: status
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Mprobe_f08
+end interface  MPI_Mprobe
+
+interface  MPI_Improbe
+    subroutine MPI_Improbe_f08(source, tag, comm, flag, message, status, ierror)
+        use :: mpi_f08_types, only : MPI_Comm, MPI_Message, MPI_Status
+        implicit none
+        integer, intent(in) :: source, tag
+        type(MPI_Comm), intent(in) :: comm
+        LOGICAL, intent(out) :: flag
+        type(MPI_Message), intent(out) :: message
+        type(MPI_Status), intent(out) :: status
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Improbe_f08
+end interface  MPI_Improbe
+
+interface  MPI_Imrecv
+    subroutine MPI_Imrecv_f08ts(buf, count, datatype, message, request, ierror)
+        use :: mpi_f08_types, only : MPI_Datatype, MPI_Message, MPI_Request
+        implicit none
+        type(*), dimension(..) :: buf
+        integer, intent(in) :: count
+        type(MPI_Datatype), intent(in) :: datatype
+        type(MPI_Message), intent(inout) :: message
+        type(MPI_Request), intent(out) :: request
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Imrecv_f08ts
+end interface  MPI_Imrecv
+
+interface  MPI_Mrecv
+    subroutine MPI_Mrecv_f08ts(buf, count, datatype, message, status, ierror)
+        use :: mpi_f08_types, only : MPI_Datatype, MPI_Message, MPI_Status
+        implicit none
+        type(*), dimension(..) :: buf
+        integer, intent(in) :: count
+        type(MPI_Datatype), intent(in) :: datatype
+        type(MPI_Message), intent(inout) :: message
+        type(MPI_Status) :: status
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Mrecv_f08ts
+end interface  MPI_Mrecv
+
+interface  MPI_Neighbor_allgather
+    subroutine MPI_Neighbor_allgather_f08ts(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, &
+                                  comm, ierror)
+        use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm
+        implicit none
+        type(*), dimension(..), intent(in) :: sendbuf
+        type(*), dimension(..) :: recvbuf
+        integer, intent(in) :: sendcount, recvcount
+        type(MPI_Datatype), intent(in) :: sendtype, recvtype
+        type(MPI_Comm), intent(in) :: comm
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Neighbor_allgather_f08ts
+end interface  MPI_Neighbor_allgather
+
+interface  MPI_Ineighbor_allgather
+    subroutine MPI_Ineighbor_allgather_f08ts(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, &
+                                  comm, request, ierror)
+        use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm, MPI_Request
+        implicit none
+        type(*), dimension(..), intent(in) :: sendbuf
+        type(*), dimension(..) :: recvbuf
+        integer, intent(in) :: sendcount, recvcount
+        type(MPI_Datatype), intent(in) :: sendtype, recvtype
+        type(MPI_Comm), intent(in) :: comm
+        type(MPI_Request), intent(out) :: request
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Ineighbor_allgather_f08ts
+end interface  MPI_Ineighbor_allgather
+
+interface  MPI_Neighbor_allgatherv
+    subroutine MPI_Neighbor_allgatherv_f08ts(sendbuf, sendcount, sendtype, recvbuf, recvcounts, displs, &
+                                   recvtype, comm, ierror)
+        use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm
+        implicit none
+        type(*), dimension(..), intent(in) :: sendbuf
+        type(*), dimension(..) :: recvbuf
+        integer, intent(in) :: sendcount
+        integer, intent(in) :: recvcounts(*), displs(*)
+        type(MPI_Datatype), intent(in) :: sendtype, recvtype
+        type(MPI_Comm), intent(in) :: comm
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Neighbor_allgatherv_f08ts
+end interface  MPI_Neighbor_allgatherv
+
+interface  MPI_Ineighbor_allgatherv
+    subroutine MPI_Ineighbor_allgatherv_f08ts(sendbuf, sendcount, sendtype, recvbuf, recvcounts, displs, &
+                                   recvtype, comm, request, ierror)
+        use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm, MPI_Request
+        implicit none
+        type(*), dimension(..), intent(in) :: sendbuf
+        type(*), dimension(..) :: recvbuf
+        integer, intent(in) :: sendcount
+        integer, intent(in) :: recvcounts(*), displs(*)
+        type(MPI_Datatype), intent(in) :: sendtype, recvtype
+        type(MPI_Comm), intent(in) :: comm
+        type(MPI_Request), intent(out) :: request
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Ineighbor_allgatherv_f08ts
+end interface  MPI_Ineighbor_allgatherv
+
+interface  MPI_Neighbor_alltoall
+    subroutine MPI_Neighbor_alltoall_f08ts(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, &
+                                 comm, ierror)
+        use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm
+        implicit none
+        type(*), dimension(..), intent(in) :: sendbuf
+        type(*), dimension(..) :: recvbuf
+        integer, intent(in) :: sendcount, recvcount
+        type(MPI_Datatype), intent(in) :: sendtype, recvtype
+        type(MPI_Comm), intent(in) :: comm
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Neighbor_alltoall_f08ts
+end interface  MPI_Neighbor_alltoall
+
+interface  MPI_Ineighbor_alltoall
+    subroutine MPI_Ineighbor_alltoall_f08ts(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, &
+                                 comm, request, ierror)
+        use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm, MPI_Request
+        implicit none
+        type(*), dimension(..), intent(in) :: sendbuf
+        type(*), dimension(..) :: recvbuf
+        integer, intent(in) :: sendcount, recvcount
+        type(MPI_Datatype), intent(in) :: sendtype, recvtype
+        type(MPI_Comm), intent(in) :: comm
+        type(MPI_Request), intent(out) :: request
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Ineighbor_alltoall_f08ts
+end interface  MPI_Ineighbor_alltoall
+
+interface  MPI_Neighbor_alltoallv
+    subroutine MPI_Neighbor_alltoallv_f08ts(sendbuf, sendcounts, sdispls, sendtype, recvbuf, recvcounts, &
+                                  rdispls, recvtype, comm, ierror)
+        use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm
+        implicit none
+        type(*), dimension(..), intent(in) :: sendbuf
+        type(*), dimension(..) :: recvbuf
+        integer, intent(in) :: sendcounts(*), sdispls(*), recvcounts(*), rdispls(*)
+        type(MPI_Datatype), intent(in) :: sendtype, recvtype
+        type(MPI_Comm), intent(in) :: comm
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Neighbor_alltoallv_f08ts
+end interface  MPI_Neighbor_alltoallv
+
+interface  MPI_Ineighbor_alltoallv
+    subroutine MPI_Ineighbor_alltoallv_f08ts(sendbuf, sendcounts, sdispls, sendtype, recvbuf, recvcounts, &
+                                  rdispls, recvtype, comm, request, ierror)
+        use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm, MPI_Request
+        implicit none
+        type(*), dimension(..), intent(in) :: sendbuf
+        type(*), dimension(..) :: recvbuf
+        integer, intent(in) :: sendcounts(*), sdispls(*), recvcounts(*), rdispls(*)
+        type(MPI_Datatype), intent(in) :: sendtype, recvtype
+        type(MPI_Comm), intent(in) :: comm
+        type(MPI_Request), intent(in) :: request
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Ineighbor_alltoallv_f08ts
+end interface  MPI_Ineighbor_alltoallv
+
+interface  MPI_Neighbor_alltoallw
+    subroutine MPI_Neighbor_alltoallw_f08ts(sendbuf, sendcounts, sdispls, sendtypes, recvbuf, recvcounts, &
+                                  rdispls, recvtypes, comm, ierror)
+        use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm
+        use :: mpi_f08_constants, only : MPI_ADDRESS_KinD
+        implicit none
+        type(*), dimension(..), intent(in) :: sendbuf
+        type(*), dimension(..) :: recvbuf
+        integer, intent(in) :: sendcounts(*), recvcounts(*)
+        integer(MPI_ADDRESS_KinD), intent(in) :: sdispls(*), rdispls(*)
+        type(MPI_Datatype), intent(in) :: sendtypes(*), recvtypes(*)
+        type(MPI_Comm), intent(in) :: comm
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Neighbor_alltoallw_f08ts
+end interface  MPI_Neighbor_alltoallw
+
+interface  MPI_Ineighbor_alltoallw
+    subroutine MPI_Ineighbor_alltoallw_f08ts(sendbuf, sendcounts, sdispls, sendtypes, recvbuf, recvcounts, &
+                                  rdispls, recvtypes, comm, request, ierror)
+        use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm, MPI_Request
+        use :: mpi_f08_constants, only : MPI_ADDRESS_KinD
+        implicit none
+        type(*), dimension(..), intent(in) :: sendbuf
+        type(*), dimension(..) :: recvbuf
+        integer, intent(in) :: sendcounts(*), recvcounts(*)
+        integer(MPI_ADDRESS_KinD), intent(in) :: sdispls(*), rdispls(*)
+        type(MPI_Datatype), intent(in) :: sendtypes(*), recvtypes(*)
+        type(MPI_Comm), intent(in) :: comm
+        type(MPI_Request), intent(in) :: request
+        integer, optional, intent(out) :: ierror
+    end subroutine MPI_Ineighbor_alltoallw_f08ts
+end interface  MPI_Ineighbor_alltoallw
+
+
+end module mpi_f08
diff --git a/src/binding/fortran/use_mpi_f08/mpi_f08_callbacks.f90 b/src/binding/fortran/use_mpi_f08/mpi_f08_callbacks.f90
new file mode 100644
index 0000000..97aadd0
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/mpi_f08_callbacks.f90
@@ -0,0 +1,151 @@
+module mpi_f08_callbacks
+
+! MPI3.0, A.1.3,  p. 678
+
+abstract interface
+
+subroutine MPI_User_function(invec, inoutvec, len, datatype)
+    USE, intrinsic :: ISO_C_BINDING, only : C_PTR
+    USE mpi_f08_types, only : MPI_Datatype
+    implicit none
+    type(C_PTR), value :: invec, inoutvec
+    integer :: len
+    type(MPI_Datatype) :: datatype
+end subroutine
+
+subroutine MPI_Comm_copy_attr_function(oldcomm,comm_keyval,extra_state, &
+       attribute_val_in,attribute_val_out,flag,ierror)
+    USE mpi_f08_types, only : MPI_Comm
+    USE mpi_f08_constants, only : MPI_ADDRESS_KIND
+    implicit none
+    type(MPI_Comm) :: oldcomm
+    integer :: comm_keyval, ierror
+    integer(KIND=MPI_ADDRESS_KIND) :: extra_state, attribute_val_in, attribute_val_out
+    logical :: flag
+end subroutine
+
+subroutine MPI_Comm_delete_attr_function(comm,comm_keyval, &
+       attribute_val, extra_state, ierror)
+    USE mpi_f08_types, only : MPI_Comm
+    USE mpi_f08_constants, only : MPI_ADDRESS_KIND
+    implicit none
+    type(MPI_Comm) :: comm
+    integer :: comm_keyval, ierror
+    integer(KIND=MPI_ADDRESS_KIND) :: attribute_val, extra_state
+end subroutine
+
+subroutine MPI_Win_copy_attr_function(oldwin,win_keyval,extra_state, &
+       attribute_val_in,attribute_val_out,flag,ierror)
+    USE mpi_f08_types, only : MPI_Win
+    USE mpi_f08_constants, only : MPI_ADDRESS_KIND
+    implicit none
+    type(MPI_Win) :: oldwin
+    integer :: win_keyval, ierror
+    integer(KIND=MPI_ADDRESS_KIND) :: extra_state, attribute_val_in, attribute_val_out
+    logical :: flag
+end subroutine
+
+subroutine MPI_Win_delete_attr_function(win,win_keyval,attribute_val, &
+       extra_state,ierror)
+    USE mpi_f08_types, only : MPI_Win
+    USE mpi_f08_constants, only : MPI_ADDRESS_KIND
+    implicit none
+    type(MPI_Win) :: win
+    integer :: win_keyval, ierror
+    integer(KIND=MPI_ADDRESS_KIND) :: attribute_val, extra_state
+end subroutine
+
+subroutine MPI_Type_copy_attr_function(oldtype,type_keyval,extra_state, &
+       attribute_val_in,attribute_val_out,flag,ierror)
+    USE mpi_f08_types, only : MPI_Datatype
+    USE mpi_f08_constants, only : MPI_ADDRESS_KIND
+    implicit none
+    type(MPI_Datatype) :: oldtype
+    integer :: type_keyval, ierror
+    integer(KIND=MPI_ADDRESS_KIND) :: extra_state, attribute_val_in, attribute_val_out
+    logical :: flag
+end subroutine
+
+subroutine MPI_Type_delete_attr_function(datatype,type_keyval, &
+       attribute_val,extra_state,ierror)
+    USE mpi_f08_types, only : MPI_Datatype
+    USE mpi_f08_constants, only : MPI_ADDRESS_KIND
+    implicit none
+    type(MPI_Datatype) :: datatype
+    integer :: type_keyval, ierror
+    integer(KIND=MPI_ADDRESS_KIND) :: attribute_val, extra_state
+end subroutine
+
+subroutine MPI_Comm_errhandler_function(comm,error_code)
+    USE mpi_f08_types, only : MPI_Comm
+    USE mpi_f08_constants, only : MPI_ADDRESS_KIND
+    implicit none
+    type(MPI_Comm) :: comm
+    integer :: error_code
+end subroutine
+
+subroutine MPI_Win_errhandler_function(win, error_code)
+    USE mpi_f08_types, only : MPI_Win
+    USE mpi_f08_constants, only : MPI_ADDRESS_KIND
+    implicit none
+    type(MPI_Win) :: win
+    integer :: error_code
+end subroutine
+
+subroutine MPI_File_errhandler_function(file, error_code)
+    USE mpi_f08_types, only : MPI_File
+    USE mpi_f08_constants, only : MPI_ADDRESS_KIND
+    implicit none
+    type(MPI_File) :: file
+    integer :: error_code
+end subroutine
+
+    subroutine MPI_Grequest_query_function(extra_state,status,ierror)
+    USE mpi_f08_types, only : MPI_Status
+    USE mpi_f08_constants, only : MPI_ADDRESS_KIND
+    implicit none
+    type(MPI_Status) :: status
+    integer :: ierror
+    integer(KIND=MPI_ADDRESS_KIND) :: extra_state
+end subroutine
+
+subroutine MPI_Grequest_free_function(extra_state,ierror)
+    USE mpi_f08_constants, only : MPI_ADDRESS_KIND
+    implicit none
+    integer :: ierror
+    integer(KIND=MPI_ADDRESS_KIND) :: extra_state
+end subroutine
+
+subroutine MPI_Grequest_cancel_function(extra_state,complete,ierror)
+    USE mpi_f08_constants, only : MPI_ADDRESS_KIND
+    implicit none
+    integer(KIND=MPI_ADDRESS_KIND) :: extra_state
+    logical :: complete
+    integer :: ierror
+end subroutine
+
+subroutine MPI_Datarep_extent_function(datatype, extent, extra_state, ierror)
+    USE mpi_f08_types, only : MPI_Datatype
+    USE mpi_f08_constants, only : MPI_ADDRESS_KIND
+    implicit none
+    type(MPI_Datatype) :: datatype
+    integer :: ierror
+    integer(KIND=MPI_ADDRESS_KIND) :: extent, extra_state
+end subroutine
+
+subroutine MPI_Datarep_conversion_function(userbuf, datatype, count, &
+       filebuf, position, extra_state, ierror)
+    USE mpi_f08_types, only : MPI_Datatype
+    USE mpi_f08_constants, only : MPI_OFFSET_KIND, MPI_ADDRESS_KIND
+    USE, intrinsic :: ISO_C_BINDING, only : C_PTR
+    implicit none
+    type(C_PTR), value :: userbuf, filebuf
+    type(MPI_Datatype) :: datatype
+    integer :: count, ierror
+    integer(KIND=MPI_OFFSET_KIND) :: position
+    integer(KIND=MPI_ADDRESS_KIND) :: extra_state
+end subroutine
+
+end interface
+
+end module mpi_f08_callbacks
diff --git a/src/binding/fortran/use_mpi_f08/mpi_f08_constants.f90 b/src/binding/fortran/use_mpi_f08/mpi_f08_constants.f90
new file mode 100644
index 0000000..6f87c19
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/mpi_f08_constants.f90
@@ -0,0 +1,475 @@
+! ! MPI 3 Data cosnatnts for Fortran.
+! From A.1.1
+! The module also contains the conversion routines for mpi_status
+!
+! Module mpi_f08_constants is a helper module used by  mpi_f08
+! It is not defined in the spec and not intended for end users.
+!--------------------------------------------------------------
+
+module mpi_f08_constants
+
+use,intrinsic :: iso_c_binding, only: c_int
+use,intrinsic :: iso_fortran_env, only: int32, int64, real32, real64
+use :: mpi_f08_types
+use :: mpi_c_interface_types, only: C_Aint, C_Count, C_Offset
+
+!====================================================================
+! Make names brought in from other modules private if they should not
+! be exposed in program units using this module
+!====================================================================
+
+! Make names from iso_c_binding private
+private :: c_int
+
+! Make names from iso_fortran_env private
+private :: int32
+private :: int64
+private :: real32
+private :: real64
+
+! Make nmes from mpi_C_types private
+private :: C_Aint
+private :: C_Count
+private :: C_Offset
+
+!=========================================
+! Definitions of MPI Constants for Fortran
+! Should match the values in  mpif.h
+!==========================================
+
+! Implementation Information
+! 8.1.1 p335
+integer,parameter :: MPI_VERSION    = 3
+integer,parameter :: MPI_SUBVERSION = 0
+
+
+! Null Handles
+! A.1.1 p669
+
+type(MPI_Group),parameter      :: MPI_GROUP_NULL      = MPI_Group(134217728 )      ! 0x08000000
+type(MPI_Comm),parameter       :: MPI_COMM_NULL       = MPI_Comm(67108864 )        ! 0x04000000
+type(MPI_Datatype),parameter   :: MPI_DATATYPE_NULL   = MPI_Datatype(  201326592)  ! 0x0c000000
+type(MPI_Request),parameter    :: MPI_REQUEST_NULL    = MPI_Request(738197504)     ! 0x2c000000
+type(MPI_Op),parameter         :: MPI_OP_NULL         = MPI_Op(  402653184)        ! 0x18000000
+type(MPI_Errhandler),parameter :: MPI_ERRHANDLER_NULL = MPI_Errhandler( 335544320) ! 0x14000000
+type(MPI_File),parameter       :: MPI_FILE_NULL       = MPI_File(0)                ! 0x00000000
+type(MPI_Info),parameter       :: MPI_INFO_NULL       = MPI_Info(469762048)        ! 0x1c000000
+type(MPI_Win),parameter        :: MPI_WIN_NULL        = MPI_Win(  536870912)       ! 0x20000000
+type(MPI_Message),parameter    :: MPI_MESSAGE_NULL    = MPI_Message(738197504)     ! 0x2c000000
+! The component value for MPI_MESSAGE_NULL is the same as that for MPI_REQUEST_NULL
+
+! Error Classes
+! A.1.1, pp 661 - 663
+integer,parameter ::  MPI_SUCCESS          = 0
+integer,parameter ::  MPI_ERR_BUFFER       = 1
+integer,parameter ::  MPI_ERR_COUNT        = 2
+integer,parameter ::  MPI_ERR_TYPE         = 3
+integer,parameter ::  MPI_ERR_TAG          = 4
+integer,parameter ::  MPI_ERR_COMM         = 5
+integer,parameter ::  MPI_ERR_RANK         = 6
+integer,parameter ::  MPI_ERR_REQUEST      = 19
+integer,parameter ::  MPI_ERR_ROOT         = 7
+integer,parameter ::  MPI_ERR_GROUP        = 8
+integer,parameter ::  MPI_ERR_OP           = 9
+integer,parameter ::  MPI_ERR_TOPOLOGY     = 10
+integer,parameter ::  MPI_ERR_DIMS         = 11
+integer,parameter ::  MPI_ERR_ARG          = 12
+integer,parameter ::  MPI_ERR_UNKNOWN      = 13
+integer,parameter ::  MPI_ERR_TRUNCATE     = 14
+integer,parameter ::  MPI_ERR_OTHER        = 15
+integer,parameter ::  MPI_ERR_INTERN       = 16
+integer,parameter ::  MPI_ERR_PENDING      = 18
+integer,parameter ::  MPI_ERR_IN_STATUS    = 17
+integer,parameter ::  MPI_ERR_ACCESS       = 20
+integer,parameter ::  MPI_ERR_AMODE        = 21
+integer,parameter ::  MPI_ERR_ASSERT       = 53
+integer,parameter ::  MPI_ERR_BAD_FILE     = 22
+integer,parameter ::  MPI_ERR_BASE         = 46
+integer,parameter ::  MPI_ERR_CONVERSION   = 23
+integer,parameter ::  MPI_ERR_DISP         = 52
+integer,parameter ::  MPI_ERR_DUP_DATAREP  = 24
+integer,parameter ::  MPI_ERR_FILE_EXISTS  = 25
+integer,parameter ::  MPI_ERR_FILE_IN_USE  = 26
+integer,parameter ::  MPI_ERR_FILE         = 27
+integer,parameter ::  MPI_ERR_INFO_KEY     = 29
+integer,parameter ::  MPI_ERR_INFO_NOKEY   = 31
+integer,parameter ::  MPI_ERR_INFO_VALUE   = 30
+integer,parameter ::  MPI_ERR_INFO         = 28
+integer,parameter ::  MPI_ERR_IO           = 32
+integer,parameter ::  MPI_ERR_KEYVAL       = 48
+integer,parameter ::  MPI_ERR_LOCKTYPE     = 47
+integer,parameter ::  MPI_ERR_NAME         = 33
+integer,parameter ::  MPI_ERR_NO_MEM       = 34
+integer,parameter ::  MPI_ERR_NOT_SAME     = 35
+integer,parameter ::  MPI_ERR_NO_SPACE     = 36
+integer,parameter ::  MPI_ERR_NO_SUCH_FILE = 37
+integer,parameter ::  MPI_ERR_PORT         = 38
+integer,parameter ::  MPI_ERR_QUOTA        = 39
+integer,parameter ::  MPI_ERR_READ_ONLY    = 40
+integer,parameter ::  MPI_ERR_RMA_ATTACH   = 56
+integer,parameter ::  MPI_ERR_RMA_CONFLICT = 49
+integer,parameter ::  MPI_ERR_RMA_RANGE    = 55
+integer,parameter ::  MPI_ERR_RMA_SHARED   = 57
+integer,parameter ::  MPI_ERR_RMA_SYNC     = 50
+integer,parameter ::  MPI_ERR_RMA_FLAVOR   = 58
+integer,parameter ::  MPI_ERR_SERVICE      = 41
+integer,parameter ::  MPI_ERR_SIZE         = 51
+integer,parameter ::  MPI_ERR_SPAWN        = 42
+integer,parameter ::  MPI_ERR_UNSUPPORTED_DATAREP  = 43
+integer,parameter ::  MPI_ERR_UNSUPPORTED_OPERATION  = 44
+integer,parameter ::  MPI_ERR_WIN          = 45
+!integer,parameter ::  MPI_T_ERR_CANNOT_INIT      = 999905  ! **** NEED VALUE
+!integer,parameter ::  MPI_T_ERR_NOT_INITIALIZED  = 999906  ! **** NEED VALUE
+!integer,parameter ::  MPI_T_ERR_MEMORY           = 999907  ! **** NEED VALUE
+!integer,parameter ::  MPI_T_ERR_INVALID_INDEX    = 999908  ! **** NEED VALUE
+!integer,parameter ::  MPI_T_ERR_INVALID_ITEM     = 999909  ! **** NEED VALUE
+!integer,parameter ::  MPI_T_ERR_INVALID_SESSION  = 999910  ! **** NEED VALUE
+!integer,parameter ::  MPI_T_ERR_INVALID_HANDLE   = 999911  ! **** NEED VALUE
+!integer,parameter ::  MPI_T_ERR_OUT_OF_HANDLES   = 999912  ! **** NEED VALUE
+!integer,parameter ::  MPI_T_ERR_OUT_OF_SESSIONS  = 999913  ! **** NEED VALUE
+!integer,parameter ::  MPI_T_ERR_CVAR_SET_NOT_NOW = 999914  ! **** NEED VALUE
+!integer,parameter ::  MPI_T_ERR_CVAR_SET_NEVER   = 999915  ! **** NEED VALUE
+!integer,parameter ::  MPI_T_ERR_PVAR_NO_WRITE    = 999916  ! **** NEED VALUE
+!integer,parameter ::  MPI_T_ERR_PVAR_NO_STARTUP  = 999917  ! **** NEED VALUE
+integer,parameter ::  MPI_ERR_LASTCODE     = 1073741823
+
+! Buffer Address Constants
+! A.1.1 p. 663
+integer,protected,bind(c,name="MPI_BOTTOM")   :: MPI_BOTTOM
+integer,protected,bind(c,name="MPI_IN_PLACE") :: MPI_IN_PLACE
+
+! Similar Global variables
+! 2.5.4 pp 15-16
+integer,protected,bind(c,name="MPI_STATUS_IGNORE")   :: MPI_STATUS_IGNORE
+integer,protected,bind(c,name="MPI_STATUSES_IGNORE") :: MPI_STATUSES_IGNORE
+integer,protected,bind(c,name="MPI_ERRCODES_IGNORE") :: MPI_ERRCODES_IGNORE
+integer,protected,bind(c,name="MPI_ARGV_NULL")       :: MPI_ARGV_NULL
+integer,protected,bind(c,name="MPI_ARGVS_NULL")      :: MPI_ARGVS_NULL
+integer,protected,bind(c,name="MPI_UNWEIGHTED")      :: MPI_UNWEIGHTED
+integer,protected,bind(c,name="MPI_WEIGHTS_EMPTY")   :: MPI_WEIGHTS_EMPTY
+
+! Assorted Constants
+! A.1.1 p. 663
+integer,parameter ::  MPI_PROC_NULL      = -1
+integer,parameter ::  MPI_ANY_SOURCE     = -2
+integer,parameter ::  MPI_ANY_TAG        = -1
+integer,parameter ::  MPI_UNDEFINED      = -32766
+integer,parameter ::  MPI_BSEND_OVERHEAD = 96
+integer,parameter ::  MPI_KEYVAL_INVALID = 603979776
+integer,parameter ::  MPI_LOCK_EXCLUSIVE = 234
+integer,parameter ::  MPI_LOCK_SHARED    = 235
+integer,parameter ::  MPI_ROOT           = -3
+
+! No Process Message Handle
+! A.1.1 p. 663
+type(MPI_Message),parameter    :: MPI_MESSAGE_NO_PROC = MPI_Message(1811939328)
+
+! Fortran Support Method Specific Constants
+! A.1.1 p. 664
+logical,parameter :: MPI_SUBARRAYS_SUPPORTED        = .true.  ! Value differs from mpif.h
+logical,parameter :: MPI_ASYNC_PROTECTS_NONBLOCKING = .true.  ! Value differs from mpif.h
+
+! Status size and reserved index values
+! A.1.1 p. 664
+!integer,parameter :: MPI_STATUS_SIZE = 8   ! defined in mpi_C_types
+!integer,parameter :: MPI_SOURCE      = 1   ! defined in mpi_C_types
+!integer,parameter :: MPI_TAG         = 2   ! defined in mpi_C_types
+!integer,parameter :: MPI_ERROR       = 3   ! defined in mpi_C_types
+
+! Variable Address Size
+! A.1.1 p. 664
+integer,parameter :: MPI_ADDRESS_KIND = C_Aint     ! Defined in mpi_C_types
+integer,parameter :: MPI_COUNT_KIND   = C_Count    ! Defined in mpi_C_types
+integer,parameter :: MPI_integer_KIND = KIND(0)
+integer,parameter :: MPI_OFFSET_KIND  = C_Offset   ! Defined in mpi_C_types
+
+! Error Handling Specifiers
+! A.1.1 p. 664
+type(MPI_Errhandler),parameter :: MPI_ERRORS_ARE_FATAL = MPI_Errhandler(1409286144)
+type(MPI_Errhandler),parameter :: MPI_ERRORS_RETURN    = MPI_Errhandler(1409286145)
+
+! Maximum Sizes for Strings
+! A.1.1 p. 664
+integer,parameter ::  MPI_MAX_DATAREP_STRING         = 127
+integer,parameter ::  MPI_MAX_ERROR_STRING           = 1023
+integer,parameter ::  MPI_MAX_INFO_KEY               = 254
+integer,parameter ::  MPI_MAX_INFO_VAL               = 1023
+integer,parameter ::  MPI_MAX_LIBRARY_VERSION_STRING = 8191
+integer,parameter ::  MPI_MAX_OBJECT_NAME            = 127
+integer,parameter ::  MPI_MAX_PORT_NAME              = 255
+integer,parameter ::  MPI_MAX_PROCESSOR_NAME         = 128-1
+
+
+! Named Predefined Datatypes - C types
+! A.1.1 pp 665 - 666
+type(MPI_Datatype),parameter :: MPI_CHAR                   = MPI_Datatype( 1275068673) ! 0x4c000101
+type(MPI_Datatype),parameter :: MPI_SHORT                  = MPI_Datatype( 1275068931) ! 0x4c000203
+type(MPI_Datatype),parameter :: MPI_INT                    = MPI_Datatype( 1275069445) ! 0x4c000405
+type(MPI_Datatype),parameter :: MPI_LONG                   = MPI_Datatype( 1275070471) ! 0x4c000807
+type(MPI_Datatype),parameter :: MPI_LONG_LONG_INT          = MPI_Datatype( 1275070473) ! 0x4c000809
+type(MPI_Datatype),parameter :: MPI_LONG_LONG              = MPI_LONG_LONG_INT
+type(MPI_Datatype),parameter :: MPI_SIGNED_CHAR            = MPI_Datatype( 1275068696) ! 0x4c000118
+type(MPI_Datatype),parameter :: MPI_UNSIGNED_CHAR          = MPI_Datatype( 1275068674) ! 0x4c000102
+type(MPI_Datatype),parameter :: MPI_UNSIGNED_SHORT         = MPI_Datatype( 1275068932) ! 0x4c000204
+type(MPI_Datatype),parameter :: MPI_UNSIGNED               = MPI_Datatype( 1275069446) ! 0x4c000406
+type(MPI_Datatype),parameter :: MPI_UNSIGNED_LONG          = MPI_Datatype( 1275070472) ! 0x4c000808
+type(MPI_Datatype),parameter :: MPI_UNSIGNED_LONG_LONG     = MPI_Datatype( 1275070489) ! 0x4c000819
+type(MPI_Datatype),parameter :: MPI_FLOAT                  = MPI_Datatype( 1275069450) ! 0x4c00040a
+type(MPI_Datatype),parameter :: MPI_DOUBLE                 = MPI_Datatype( 1275070475) ! 0x4c00080b
+type(MPI_Datatype),parameter :: MPI_LONG_DOUBLE            = MPI_Datatype( 1275072524) ! 0x4c00100c
+type(MPI_Datatype),parameter :: MPI_WCHAR                  = MPI_Datatype( 1275069454) ! 0x4c00040e
+type(MPI_Datatype),parameter :: MPI_C_BOOL                 = MPI_Datatype( 1275068735) ! 0x4c00013f
+type(MPI_Datatype),parameter :: MPI_INT8_T                 = MPI_Datatype( 1275068727) ! 0x4c000137
+type(MPI_Datatype),parameter :: MPI_INT16_T                = MPI_Datatype( 1275068984) ! 0x4c000238
+type(MPI_Datatype),parameter :: MPI_INT32_T                = MPI_Datatype( 1275069497) ! 0x4c000439
+type(MPI_Datatype),parameter :: MPI_INT64_T                = MPI_Datatype( 1275070522) ! 0x4c00083a
+type(MPI_Datatype),parameter :: MPI_UINT8_T                = MPI_Datatype( 1275068731) ! 0x4c00013b
+type(MPI_Datatype),parameter :: MPI_UINT16_T               = MPI_Datatype( 1275068988) ! 0x4c00023c
+type(MPI_Datatype),parameter :: MPI_UINT32_T               = MPI_Datatype( 1275069501) ! 0x4c00043d
+type(MPI_Datatype),parameter :: MPI_UINT64_T               = MPI_Datatype( 1275070526) ! 0x4c00083e
+type(MPI_Datatype),parameter :: MPI_AINT                   = MPI_Datatype( 1275070531) ! 0x4c000843
+type(MPI_Datatype),parameter :: MPI_COUNT                  = MPI_Datatype( 1275070533) ! 0x4c000845
+type(MPI_Datatype),parameter :: MPI_OFFSET                 = MPI_Datatype( 1275070532) ! 0x4c000844
+type(MPI_Datatype),parameter :: MPI_C_FLOAT_COMPLEX        = MPI_Datatype( 1275070528) ! 0x4c000840
+type(MPI_Datatype),parameter :: MPI_C_COMPLEX              = MPI_C_FLOAT_COMPLEX
+type(MPI_Datatype),parameter :: MPI_C_DOUBLE_COMPLEX       = MPI_Datatype( 1275072577) ! 0x4c001041
+type(MPI_Datatype),parameter :: MPI_C_LONG_DOUBLE_COMPLEX  = MPI_Datatype( 1275076674) ! 0x4c002042
+type(MPI_Datatype),parameter :: MPI_BYTE                   = MPI_Datatype( 1275068685) ! 0x4c00010d
+type(MPI_Datatype),parameter :: MPI_PACKED                 = MPI_Datatype( 1275068687) ! 0x4c00010f
+
+
+! Named Predefined Datatypes - Fortran types
+! A.1.1 p. 666
+integer,private,parameter :: dik = kind(0)     ! Default Integer Kind
+integer,private,parameter :: drk = kind(0.0)   ! Default Real Kind
+integer,private,parameter :: ddk = kind(0.0d0) ! Default Double Precision Kind
+
+type(MPI_Datatype),parameter,private :: MPIx_C8       = MPI_Datatype( 1275070494) ! 0x4c00081e
+type(MPI_Datatype),parameter,private :: MPIx_C16      = MPI_Datatype( 1275072546) ! 0x4c001022
+type(MPI_Datatype),parameter,private :: MPIx_C32      = MPI_Datatype( 1275076652) ! 0x4c00202c
+type(MPI_Datatype),parameter,private :: MPIx_2R4      = MPI_Datatype( 1275070497) ! 0x4c000821
+type(MPI_Datatype),parameter,private :: MPIx_2R8      = MPI_Datatype( 1275072545) ! 0x4c001021
+type(MPI_Datatype),parameter,private :: MPIx_L4       = MPI_Datatype( 1275069469) ! 0x4c00041d
+type(MPI_Datatype),parameter,private :: MPIx_L8       = MPI_Datatype( 1275070493) ! 0x4c00081d
+type(MPI_Datatype),parameter,private :: MPIx_R4       = MPI_Datatype( 1275069468) ! 0x4c00041c
+type(MPI_Datatype),parameter,private :: MPIx_R8       = MPI_Datatype( 1275070495) ! 0x4c00081f
+type(MPI_Datatype),parameter,private :: MPIx_R16      = MPI_Datatype( 1275072555) ! 0x4c00102b
+type(MPI_Datatype),parameter,private :: MPIx_I4       = MPI_Datatype( 1275069467) ! 0x4c00041b
+type(MPI_Datatype),parameter,private :: MPIx_I8       = MPI_Datatype( 1275070491) ! 0x4c00081b
+type(MPI_Datatype),parameter,private :: MPIx_2I4      = MPI_Datatype( 1275070496) ! 0x4c000820
+type(MPI_Datatype),parameter,private :: MPIx_2I8      = MPI_Datatype( 1275072544) ! 0x4c001020
+type(MPI_Datatype),parameter :: MPI_integer           = merge(MPIx_I4, MPIx_I8,  dik==int32)
+type(MPI_Datatype),parameter :: MPI_REAL              = merge(MPIx_R4, MPIx_R8,  drk==real32)
+type(MPI_Datatype),parameter :: MPI_DOUBLE_PRECISION  = merge(MPIx_R8, MPIx_R16, ddk==real64)
+type(MPI_Datatype),parameter :: MPI_COMPLEX           = merge(MPIx_C8, MPIx_C16, drk==real32)
+type(MPI_Datatype),parameter :: MPI_LOGICAL           = merge(MPIx_L4, MPIx_L8,  dik==int32)
+type(MPI_Datatype),parameter :: MPI_CHARACTER         = MPI_Datatype( 1275068698) ! 0x4c00011a
+
+! Named Predefined Datatypes - C++ types
+! A.1.1 p. 666
+type(MPI_Datatype),parameter :: MPI_CXX_BOOL                = MPI_Datatype( 1275068723) ! 0x4C000133
+type(MPI_Datatype),parameter :: MPI_CXX_FLOAT_COMPLEX       = MPI_Datatype( 1275070516) ! 0x4C000834
+type(MPI_Datatype),parameter :: MPI_CXX_DOUBLE_COMPLEX      = MPI_Datatype( 1275072565) ! 0x4C001035
+type(MPI_Datatype),parameter :: MPI_CXX_LONG_DOUBLE_COMPLEX = MPI_Datatype( 1275076662) ! 0x4C002036
+
+! Optional datatypes (Fortran)
+! A.1.1 p. 666
+type(MPI_Datatype),parameter :: MPI_DOUBLE_COMPLEX    = merge(MPIx_C16,MPIx_C32, ddk==real64)
+type(MPI_Datatype),parameter :: MPI_integer1          = MPI_Datatype( 1275068717) ! 0x4c00012d
+type(MPI_Datatype),parameter :: MPI_integer2          = MPI_Datatype( 1275068975) ! 0x4c00022f
+type(MPI_Datatype),parameter :: MPI_integer4          = MPI_Datatype( 1275069488) ! 0x4c000430
+type(MPI_Datatype),parameter :: MPI_integer8          = MPI_Datatype( 1275070513) ! 0x4c000831
+type(MPI_Datatype),parameter :: MPI_integer16         = MPI_DATATYPE_NULL
+type(MPI_Datatype),parameter :: MPI_REAL2             = MPI_DATATYPE_NULL
+type(MPI_Datatype),parameter :: MPI_REAL4             = MPI_Datatype( 1275069479) ! 0x4c000427
+type(MPI_Datatype),parameter :: MPI_REAL8             = MPI_Datatype( 1275070505) ! 0x4c000829
+type(MPI_Datatype),parameter :: MPI_REAL16            = MPI_Datatype( 1275072555) ! 0x4c00102b
+type(MPI_Datatype),parameter :: MPI_COMPLEX4          = MPI_DATATYPE_NULL
+type(MPI_Datatype),parameter :: MPI_COMPLEX8          = MPI_Datatype( 1275070504) ! 0x4c000828
+type(MPI_Datatype),parameter :: MPI_COMPLEX16         = MPI_Datatype( 1275072554) ! 0x4c00102a
+type(MPI_Datatype),parameter :: MPI_COMPLEX32         = MPI_Datatype( 1275076652) ! 0x4c00202c
+
+! Datatypes for reduction functions (C)
+! A.1.1 p. 667
+type(MPI_Datatype),parameter :: MPI_FLOAT_INT         = MPI_Datatype(-1946157056) ! 0x8c000000
+type(MPI_Datatype),parameter :: MPI_DOUBLE_INT        = MPI_Datatype(-1946157055) ! 0x8c000001
+type(MPI_Datatype),parameter :: MPI_LONG_INT          = MPI_Datatype(-1946157054) ! 0x8c000002
+type(MPI_Datatype),parameter :: MPI_2INT              = MPI_Datatype( 1275070486) ! 0x4c000816
+type(MPI_Datatype),parameter :: MPI_SHORT_INT         = MPI_Datatype(-1946157053) ! 0x8c000003
+type(MPI_Datatype),parameter :: MPI_LONG_DOUBLE_INT   = MPI_Datatype(-1946157052) ! 0x8c000004
+
+! Datatypes for reduction functions (Fortran)
+! A.1.1 p. 667
+type(MPI_Datatype),parameter :: MPI_2REAL             = merge(MPIx_2R4, MPIx_2R8,drk==real32)
+type(MPI_Datatype),parameter :: MPI_2DOUBLE_PRECISION = MPI_Datatype( 1275072547) ! 0x4c001023
+type(MPI_Datatype),parameter :: MPI_2integer          = merge(MPIx_2I4, MPIx_2I8,dik==int32)
+!!!!!! Seems like MPI_2DOUBLE_PRECISION not handled correctly here.
+!!!!!! But the mpi.h.32 and mpi.h.64 had the same value.
+
+! Reserved communicators
+! A.1.1 p. 667
+type(MPI_Comm),parameter  ::  MPI_COMM_WORLD  = MPI_Comm( 1140850688) ! 0x44000000
+type(MPI_Comm),parameter  ::  MPI_COMM_SELF   = MPI_Comm( 1140850689) ! 0x44000001
+
+! Communicator split type constants
+! A.1.1 p. 667
+integer,parameter :: MPI_COMM_TYPE_SHARED = 1
+
+! Results of communicator and group comparisons
+! A.1.1 p. 667
+integer,parameter :: MPI_IDENT     = 0
+integer,parameter :: MPI_CONGRUENT = 1
+integer,parameter :: MPI_SIMILAR   = 2
+integer,parameter :: MPI_UNEQUAL   = 3
+
+! Environmental inquiry info key
+! A.1.1 p. 667
+type(MPI_Info),parameter :: MPI_INFO_ENV = MPI_Info(999922) ! **** NEED VALUE
+
+! Environmental inquiry keys
+! A.1.1 p. 668
+integer,parameter ::  MPI_TAG_UB          = 1681915906 !  0x64400002
+integer,parameter ::  MPI_HOST            = 1681915908 !  0x64400004
+integer,parameter ::  MPI_IO              = 1681915910 !  0x64400006
+integer,parameter ::  MPI_WTIME_IS_GLOBAL = 1681915912 !  0x64400008
+
+! Collective operations
+! A.1.1 p. 668
+type(MPI_Op),parameter :: MPI_MAX     = MPI_Op( 1476395009) ! 0x58000001
+type(MPI_Op),parameter :: MPI_MIN     = MPI_Op( 1476395010) ! 0x58000002
+type(MPI_Op),parameter :: MPI_SUM     = MPI_Op( 1476395011) ! 0x58000003
+type(MPI_Op),parameter :: MPI_PROD    = MPI_Op( 1476395012) ! 0x58000004
+type(MPI_Op),parameter :: MPI_MAXLOC  = MPI_Op( 1476395020) ! 0x5800000c
+type(MPI_Op),parameter :: MPI_MINLOC  = MPI_Op( 1476395019) ! 0x5800000b
+type(MPI_Op),parameter :: MPI_BAND    = MPI_Op( 1476395014) ! 0x58000006
+type(MPI_Op),parameter :: MPI_BOR     = MPI_Op( 1476395016) ! 0x58000008
+type(MPI_Op),parameter :: MPI_BXOR    = MPI_Op( 1476395018) ! 0x5800000a
+type(MPI_Op),parameter :: MPI_LAND    = MPI_Op( 1476395013) ! 0x58000005
+type(MPI_Op),parameter :: MPI_LOR     = MPI_Op( 1476395015) ! 0x58000007
+type(MPI_Op),parameter :: MPI_LXOR    = MPI_Op( 1476395017) ! 0x58000009
+type(MPI_Op),parameter :: MPI_REPLACE = MPI_Op( 1476395021) ! 0x5800000d
+type(MPI_Op),parameter :: MPI_NO_OP   = MPI_Op( 1476395022) ! 0x5800000e
+
+! Empty group
+! A.1.1 p 669
+type(MPI_Group),parameter :: MPI_GROUP_EMPTY  = MPI_Group( 1207959552) ! 0x48000000
+
+! Topologies
+! A.1.1 p 669
+integer,parameter :: MPI_GRAPH      = 1
+integer,parameter :: MPI_CART       = 2
+integer,parameter :: MPI_DIST_GRAPH = 3
+
+! Predefined Attribute Keys
+! A.1.1 p 671
+integer,parameter :: MPI_APPNUM            = 1681915918
+integer,parameter :: MPI_LASTUSEDCODE      = 1681915916
+integer,parameter :: MPI_UNIVERSE_SIZE     = 1681915914
+integer,parameter :: MPI_WIN_BASE          = 1711276034
+integer,parameter :: MPI_WIN_DISP_UNIT     = 1711276038
+integer,parameter :: MPI_WIN_SIZE          = 1711276036
+integer,parameter :: MPI_WIN_CREATE_FLAVOR = 1711276040
+integer,parameter :: MPI_WIN_MODEL         = 1711276042
+
+! MPI Window Create Flavors
+! A.1.1 p 671
+integer,parameter :: MPI_WIN_FLAVOR_CREATE   = 1
+integer,parameter :: MPI_WIN_FLAVOR_ALLOCATE = 2
+integer,parameter :: MPI_WIN_FLAVOR_DYNAMIC  = 3
+integer,parameter :: MPI_WIN_FLAVOR_SHARED   = 4
+
+! MPI Window Models
+! A.1.1 p 671
+integer,parameter :: MPI_WIN_SEPARATE = 1
+integer,parameter :: MPI_WIN_UNIFIED  = 2
+
+! Mode Constants
+! A.1.1 p 672
+integer,parameter :: MPI_MODE_APPEND          = 128
+integer,parameter :: MPI_MODE_CREATE          = 1
+integer,parameter :: MPI_MODE_DELETE_ON_CLOSE = 16
+integer,parameter :: MPI_MODE_EXCL            = 64
+integer,parameter :: MPI_MODE_NOCHECK         = 1024
+integer,parameter :: MPI_MODE_NOPRECEDE       = 8192
+integer,parameter :: MPI_MODE_NOPUT           = 4096
+integer,parameter :: MPI_MODE_NOSTORE         = 2048
+integer,parameter :: MPI_MODE_NOSUCCEED       = 16384
+integer,parameter :: MPI_MODE_RDONLY          = 2
+integer,parameter :: MPI_MODE_RDWR            = 8
+integer,parameter :: MPI_MODE_SEQUENTIAL      = 256
+integer,parameter :: MPI_MODE_UNIQUE_OPEN     = 32
+integer,parameter :: MPI_MODE_WRONLY          = 4
+
+! Datatype Decoding Constants
+! A.1.1 p 672
+integer,parameter :: MPI_COMBINER_CONTIGUOUS     = 3
+integer,parameter :: MPI_COMBINER_DARRAY         = 15
+integer,parameter :: MPI_COMBINER_DUP            = 2
+integer,parameter :: MPI_COMBINER_F90_COMPLEX    = 17
+integer,parameter :: MPI_COMBINER_F90_integer    = 18
+integer,parameter :: MPI_COMBINER_F90_REAL       = 16
+integer,parameter :: MPI_COMBINER_HINDEXED       = 9
+integer,parameter :: MPI_COMBINER_HVECTOR        = 6
+integer,parameter :: MPI_COMBINER_INDEXED_BLOCK  = 10
+integer,parameter :: MPI_COMBINER_HINDEXED_BLOCK = 11
+integer,parameter :: MPI_COMBINER_INDEXED        = 7
+integer,parameter :: MPI_COMBINER_NAMED          = 1
+integer,parameter :: MPI_COMBINER_RESIZED        = 19
+integer,parameter :: MPI_COMBINER_STRUCT         = 13
+integer,parameter :: MPI_COMBINER_SUBARRAY       = 14
+integer,parameter :: MPI_COMBINER_VECTOR         = 4
+
+
+! Threads Constants
+! A.1.1 p 672
+integer,parameter :: MPI_THREAD_FUNNELED   = 1
+integer,parameter :: MPI_THREAD_MULTIPLE   = 3
+integer,parameter :: MPI_THREAD_SERIALIZED = 2
+integer,parameter :: MPI_THREAD_SINGLE     = 0
+
+! File Operation Constants, Part 1
+! A.1.1 p 673
+integer(mpi_offset_kind),parameter :: MPI_DISPLACEMENT_CURRENT = -54278278
+
+! File Operation Constants, Part 2
+! A.1.1 p 673
+integer,parameter :: MPI_DISTRIBUTE_BLOCK     = 121
+integer,parameter :: MPI_DISTRIBUTE_CYCLIC    = 122
+integer,parameter :: MPI_DISTRIBUTE_DFLT_DARG = -49767
+integer,parameter :: MPI_DISTRIBUTE_NONE      = 123
+integer,parameter :: MPI_ORDER_C              = 56
+integer,parameter :: MPI_ORDER_FORTRAN        = 57
+integer,parameter :: MPI_SEEK_CUR             = 602
+integer,parameter :: MPI_SEEK_END             = 604
+integer,parameter :: MPI_SEEK_SET             = 600
+
+! F90 Datatype Matching Cosntants
+! A.1.1 p 673
+integer,parameter :: MPI_TYPECLASS_COMPLEX = 3
+integer,parameter :: MPI_TYPECLASS_integer = 2
+integer,parameter :: MPI_TYPECLASS_REAL    = 1
+
+! MPI_T_* names
+! A.1.1 pp 674-676
+! The MPI_T_* names in the tables on pages 674-676 are for C only
+! and are omitted here
+
+!=============================================
+
+! Added constants defined in mpich 3 mpif.h file
+! These are removed - See table 2.1, page 18 in the spec.
+! but kept here for backward compatibility
+integer,parameter :: MPI_COMBINER_HVECTOR_integer  = 5
+integer,parameter :: MPI_COMBINER_HINDEXED_integer = 8
+integer,parameter :: MPI_COMBINER_STRUCT_integer  = 12
+type(MPI_Datatype),parameter :: MPI_LB                     = MPI_Datatype( 1275068432) ! 0x4c000010
+type(MPI_Datatype),parameter :: MPI_UB                     = MPI_Datatype( 1275068433) ! 0x4c000011
+
+! Additional reduction function data types defined by mpich 3, not in spec
+type(MPI_Datatype),parameter :: MPI_2COMPLEX        = MPI_Datatype( 1275072548) ! 0x4C002025
+type(MPI_Datatype),parameter :: MPI_2DOUBLE_COMPLEX = MPI_Datatype( 1275076645) ! 0x4C001024
+!!!!!! Similar mishandling here for -r8 case.
+
+
+END MODULE mpi_f08_constants
+
diff --git a/src/binding/fortran/use_mpi_f08/mpi_f08_types.f90 b/src/binding/fortran/use_mpi_f08/mpi_f08_types.f90
new file mode 100644
index 0000000..d0680c3
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/mpi_f08_types.f90
@@ -0,0 +1,1156 @@
+! MPI 3 Data types for Fortran.
+! From A.1.2, pp 676-677
+! Note added MPI_Message type not in the spec by mistake
+!
+! Module mpi_f08_types is a helper module used by
+! mpi_f08_constants and mpi_f08
+! It is not defined in the spec and not intended for end users.
+! (jczhang: Does not the spec require MPI_Comm etc be defined?)
+!--------------------------------------------------------------
+
+MODULE mpi_f08_types
+use,intrinsic :: iso_c_binding, only: c_int
+use :: mpi_c_interface_types, only: c_Count, c_Status
+IMPLICIT NONE
+
+private :: c_int, c_Count, c_Status
+
+! F08 derived types
+! A.1.2  p 677
+
+TYPE, BIND(C) :: MPI_Comm
+ integer :: MPI_VAL
+END TYPE MPI_Comm
+
+TYPE, BIND(C) :: MPI_Datatype
+ integer :: MPI_VAL
+END TYPE MPI_Datatype
+
+TYPE, BIND(C) :: MPI_Errhandler
+ integer :: MPI_VAL
+END TYPE MPI_Errhandler
+
+TYPE, BIND(C) :: MPI_File
+ integer :: MPI_VAL
+END TYPE MPI_File
+
+TYPE, BIND(C) :: MPI_Group
+ integer :: MPI_VAL
+END TYPE MPI_Group
+
+TYPE, BIND(C) :: MPI_Info
+ integer :: MPI_VAL
+END TYPE MPI_Info
+
+TYPE, BIND(C) :: MPI_Op
+ integer :: MPI_VAL
+END TYPE MPI_Op
+
+TYPE, BIND(C) :: MPI_Request
+ integer :: MPI_VAL
+END TYPE MPI_Request
+
+TYPE, BIND(C) :: MPI_Win
+ integer :: MPI_VAL
+END TYPE MPI_Win
+
+TYPE, BIND(C) :: MPI_Message
+ integer :: MPI_VAL
+END TYPE MPI_Message
+
+! Fortran 2008 struct for status. Must be consistent with mpi.h, mpif.h
+TYPE, BIND(C) :: MPI_Status
+    integer :: count_lo;
+    integer :: count_hi_and_cancelled;
+    integer :: MPI_SOURCE
+    integer :: MPI_TAG
+    integer :: MPI_ERROR
+END TYPE MPI_Status
+
+! Fortran subscript constants
+! 3.2.5  p 30, and A.1.1 p 664
+integer,parameter :: MPI_SOURCE = 3
+integer,parameter :: MPI_TAG    = 4
+integer,parameter :: MPI_ERROR  = 5
+integer,parameter :: MPI_STATUS_SIZE = 5
+
+interface assignment(=)
+   module procedure mpi_status_f08_assgn_c
+   module procedure mpi_status_c_assgn_f08
+   module procedure mpi_status_f_assgn_c
+   module procedure mpi_status_c_assgn_f
+end interface
+private :: mpi_status_f08_assgn_c
+private :: mpi_status_c_assgn_f08
+private :: mpi_status_f_assgn_c
+private :: mpi_status_c_assgn_f
+
+! Required operator overloads for == and /= for opaque handles
+! 2.5.1 pp 12-13
+
+interface operator(==)
+   module procedure mpi_comm_f08_eq_f
+   module procedure mpi_comm_f_eq_f08
+   module procedure mpi_datatype_f08_eq_f
+   module procedure mpi_datatype_f_eq_f08
+   module procedure mpi_errhandler_f08_eq_f
+   module procedure mpi_errhandler_f_eq_f08
+   module procedure mpi_file_f08_eq_f
+   module procedure mpi_file_f_eq_f08
+   module procedure mpi_group_f08_eq_f
+   module procedure mpi_group_f_eq_f08
+   module procedure mpi_info_f08_eq_f
+   module procedure mpi_info_f_eq_f08
+   module procedure mpi_op_f08_eq_f
+   module procedure mpi_op_f_eq_f08
+   module procedure mpi_request_f08_eq_f
+   module procedure mpi_request_f_eq_f08
+   module procedure mpi_win_f08_eq_f
+   module procedure mpi_win_f_eq_f08
+   module procedure mpi_message_f08_eq_f
+   module procedure mpi_message_f_eq_f08
+end interface
+private :: mpi_comm_f08_eq_f
+private :: mpi_comm_f_eq_f08
+private :: mpi_datatype_f08_eq_f
+private :: mpi_datatype_f_eq_f08
+private :: mpi_errhandler_f08_eq_f
+private :: mpi_errhandler_f_eq_f08
+private :: mpi_file_f08_eq_f
+private :: mpi_file_f_eq_f08
+private :: mpi_group_f08_eq_f
+private :: mpi_group_f_eq_f08
+private :: mpi_info_f08_eq_f
+private :: mpi_info_f_eq_f08
+private :: mpi_op_f08_eq_f
+private :: mpi_op_f_eq_f08
+private :: mpi_request_f08_eq_f
+private :: mpi_request_f_eq_f08
+private :: mpi_win_f08_eq_f
+private :: mpi_win_f_eq_f08
+private :: mpi_message_f08_eq_f
+private :: mpi_message_f_eq_f08
+
+interface operator(/=)
+   module procedure mpi_comm_f08_ne_f
+   module procedure mpi_comm_f_ne_f08
+   module procedure mpi_datatype_f08_ne_f
+   module procedure mpi_datatype_f_ne_f08
+   module procedure mpi_errhandler_f08_ne_f
+   module procedure mpi_errhandler_f_ne_f08
+   module procedure mpi_file_f08_ne_f
+   module procedure mpi_file_f_ne_f08
+   module procedure mpi_group_f08_ne_f
+   module procedure mpi_group_f_ne_f08
+   module procedure mpi_info_f08_ne_f
+   module procedure mpi_info_f_ne_f08
+   module procedure mpi_op_f08_ne_f
+   module procedure mpi_op_f_ne_f08
+   module procedure mpi_request_f08_ne_f
+   module procedure mpi_request_f_ne_f08
+   module procedure mpi_win_f08_ne_f
+   module procedure mpi_win_f_ne_f08
+   module procedure mpi_message_f08_ne_f
+   module procedure mpi_message_f_ne_f08
+end interface
+private :: mpi_comm_f08_ne_f
+private :: mpi_comm_f_ne_f08
+private :: mpi_datatype_f08_ne_f
+private :: mpi_datatype_f_ne_f08
+private :: mpi_errhandler_f08_ne_f
+private :: mpi_errhandler_f_ne_f08
+private :: mpi_file_f08_ne_f
+private :: mpi_file_f_ne_f08
+private :: mpi_group_f08_ne_f
+private :: mpi_group_f_ne_f08
+private :: mpi_info_f08_ne_f
+private :: mpi_info_f_ne_f08
+private :: mpi_op_f08_ne_f
+private :: mpi_op_f_ne_f08
+private :: mpi_request_f08_ne_f
+private :: mpi_request_f_ne_f08
+private :: mpi_win_f08_ne_f
+private :: mpi_win_f_ne_f08
+private :: mpi_message_f08_ne_f
+private :: mpi_message_f_ne_f08
+
+
+! MPI_Sizeof in 17.1.9
+
+interface MPI_Sizeof
+   module procedure MPI_Sizeof_xint8
+   module procedure MPI_Sizeof_xint16
+   module procedure MPI_Sizeof_xint32
+   module procedure MPI_Sizeof_xint64
+   module procedure MPI_Sizeof_xreal32
+   module procedure MPI_Sizeof_xreal64
+   module procedure MPI_Sizeof_xreal128
+   module procedure MPI_Sizeof_xcomplex32
+   module procedure MPI_Sizeof_xcomplex64
+   module procedure MPI_Sizeof_xcomplex128
+end interface
+
+   private :: MPI_Sizeof_xint8
+   private :: MPI_Sizeof_xint16
+   private :: MPI_Sizeof_xint32
+   private :: MPI_Sizeof_xint64
+   private :: MPI_Sizeof_xreal32
+   private :: MPI_Sizeof_xreal64
+   private :: MPI_Sizeof_xreal128
+   private :: MPI_Sizeof_xcomplex32
+   private :: MPI_Sizeof_xcomplex64
+   private :: MPI_Sizeof_xcomplex128
+
+contains
+
+
+!--> MPI_Sizeof in 17.1.9,  specifics
+
+  subroutine MPI_Sizeof_xint8 (x, size, ierror)
+       use,intrinsic :: iso_fortran_env, only: int8
+       integer(int8),dimension(..) :: x
+       integer, intent(out) :: size
+       integer, optional,  intent(out) :: ierror
+
+       size = storage_size(x)/8
+       if (present(ierror)) ierror = 0
+  end subroutine MPI_Sizeof_xint8
+
+  subroutine MPI_Sizeof_xint16 (x, size, ierror)
+       use,intrinsic :: iso_fortran_env, only: int16
+       integer(int16),dimension(..) :: x
+       integer, intent(out) :: size
+       integer, optional,  intent(out) :: ierror
+
+       size = storage_size(x)/8
+       if (present(ierror)) ierror = 0
+  end subroutine MPI_Sizeof_xint16
+
+  subroutine MPI_Sizeof_xint32 (x, size, ierror)
+       use,intrinsic :: iso_fortran_env, only: int32
+       integer(int32),dimension(..) :: x
+       integer, intent(out) :: size
+       integer, optional,  intent(out) :: ierror
+
+       size = storage_size(x)/8
+       if (present(ierror)) ierror = 0
+  end subroutine MPI_Sizeof_xint32
+
+  subroutine MPI_Sizeof_xint64 (x, size, ierror)
+       use,intrinsic :: iso_fortran_env, only: int64
+       integer(int64),dimension(..) :: x
+       integer, intent(out) :: size
+       integer, optional,  intent(out) :: ierror
+
+       size = storage_size(x)/8
+       if (present(ierror)) ierror = 0
+  end subroutine MPI_Sizeof_xint64
+
+  subroutine MPI_Sizeof_xreal32 (x, size, ierror)
+       use,intrinsic :: iso_fortran_env, only: real32, int32
+       real(real32),dimension(..) :: x
+       integer, intent(out) :: size
+       integer, optional,  intent(out) :: ierror
+
+       size = storage_size(x)/8
+       ierror = 0
+  end subroutine MPI_Sizeof_xreal32
+
+  subroutine MPI_Sizeof_xreal64 (x, size, ierror)
+       use,intrinsic :: iso_fortran_env, only: real64
+       real(real64),dimension(..) :: x
+       integer, intent(out) :: size
+       integer, optional,  intent(out) :: ierror
+
+       size = storage_size(x)/8
+       ierror = 0
+  end subroutine MPI_Sizeof_xreal64
+
+  subroutine MPI_Sizeof_xreal128 (x, size, ierror)
+       use,intrinsic :: iso_fortran_env, only: real128
+       real(real128),dimension(..) :: x
+       integer, intent(out) :: size
+       integer, optional,  intent(out) :: ierror
+
+       size = storage_size(x)/8
+       ierror = 0
+  end subroutine MPI_Sizeof_xreal128
+
+  subroutine MPI_Sizeof_xcomplex32 (x, size, ierror)
+       use,intrinsic :: iso_fortran_env, only: real32
+       complex(real32),dimension(..) :: x
+       integer, intent(out) :: size
+       integer, optional,  intent(out) :: ierror
+
+       size = storage_size(x)/8
+       ierror = 0
+  end subroutine MPI_Sizeof_xcomplex32
+
+  subroutine MPI_Sizeof_xcomplex64 (x, size, ierror)
+       use,intrinsic :: iso_fortran_env, only: real64
+       complex(real64),dimension(..) :: x
+       integer, intent(out) :: size
+       integer, optional,  intent(out) :: ierror
+
+       size = storage_size(x)/8
+       ierror = 0
+  end subroutine MPI_Sizeof_xcomplex64
+
+  subroutine MPI_Sizeof_xcomplex128 (x, size, ierror)
+       use,intrinsic :: iso_fortran_env, only: real128
+       complex(real128),dimension(..) :: x
+       integer, intent(out) :: size
+       integer, optional,  intent(out) :: ierror
+
+       size = storage_size(x)/8
+       ierror = 0
+  end subroutine MPI_Sizeof_xcomplex128
+
+  subroutine mpi_status_f08_assgn_c (status_f08, status_c)
+    ! Defined status_f08 = status_c
+    type(MPI_Status),intent(out) :: status_f08
+    type(c_Status),intent(in)    :: status_c
+
+    status_f08%count_lo   = status_c%count_lo
+    status_f08%count_hi_and_cancelled  = status_c%count_hi_and_cancelled
+    status_f08%mpi_source = status_c%mpi_source
+    status_f08%mpi_tag    = status_c%mpi_tag
+    status_f08%mpi_error  = status_c%mpi_error
+  end subroutine mpi_status_f08_assgn_c
+
+  subroutine mpi_status_c_assgn_f08 (status_c, status_f08)
+    ! Defined status_c = status_f08
+    type(c_Status),intent(out) :: status_c
+    type(MPI_Status),intent(in) :: status_f08
+
+    status_c%count_lo   = status_f08%count_lo
+    status_c%count_hi_and_cancelled  = status_f08%count_hi_and_cancelled
+    status_c%mpi_source = status_f08%mpi_source
+    status_c%mpi_tag    = status_f08%mpi_tag
+    status_c%mpi_error  = status_f08%mpi_error
+  end subroutine mpi_status_c_assgn_f08
+
+  subroutine mpi_status_f_assgn_c (status_f, status_c)
+    ! Defined status_f = status_c
+    use,intrinsic :: iso_fortran_env, only: int32
+    integer,intent(out) :: status_f(MPI_STATUS_SIZE)
+    type (c_Status),intent(in) :: status_c
+
+    status_f(1) = status_c%count_lo
+    status_f(2) = status_c%count_hi_and_cancelled
+    status_f(MPI_SOURCE) = status_c%mpi_source
+    status_f(MPI_TAG)    = status_c%mpi_tag
+    status_f(MPI_ERROR)  = status_c%mpi_error
+  end subroutine mpi_status_f_assgn_c
+
+  subroutine mpi_status_c_assgn_f (status_c, status_f)
+    ! Defined status_c = status_f
+    use,intrinsic :: iso_fortran_env, only: int32
+    integer,intent(in) :: status_f(MPI_STATUS_SIZE)
+    integer(C_count) :: cnt
+    type(c_Status),intent(out) :: status_c
+
+    status_c%count_lo   = status_f(1);
+    status_c%count_hi_and_cancelled  = status_f(2);
+    status_c%mpi_source = status_f(MPI_SOURCE)
+    status_c%mpi_tag    = status_f(MPI_TAG)
+    status_c%mpi_error  = status_f(MPI_ERROR)
+  end subroutine mpi_status_c_assgn_f
+
+! int MPI_Status_f082c(const MPI_F08_status *status_f08, MPI_Status *status_c)
+
+  function MPI_Status_f082c (status_f08, status_c) &
+              BIND(C, name="MPI_Status_f082c") RESULT (res)
+    use,intrinsic :: iso_c_binding, only: c_int
+    type(MPI_Status),intent(in):: status_f08
+    type(c_Status),intent(out) :: status_c
+    integer(c_int)             :: res
+
+    status_c = status_f08
+    res = 0
+  end function MPI_Status_f082c
+
+  function PMPI_Status_f082c (status_f08, status_c) &
+              BIND(C, name="PMPI_Status_f082c") RESULT (res)
+    use,intrinsic :: iso_c_binding, only: c_int
+    type(MPI_Status),intent(in):: status_f08
+    type(c_Status),intent(out) :: status_c
+    integer(c_int)             :: res
+
+    status_c = status_f08
+    res = 0
+  end function PMPI_Status_f082c
+
+  ! int MPI_Status_c2f08(const MPI_Status *status_c, MPI_F08_status *status_f08)
+
+  function MPI_Status_c2f08 (status_c, status_f08) &
+              BIND(C, name="MPI_Status_c2f08") RESULT (res)
+    use,intrinsic :: iso_c_binding, only: c_int
+    type(MPI_Status),intent(in):: status_c
+    type(c_Status),intent(out) :: status_f08
+    integer(c_int)             :: res
+
+    status_f08 = status_c
+    res = 0
+  end function MPI_Status_c2f08
+
+  function PMPI_Status_c2f08 (status_c, status_f08) &
+              BIND(C, name="PMPI_Status_c2f08") RESULT (res)
+    use,intrinsic :: iso_c_binding, only: c_int
+    type(MPI_Status),intent(in):: status_c
+    type(c_Status),intent(out) :: status_f08
+    integer(c_int)             :: res
+
+    status_f08 = status_c
+    res = 0
+  end function PMPI_Status_c2f08
+
+  ! int MPI_Status_f2c(const MPI_Fint *status_f, MPI_Status *status_c)
+
+  function MPI_Status_f2c (status_f, status_c) &
+              BIND(C, name="MPI_Status_f2c") RESULT (res)
+    use,intrinsic :: iso_c_binding, only: c_int
+    integer,intent(in)         :: status_f(MPI_STATUS_SIZE)
+    type(c_Status),intent(out) :: status_c
+    integer(c_int)             :: res
+
+    status_c = status_f
+    res = 0
+  end function MPI_Status_f2c
+
+  function PMPI_Status_f2c (status_f, status_c) &
+              BIND(C, name="PMPI_Status_f2c") RESULT (res)
+    use,intrinsic :: iso_c_binding, only: c_int
+    integer,intent(in)         :: status_f(MPI_STATUS_SIZE)
+    type(c_Status),intent(out) :: status_c
+    integer(c_int)             :: res
+
+    status_c = status_f
+    res = 0
+  end function PMPI_Status_f2c
+
+  ! int MPI_Status_c2f(const MPI_Status *status_c, MPI_Fint *status_f08)
+
+  function MPI_Status_c2f (status_c, status_f) &
+              BIND(C, name="MPI_Status_c2f") RESULT (res)
+    use,intrinsic :: iso_c_binding, only: c_int
+    type(c_Status),intent(in)  :: status_c
+    integer,intent(out)        :: status_f(MPI_STATUS_SIZE)
+    integer(c_int)             :: res
+
+    status_f(:) = status_c
+    res = 0
+  end function MPI_Status_c2f
+
+  function PMPI_Status_c2f (status_c, status_f) &
+              BIND(C, name="PMPI_Status_c2f") RESULT (res)
+    use,intrinsic :: iso_c_binding, only: c_int
+    type(c_Status),intent(in)  :: status_c
+    integer,intent(out)        :: status_f(MPI_STATUS_SIZE)
+    integer(c_int)             :: res
+
+    status_f(:) = status_c
+    res = 0
+  end function PMPI_Status_c2f
+
+
+  function mpi_comm_f08_eq_f (f08, f) result(res)
+    ! Defined comparison for MPI_Comm and integer handles
+    type(MPI_Comm),intent(in) :: f08
+    integer,intent(in)        :: f
+    logical                   :: res
+    res = f08%MPI_VAL == f
+  end function mpi_comm_f08_eq_f
+
+  function mpi_comm_f_eq_f08 (f, f08) result(res)
+    ! Defined comparison for MPI_Comm and integer handles
+    type(MPI_Comm),intent(in) :: f08
+    integer,intent(in)        :: f
+    logical                   :: res
+    res = f08%MPI_VAL == f
+  end function mpi_comm_f_eq_f08
+
+  function mpi_datatype_f08_eq_f (f08, f) result(res)
+    ! Defined comparison for MPI_Datatype and integer handles
+    type(MPI_Datatype),intent(in) :: f08
+    integer,intent(in)        :: f
+    logical                   :: res
+    res = f08%MPI_VAL == f
+  end function mpi_datatype_f08_eq_f
+
+  function mpi_datatype_f_eq_f08 (f, f08) result(res)
+    ! Defined comparison for MPI_Datatype and integer handles
+    type(MPI_Datatype),intent(in) :: f08
+    integer,intent(in)        :: f
+    logical                   :: res
+    res = f08%MPI_VAL == f
+  end function mpi_datatype_f_eq_f08
+
+  function mpi_errhandler_f08_eq_f (f08, f) result(res)
+    ! Defined comparison for MPI_Errhandler and integer handles
+    type(MPI_Errhandler),intent(in) :: f08
+    integer,intent(in)        :: f
+    logical                   :: res
+    res = f08%MPI_VAL == f
+  end function mpi_errhandler_f08_eq_f
+
+  function mpi_errhandler_f_eq_f08 (f, f08) result(res)
+    ! Defined comparison for MPI_Errhandler and integer handles
+    type(MPI_Errhandler),intent(in) :: f08
+    integer,intent(in)        :: f
+    logical                   :: res
+    res = f08%MPI_VAL == f
+  end function mpi_errhandler_f_eq_f08
+
+  function mpi_file_f_eq_f08 (f, f08) result(res)
+    ! Defined comparison for MPI_File and integer handles
+    type(MPI_File),intent(in) :: f08
+    integer,intent(in)        :: f
+    logical                   :: res
+    res = f08%MPI_VAL == f
+  end function mpi_file_f_eq_f08
+
+  function mpi_file_f08_eq_f (f08, f) result(res)
+    ! Defined comparison for MPI_File and integer handles
+    type(MPI_File),intent(in) :: f08
+    integer,intent(in)        :: f
+    logical                   :: res
+    res = f08%MPI_VAL == f
+  end function mpi_file_f08_eq_f
+
+  function mpi_group_f08_eq_f (f08, f) result(res)
+    ! Defined comparison for MPI_Group and integer handles
+    type(MPI_Group),intent(in) :: f08
+    integer,intent(in)        :: f
+    logical                   :: res
+    res = f08%MPI_VAL == f
+  end function mpi_group_f08_eq_f
+
+  function mpi_group_f_eq_f08 (f, f08) result(res)
+    ! Defined comparison for MPI_Group and integer handles
+    type(MPI_Group),intent(in) :: f08
+    integer,intent(in)        :: f
+    logical                   :: res
+    res = f08%MPI_VAL == f
+  end function mpi_group_f_eq_f08
+
+  function mpi_info_f08_eq_f (f08, f) result(res)
+    ! Defined comparison for MPI_Info and integer handles
+    type(MPI_Info),intent(in) :: f08
+    integer,intent(in)        :: f
+    logical                   :: res
+    res = f08%MPI_VAL == f
+  end function mpi_info_f08_eq_f
+
+  function mpi_info_f_eq_f08 (f, f08) result(res)
+    ! Defined comparison for MPI_Info and integer handles
+    type(MPI_Info),intent(in) :: f08
+    integer,intent(in)        :: f
+    logical                   :: res
+    res = f08%MPI_VAL == f
+  end function mpi_info_f_eq_f08
+
+  function mpi_op_f08_eq_f (f08, f) result(res)
+    ! Defined comparison for MPI_Op and integer handles
+    type(MPI_Op),intent(in) :: f08
+    integer,intent(in)        :: f
+    logical                   :: res
+    res = f08%MPI_VAL == f
+  end function mpi_op_f08_eq_f
+
+  function mpi_op_f_eq_f08 (f, f08) result(res)
+    ! Defined comparison for MPI_Op and integer handles
+    type(MPI_Op),intent(in) :: f08
+    integer,intent(in)        :: f
+    logical                   :: res
+    res = f08%MPI_VAL == f
+  end function mpi_op_f_eq_f08
+
+  function mpi_request_f08_eq_f (f08, f) result(res)
+    ! Defined comparison for MPI_Request and integer handles
+    type(MPI_Request),intent(in) :: f08
+    integer,intent(in)        :: f
+    logical                   :: res
+    res = f08%MPI_VAL == f
+  end function mpi_request_f08_eq_f
+
+  function mpi_request_f_eq_f08 (f, f08) result(res)
+    ! Defined comparison for MPI_Request and integer handles
+    type(MPI_Request),intent(in) :: f08
+    integer,intent(in)        :: f
+    logical                   :: res
+    res = f08%MPI_VAL == f
+  end function mpi_request_f_eq_f08
+
+  function mpi_win_f08_eq_f (f08, f) result(res)
+    ! Defined comparison for MPI_Win and integer handles
+    type(MPI_Win),intent(in) :: f08
+    integer,intent(in)        :: f
+    logical                   :: res
+    res = f08%MPI_VAL == f
+  end function mpi_win_f08_eq_f
+
+  function mpi_win_f_eq_f08 (f, f08) result(res)
+    ! Defined comparison for MPI_Win and integer handles
+    type(MPI_Win),intent(in) :: f08
+    integer,intent(in)        :: f
+    logical                   :: res
+    res = f08%MPI_VAL == f
+  end function mpi_win_f_eq_f08
+
+  function mpi_message_f08_eq_f (f08, f) result(res)
+    ! Defined comparison for MPI_Message and integer handles
+    type(MPI_Message),intent(in) :: f08
+    integer,intent(in)        :: f
+    logical                   :: res
+    res = f08%MPI_VAL == f
+  end function mpi_message_f08_eq_f
+
+  function mpi_message_f_eq_f08 (f, f08) result(res)
+    ! Defined comparison for MPI_Message and integer handles
+    type(MPI_Message),intent(in) :: f08
+    integer,intent(in)        :: f
+    logical                   :: res
+    res = f08%MPI_VAL == f
+  end function mpi_message_f_eq_f08
+
+
+  function mpi_comm_f08_ne_f (f08, f) result(res)
+    ! Defined comparison for MPI_Comm and integer handles
+    type(MPI_Comm),intent(in) :: f08
+    integer,intent(in)        :: f
+    logical                   :: res
+    res = f08%MPI_VAL /= f
+  end function mpi_comm_f08_ne_f
+
+  function mpi_comm_f_ne_f08 (f, f08) result(res)
+    ! Defined comparison for MPI_Comm and integer handles
+    type(MPI_Comm),intent(in) :: f08
+    integer,intent(in)        :: f
+    logical                   :: res
+    res = f08%MPI_VAL /= f
+  end function mpi_comm_f_ne_f08
+
+  function mpi_datatype_f08_ne_f (f08, f) result(res)
+    ! Defined comparison for MPI_Datatype and integer handles
+    type(MPI_Datatype),intent(in) :: f08
+    integer,intent(in)        :: f
+    logical                   :: res
+    res = f08%MPI_VAL /= f
+  end function mpi_datatype_f08_ne_f
+
+  function mpi_datatype_f_ne_f08 (f, f08) result(res)
+    ! Defined comparison for MPI_Datatype and integer handles
+    type(MPI_Datatype),intent(in) :: f08
+    integer,intent(in)        :: f
+    logical                   :: res
+    res = f08%MPI_VAL /= f
+  end function mpi_datatype_f_ne_f08
+
+  function mpi_errhandler_f08_ne_f (f08, f) result(res)
+    ! Defined comparison for MPI_Errhandler and integer handles
+    type(MPI_Errhandler),intent(in) :: f08
+    integer,intent(in)        :: f
+    logical                   :: res
+    res = f08%MPI_VAL /= f
+  end function mpi_errhandler_f08_ne_f
+
+  function mpi_errhandler_f_ne_f08 (f, f08) result(res)
+    ! Defined comparison for MPI_Errhandler and integer handles
+    type(MPI_Errhandler),intent(in) :: f08
+    integer,intent(in)        :: f
+    logical                   :: res
+    res = f08%MPI_VAL /= f
+  end function mpi_errhandler_f_ne_f08
+
+  function mpi_file_f_ne_f08 (f, f08) result(res)
+    ! Defined comparison for MPI_File and integer handles
+    type(MPI_File),intent(in) :: f08
+    integer,intent(in)        :: f
+    logical                   :: res
+    res = f08%MPI_VAL /= f
+  end function mpi_file_f_ne_f08
+
+  function mpi_file_f08_ne_f (f08, f) result(res)
+    ! Defined comparison for MPI_File and integer handles
+    type(MPI_File),intent(in) :: f08
+    integer,intent(in)        :: f
+    logical                   :: res
+    res = f08%MPI_VAL /= f
+  end function mpi_file_f08_ne_f
+
+  function mpi_group_f08_ne_f (f08, f) result(res)
+    ! Defined comparison for MPI_Group and integer handles
+    type(MPI_Group),intent(in) :: f08
+    integer,intent(in)        :: f
+    logical                   :: res
+    res = f08%MPI_VAL /= f
+  end function mpi_group_f08_ne_f
+
+  function mpi_group_f_ne_f08 (f, f08) result(res)
+    ! Defined comparison for MPI_Group and integer handles
+    type(MPI_Group),intent(in) :: f08
+    integer,intent(in)        :: f
+    logical                   :: res
+    res = f08%MPI_VAL /= f
+  end function mpi_group_f_ne_f08
+
+  function mpi_info_f08_ne_f (f08, f) result(res)
+    ! Defined comparison for MPI_Info and integer handles
+    type(MPI_Info),intent(in) :: f08
+    integer,intent(in)        :: f
+    logical                   :: res
+    res = f08%MPI_VAL /= f
+  end function mpi_info_f08_ne_f
+
+  function mpi_info_f_ne_f08 (f, f08) result(res)
+    ! Defined comparison for MPI_Info and integer handles
+    type(MPI_Info),intent(in) :: f08
+    integer,intent(in)        :: f
+    logical                   :: res
+    res = f08%MPI_VAL /= f
+  end function mpi_info_f_ne_f08
+
+  function mpi_op_f08_ne_f (f08, f) result(res)
+    ! Defined comparison for MPI_Op and integer handles
+    type(MPI_Op),intent(in) :: f08
+    integer,intent(in)        :: f
+    logical                   :: res
+    res = f08%MPI_VAL /= f
+  end function mpi_op_f08_ne_f
+
+  function mpi_op_f_ne_f08 (f, f08) result(res)
+    ! Defined comparison for MPI_Op and integer handles
+    type(MPI_Op),intent(in) :: f08
+    integer,intent(in)        :: f
+    logical                   :: res
+    res = f08%MPI_VAL /= f
+  end function mpi_op_f_ne_f08
+
+  function mpi_request_f08_ne_f (f08, f) result(res)
+    ! Defined comparison for MPI_Request and integer handles
+    type(MPI_Request),intent(in) :: f08
+    integer,intent(in)        :: f
+    logical                   :: res
+    res = f08%MPI_VAL /= f
+  end function mpi_request_f08_ne_f
+
+  function mpi_request_f_ne_f08 (f, f08) result(res)
+    ! Defined comparison for MPI_Request and integer handles
+    type(MPI_Request),intent(in) :: f08
+    integer,intent(in)        :: f
+    logical                   :: res
+    res = f08%MPI_VAL /= f
+  end function mpi_request_f_ne_f08
+
+  function mpi_win_f08_ne_f (f08, f) result(res)
+    ! Defined comparison for MPI_Win and integer handles
+    type(MPI_Win),intent(in) :: f08
+    integer,intent(in)        :: f
+    logical                   :: res
+    res = f08%MPI_VAL /= f
+  end function mpi_win_f08_ne_f
+
+  function mpi_win_f_ne_f08 (f, f08) result(res)
+    ! Defined comparison for MPI_Win and integer handles
+    type(MPI_Win),intent(in) :: f08
+    integer,intent(in)        :: f
+    logical                   :: res
+    res = f08%MPI_VAL /= f
+  end function mpi_win_f_ne_f08
+
+  function mpi_message_f08_ne_f (f08, f) result(res)
+    ! Defined comparison for MPI_Message and integer handles
+    type(MPI_Message),intent(in) :: f08
+    integer,intent(in)        :: f
+    logical                   :: res
+    res = f08%MPI_VAL /= f
+  end function mpi_message_f08_ne_f
+
+  function mpi_message_f_ne_f08 (f, f08) result(res)
+    ! Defined comparison for MPI_Message and integer handles
+    type(MPI_Message),intent(in) :: f08
+    integer,intent(in)        :: f
+    logical                   :: res
+    res = f08%MPI_VAL /= f
+  end function mpi_message_f_ne_f08
+
+! 17.2.4 - Conversion between Fortran and C handles
+
+!  MPI_Comm MPI_Comm_f2c(MPI_Fint comm)
+
+  function mpi_comm_f2c (comm) bind(c,name="MPI_Comm_f2c") result (res)
+    use mpi_c_interface_types, only: C_comm
+    integer,value :: comm
+    integer(C_comm) :: res
+
+    res = comm
+  end function mpi_comm_f2c
+
+  function pmpi_comm_f2c (comm) bind(c,name="PMPI_Comm_f2c") result (res)
+    use mpi_c_interface_types, only: C_comm
+    integer,value :: comm
+    integer(C_comm) :: res
+
+    res = comm
+  end function pmpi_comm_f2c
+
+
+!  MPI_Fint MPI_Comm_c2f(MPI_Comm comm)
+
+  function mpi_comm_c2f (comm) bind(c,name="MPI_Comm_c2f") result (res)
+    use mpi_c_interface_types, only: C_comm
+    integer(C_comm),value :: comm
+    integer :: res
+
+    res = comm
+  end function mpi_comm_c2f
+
+  function pmpi_comm_c2f (comm) bind(c,name="PMPI_Comm_c2f") result (res)
+    use mpi_c_interface_types, only: C_comm
+    integer(C_comm),value :: comm
+    integer :: res
+
+    res = comm
+  end function pmpi_comm_c2f
+
+
+!  MPI_Type MPI_Type_f2c(MPI_Fint type)
+
+  function mpi_type_f2c (datatype) bind(c,name="MPI_Type_f2c") result (res)
+    use mpi_c_interface_types, only: C_datatype
+    integer,value :: datatype
+    integer(C_datatype) :: res
+
+    res = datatype
+  end function mpi_type_f2c
+
+  function pmpi_type_f2c (datatype) bind(c,name="PMPI_Type_f2c") result (res)
+    use mpi_c_interface_types, only: C_datatype
+    integer,value :: datatype
+    integer(C_datatype) :: res
+
+    res = datatype
+  end function pmpi_type_f2c
+
+!  MPI_Fint MPI_Type_c2f(MPI_Type type)
+
+  function mpi_type_c2f (datatype) bind(c,name="MPI_Type_c2f") result (res)
+    use mpi_c_interface_types, only: C_datatype
+    integer(C_datatype),value :: datatype
+    integer :: res
+
+    res = datatype
+  end function mpi_type_c2f
+
+  function pmpi_type_c2f (datatype) bind(c,name="PMPI_Type_c2f") result (res)
+    use mpi_c_interface_types, only: C_datatype
+    integer(C_datatype),value :: datatype
+    integer :: res
+
+    res = datatype
+  end function pmpi_type_c2f
+
+!  MPI_Group MPI_Group_f2c(MPI_Fint group)
+
+  function mpi_group_f2c (group) bind(c,name="MPI_Group_f2c") result (res)
+    use mpi_c_interface_types, only: C_group
+    integer,value :: group
+    integer(C_group) :: res
+
+    res = group
+  end function mpi_group_f2c
+
+  function pmpi_group_f2c (group) bind(c,name="PMPI_Group_f2c") result (res)
+    use mpi_c_interface_types, only: C_group
+    integer,value :: group
+    integer(C_group) :: res
+
+    res = group
+  end function pmpi_group_f2c
+
+
+!  MPI_Fint MPI_Group_c2f(MPI_Datatype datatype)
+
+  function mpi_group_c2f (group) bind(c,name="MPI_Group_c2f") result (res)
+    use mpi_c_interface_types, only: C_group
+    integer(C_group),value :: group
+    integer :: res
+
+    res = group
+  end function mpi_group_c2f
+
+  function pmpi_group_c2f (group) bind(c,name="PMPI_Group_c2f") result (res)
+    use mpi_c_interface_types, only: C_group
+    integer(C_group),value :: group
+    integer :: res
+
+    res = group
+  end function pmpi_group_c2f
+
+
+!  MPI_Request MPI_Request_f2c(MPI_Fint request)
+
+  function mpi_request_f2c (request) bind(c,name="MPI_Request_f2c") result (res)
+    use mpi_c_interface_types, only: C_request
+    integer,value :: request
+    integer(C_request) :: res
+
+    res = request
+  end function mpi_request_f2c
+
+  function pmpi_request_f2c (request) bind(c,name="PMPI_Request_f2c") result (res)
+    use mpi_c_interface_types, only: C_request
+    integer,value :: request
+    integer(C_request) :: res
+
+    res = request
+  end function pmpi_request_f2c
+
+
+!  MPI_Fint MPI_Request_c2f(MPI_Datatype datatype)
+
+  function mpi_request_c2f (request) bind(c,name="MPI_Request_c2f") result (res)
+    use mpi_c_interface_types, only: C_request
+    integer(C_request),value :: request
+    integer :: res
+
+    res = request
+  end function mpi_request_c2f
+
+  function pmpi_request_c2f (request) bind(c,name="PMPI_Request_c2f") result (res)
+    use mpi_c_interface_types, only: C_request
+    integer(C_request),value :: request
+    integer :: res
+
+    res = request
+  end function pmpi_request_c2f
+
+
+
+!  MPI_File MPI_File_f2c(MPI_Fint file)
+
+  function mpi_file_f2c (file) bind(c,name="MPI_File_f2c") result (res)
+    use mpi_c_interface_types, only: C_file
+    integer,value :: file
+    integer(C_file) :: res
+
+    res = file
+  end function mpi_file_f2c
+
+  function pmpi_file_f2c (file) bind(c,name="PMPI_File_f2c") result (res)
+    use mpi_c_interface_types, only: C_file
+    integer,value :: file
+    integer(C_file) :: res
+
+    res = file
+  end function pmpi_file_f2c
+
+
+!  MPI_Fint MPI_File_c2f(MPI_Datatype datatype)
+
+  function mpi_file_c2f (file) bind(c,name="MPI_File_c2f") result (res)
+    use mpi_c_interface_types, only: C_file
+    integer(C_file),value :: file
+    integer :: res
+
+    res = file
+  end function mpi_file_c2f
+
+  function pmpi_file_c2f (file) bind(c,name="PMPI_File_c2f") result (res)
+    use mpi_c_interface_types, only: C_file
+    integer(C_file),value :: file
+    integer :: res
+
+    res = file
+  end function pmpi_file_c2f
+
+
+!  MPI_Win MPI_Win_f2c(MPI_Fint win)
+
+  function mpi_win_f2c (win) bind(c,name="MPI_Win_f2c") result (res)
+    use mpi_c_interface_types, only: C_win
+    integer,value :: win
+    integer(C_win) :: res
+
+    res = win
+  end function mpi_win_f2c
+
+  function pmpi_win_f2c (win) bind(c,name="PMPI_Win_f2c") result (res)
+    use mpi_c_interface_types, only: C_win
+    integer,value :: win
+    integer(C_win) :: res
+
+    res = win
+  end function pmpi_win_f2c
+
+
+!  MPI_Fint MPI_Win_c2f(MPI_Datatype datatype)
+
+  function mpi_win_c2f (win) bind(c,name="MPI_Win_c2f") result (res)
+    use mpi_c_interface_types, only: C_win
+    integer(C_win),value :: win
+    integer :: res
+
+    res = win
+  end function mpi_win_c2f
+
+  function pmpi_win_c2f (win) bind(c,name="PMPI_Win_c2f") result (res)
+    use mpi_c_interface_types, only: C_win
+    integer(C_win),value :: win
+    integer :: res
+
+    res = win
+  end function pmpi_win_c2f
+
+!  MPI_Op MPI_Op_f2c(MPI_Fint op)
+
+  function mpi_op_f2c (op) bind(c,name="MPI_Op_f2c") result (res)
+    use mpi_c_interface_types, only: C_op
+    integer,value :: op
+    integer(C_op) :: res
+
+    res = op
+  end function mpi_op_f2c
+
+  function pmpi_op_f2c (op) bind(c,name="PMPI_Op_f2c") result (res)
+    use mpi_c_interface_types, only: C_op
+    integer,value :: op
+    integer(C_op) :: res
+
+    res = op
+  end function pmpi_op_f2c
+
+
+!  MPI_Fint MPI_Op_c2f(MPI_Datatype datatype)
+
+  function mpi_op_c2f (op) bind(c,name="MPI_Op_c2f") result (res)
+    use mpi_c_interface_types, only: C_op
+    integer(C_op),value :: op
+    integer :: res
+
+    res = op
+  end function mpi_op_c2f
+
+  function pmpi_op_c2f (op) bind(c,name="PMPI_Op_c2f") result (res)
+    use mpi_c_interface_types, only: C_op
+    integer(C_op),value :: op
+    integer :: res
+
+    res = op
+  end function pmpi_op_c2f
+
+!  MPI_Info MPI_Info_f2c(MPI_Fint info)
+
+  function mpi_info_f2c (info) bind(c,name="MPI_Info_f2c") result (res)
+    use mpi_c_interface_types, only: C_info
+    integer,value :: info
+    integer(C_info) :: res
+
+    res = info
+  end function mpi_info_f2c
+
+  function pmpi_info_f2c (info) bind(c,name="PMPI_Info_f2c") result (res)
+    use mpi_c_interface_types, only: C_info
+    integer,value :: info
+    integer(C_info) :: res
+
+    res = info
+  end function pmpi_info_f2c
+
+
+!  MPI_Fint MPI_Info_c2f(MPI_Datatype datatype)
+
+  function mpi_info_c2f (info) bind(c,name="MPI_Info_c2f") result (res)
+    use mpi_c_interface_types, only: C_info
+    integer(C_info),value :: info
+    integer :: res
+
+    res = info
+  end function mpi_info_c2f
+
+  function pmpi_info_c2f (info) bind(c,name="PMPI_Info_c2f") result (res)
+    use mpi_c_interface_types, only: C_info
+    integer(C_info),value :: info
+    integer :: res
+
+    res = info
+  end function pmpi_info_c2f
+
+!  MPI_Errhandler MPI_Errhandler_f2c(MPI_Fint errhandler)
+
+  function mpi_errhandler_f2c (errhandler) bind(c,name="MPI_Errhandler_f2c") result (res)
+    use mpi_c_interface_types, only: C_errhandler
+    integer,value :: errhandler
+    integer(C_errhandler) :: res
+
+    res = errhandler
+  end function mpi_errhandler_f2c
+
+  function pmpi_errhandler_f2c (errhandler) bind(c,name="PMPI_Errhandler_f2c") result (res)
+    use mpi_c_interface_types, only: C_errhandler
+    integer,value :: errhandler
+    integer(C_errhandler) :: res
+
+    res = errhandler
+  end function pmpi_errhandler_f2c
+
+
+!  MPI_Fint MPI_Errhandler_c2f(MPI_Datatype datatype)
+
+  function mpi_errhandler_c2f (errhandler) bind(c,name="MPI_Errhandler_c2f") result (res)
+    use mpi_c_interface_types, only: C_errhandler
+    integer(C_errhandler),value :: errhandler
+    integer :: res
+
+    res = errhandler
+  end function mpi_errhandler_c2f
+
+  function pmpi_errhandler_c2f (errhandler) bind(c,name="PMPI_Errhandler_c2f") result (res)
+    use mpi_c_interface_types, only: C_errhandler
+    integer(C_errhandler),value :: errhandler
+    integer :: res
+
+    res = errhandler
+  end function pmpi_errhandler_c2f
+
+!  MPI_Message MPI_Message_f2c(MPI_Fint message)
+
+  function mpi_message_f2c (message) bind(c,name="MPI_Message_f2c") result (res)
+    use mpi_c_interface_types, only: C_message
+    integer,value :: message
+    integer(C_message) :: res
+
+    res = message
+  end function mpi_message_f2c
+
+  function pmpi_message_f2c (message) bind(c,name="PMPI_Message_f2c") result (res)
+    use mpi_c_interface_types, only: C_message
+    integer,value :: message
+    integer(C_message) :: res
+
+    res = message
+  end function pmpi_message_f2c
+
+
+!  MPI_Fint MPI_Message_c2f(MPI_Datatype datatype)
+
+  function mpi_message_c2f (message) bind(c,name="MPI_Message_c2f") result (res)
+    use mpi_c_interface_types, only: C_message
+    integer(C_message),value :: message
+    integer :: res
+
+    res = message
+  end function mpi_message_c2f
+
+  function pmpi_message_c2f (message) bind(c,name="PMPI_Message_c2f") result (res)
+    use mpi_c_interface_types, only: C_message
+    integer(C_message),value :: message
+    integer :: res
+
+    res = message
+  end function pmpi_message_c2f
+
+
+END MODULE mpi_f08_types
+
diff --git a/src/binding/fortran/use_mpi_f08/tests/Makefile b/src/binding/fortran/use_mpi_f08/tests/Makefile
new file mode 100644
index 0000000..10a2c65
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/tests/Makefile
@@ -0,0 +1,98 @@
+FC=gfortran
+
+PROG=fort_mpi_tests
+
+TEST_OBJS=\
+	fort_mpi_test1.o \
+	fort_mpi_test2.o \
+	fort_mpi_test3.o \
+	fort_mpi_test4.o \
+	fort_mpi_test5.o \
+	fort_mpi_test6.o \
+	fort_mpi_test7.o \
+	fort_mpi_test8.o \
+	fort_mpi_test9.o \
+	fort_mpi_test10.o \
+	fort_mpi_test11.o \
+	fort_mpi_test12.o \
+	fort_mpi_test18.o \
+	fort_mpi_test19.o \
+
+F08_MOD=../MPI_F08.mod
+F08_MOD_INC=-I ../
+F08_MOD_LINK=-L../ -lmpi_f08
+BINDLIB=../cdesc/libcdesc.a
+BINDLIB_LINK=-L../cdesc -L../f08ts -lf08ts -lcdesc
+
+all: $(PROG)
+
+fort_mpi_tests:	fort_mpi_tests.o $(F08_MOD) $(TEST_OBJS) $(BINDLIB)
+	$(FC) -o fort_mpi_tests fort_mpi_tests.o $(TEST_OBJS) $(BINDLIB_LINK) $(F08_MOD_LINK)
+
+fort_mpi_tests.o:	fort_mpi_tests.f90 $(F08_MOD)
+	$(FC) -c fort_mpi_tests.f90 $(F08_MOD_INC)
+
+fort_mpi_test1.o:	fort_mpi_test1.f90 $(F08_MOD)
+	$(FC) -c fort_mpi_test1.f90  $(F08_MOD_INC)
+
+fort_mpi_test2.o:	fort_mpi_test2.f90 $(F08_MOD)
+	$(FC) -c fort_mpi_test2.f90  $(F08_MOD_INC)
+
+fort_mpi_test3.o:	fort_mpi_test3.f90 $(F08_MOD)
+	$(FC) -c fort_mpi_test3.f90  $(F08_MOD_INC)
+
+fort_mpi_test4.o:	fort_mpi_test4.f90 $(F08_MOD)
+	$(FC) -c fort_mpi_test4.f90  $(F08_MOD_INC)
+
+fort_mpi_test5.o:	fort_mpi_test5.f90 $(F08_MOD)
+	$(FC) -c fort_mpi_test5.f90  $(F08_MOD_INC)
+
+fort_mpi_test6.o:	fort_mpi_test6.f90 $(F08_MOD)
+	$(FC) -c fort_mpi_test6.f90  $(F08_MOD_INC)
+
+fort_mpi_test7.o:	fort_mpi_test7.f90 $(F08_MOD)
+	$(FC) -c fort_mpi_test7.f90  $(F08_MOD_INC)
+
+fort_mpi_test8.o:	fort_mpi_test8.f90 $(F08_MOD)
+	$(FC) -c fort_mpi_test8.f90  $(F08_MOD_INC)
+
+fort_mpi_test9.o:	fort_mpi_test9.f90 $(F08_MOD)
+	$(FC) -c fort_mpi_test9.f90  $(F08_MOD_INC)
+
+fort_mpi_test10.o:	fort_mpi_test10.f90 $(F08_MOD)
+	$(FC) -c fort_mpi_test10.f90  $(F08_MOD_INC)
+
+fort_mpi_test11.o:	fort_mpi_test11.f90 $(F08_MOD)
+	$(FC) -c fort_mpi_test11.f90  $(F08_MOD_INC)
+
+fort_mpi_test12.o:	fort_mpi_test12.f90 $(F08_MOD)
+	$(FC) -c fort_mpi_test12.f90  $(F08_MOD_INC)
+
+fort_mpi_test18.o:	fort_mpi_test18.f90 $(F08_MOD)
+	$(FC) -c fort_mpi_test18.f90  $(F08_MOD_INC)
+
+fort_mpi_test19.o:	fort_mpi_test19.f90 $(F08_MOD)
+	$(FC) -c fort_mpi_test19.f90  $(F08_MOD_INC)
+
+clean:
+	rm -f *.o *.mod
+
+clobber:	clean
+	rm -f $(PROG)
+
+checkrcs:
+	sh ../util/checkrcs.sh
+
+# OLD - but should still work
+
+fort_test_2d:	$(F08_MOD) $(BINDLIB) fort_test_2d.o
+	$(FC) -o fort_test_2d fort_test_2d.o $(F08_MOD_LINK) $(BINDLIB_LINK)
+
+fort_test_2d.o:	fort_test_2d.f90
+	$(FC) -c fort_test_2d.f90 -I mpi_f08
+
+fort_test:	$(F08_MOD) $(BINDLIB) fort_test.o
+	$(FC) -o fort_test fort_test.o  $(F08_MOD_LINK) $(BINDLIB_LINK)
+
+fort_test.o:	fort_test.f90 $(F08_MOD)
+	$(FC) -c fort_test.f90 -I mpi_f08
diff --git a/src/binding/fortran/use_mpi_f08/tests/fort_mpi_test1.f90 b/src/binding/fortran/use_mpi_f08/tests/fort_mpi_test1.f90
new file mode 100644
index 0000000..f651794
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/tests/fort_mpi_test1.f90
@@ -0,0 +1,41 @@
+
+subroutine test1(rank)
+    use mpi_f08
+    implicit none
+
+    character*8 :: name='test1'
+    character*80 :: title='test 1: Send/Recv - send integer'
+    
+    integer :: rank, ierr, sint, i
+    integer, dimension(10) :: iar
+    type(MPI_Status) status
+    
+    if (rank .eq. 0) then
+        sint = 789
+        print *, ' ===== ', trim(title), ' ====='
+        print *, "rank 0 sends ", sint
+        ierr = MPI_SUCCESS
+        call mpi_send(sint, 1, MPI_INTEGER, 1, 567, MPI_COMM_WORLD, ierr);
+        if (ierr .ne. MPI_SUCCESS) then
+            print *,"PE ",rank,": ",name,": mpi_send exited in error (",ierr,")"
+        endif
+    else
+        ierr = MPI_SUCCESS
+        call mpi_recv(sint, 1, MPI_INTEGER, 0, 567, MPI_COMM_WORLD, status, ierr);
+        if (ierr .ne. MPI_SUCCESS) then
+            print *,"PE ",rank,": ",name,"mpi_recv exited in error (",ierr,")"
+        endif
+        print *, "rank 1 receives ",sint
+        if (sint .eq. 789) then
+            print *, "PE ", rank,": PASS - ", trim(title)
+        else
+            print *, "PE ", rank,": FAIL - ", trim(title)
+        endif
+    endif
+
+    call MPI_Barrier(MPI_COMM_WORLD, ierr);
+    if (ierr .ne. MPI_SUCCESS) then
+        print *,"PE ",rank,": ",name,": mpi_barrier exited in error (",ierr,")"
+        call MPI_Abort(MPI_COMM_WORLD, 9);
+    endif
+end
diff --git a/src/binding/fortran/use_mpi_f08/tests/fort_mpi_test10.f90 b/src/binding/fortran/use_mpi_f08/tests/fort_mpi_test10.f90
new file mode 100644
index 0000000..66287f5
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/tests/fort_mpi_test10.f90
@@ -0,0 +1,63 @@
+
+subroutine test10(rank)
+    use mpi_f08
+    implicit none
+
+    character*8 :: name='test10'
+    character*80 :: title='test 10: Isend/Irecv - send integer'
+    
+    integer :: rank, ierr, sint, i
+    integer, dimension(10) :: iar
+    type(MPI_Request) request
+    type(MPI_Status) status
+    
+    if (rank .eq. 0) then
+        sint = 789
+        print *, ' ===== ', trim(title), ' ====='
+        print *, "rank 0 sends ", sint
+        ierr = MPI_SUCCESS
+
+        block
+            ASYNCHRONOUS :: sint
+
+            call mpi_isend(sint, 1, MPI_INTEGER, 1, 567, MPI_COMM_WORLD, request, ierr);
+            if (ierr .ne. MPI_SUCCESS) then
+                print *,"PE ",rank,": ",name,": mpi_isend exited in error (",ierr,")"
+            endif
+
+            call mpi_wait(request, status, ierr)
+            if (ierr .ne. MPI_SUCCESS) then
+                print *,"PE ",rank,": ",name,": mpi_wait exited in error (",ierr,")"
+            endif
+        end block
+    else
+        ierr = MPI_SUCCESS
+
+        block
+            ASYNCHRONOUS :: sint
+
+            call mpi_irecv(sint, 1, MPI_INTEGER, 0, 567, MPI_COMM_WORLD, request, ierr);
+            if (ierr .ne. MPI_SUCCESS) then
+                print *,"PE ",rank,": ",name,"mpi_irecv exited in error (",ierr,")"
+            endif
+
+            call mpi_wait(request, status, ierr)
+            if (ierr .ne. MPI_SUCCESS) then
+                print *,"PE ",rank,": ",name,": mpi_wait exited in error (",ierr,")"
+            endif
+        end block
+
+        print *, "rank 1 receives ",sint
+        if (sint .eq. 789) then
+            print *, "PE ", rank,": PASS - ", trim(title)
+        else
+            print *, "PE ", rank,": FAIL - ", trim(title)
+        endif
+    endif
+
+    call MPI_Barrier(MPI_COMM_WORLD, ierr);
+    if (ierr .ne. MPI_SUCCESS) then
+        print *,"PE ",rank,": ",name,": mpi_barrier exited in error (",ierr,")"
+        call MPI_Abort(MPI_COMM_WORLD, 9);
+    endif
+end
diff --git a/src/binding/fortran/use_mpi_f08/tests/fort_mpi_test11.f90 b/src/binding/fortran/use_mpi_f08/tests/fort_mpi_test11.f90
new file mode 100644
index 0000000..2831bef
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/tests/fort_mpi_test11.f90
@@ -0,0 +1,74 @@
+
+subroutine test11(rank)
+    use mpi_f08
+    implicit none
+
+    character (len=10) :: name='test11'
+    character (len=80) :: title='test 11: Isend/Irecv - 1d array - iar(10)'
+    
+    integer :: rank, ierr, sint, i, errors
+    integer, dimension(10) :: iar
+    type(MPI_Request) request
+    type(MPI_Status) status
+    
+    if (rank .eq. 0) then
+        print *, ' ===== ', trim(title), ' ====='
+        do i=1,10
+            iar(i)=i
+        end do
+        ierr = MPI_SUCCESS
+
+        block
+            ASYNCHRONOUS :: iar
+
+            call mpi_isend(iar, 10, MPI_INTEGER, 1, 567, MPI_COMM_WORLD, request, ierr);
+            if (ierr .ne. MPI_SUCCESS) then
+                print *,"PE ",rank,": ",name,": mpi_isend exited in error (",ierr,")"
+            endif
+
+            call mpi_wait(request, status, ierr)
+            if (ierr .ne. MPI_SUCCESS) then
+                print *,"PE ",rank,": ",name,": mpi_wait exited in error (",ierr,")"
+            endif
+
+        end block
+
+    else if (rank .eq. 1) then
+        ierr = MPI_SUCCESS
+
+        block
+            ASYNCHRONOUS :: iar
+
+            call mpi_irecv(iar, 10, MPI_INTEGER, 0, 567, MPI_COMM_WORLD, request, ierr);
+            if (ierr .ne. MPI_SUCCESS) then
+                print *,"PE ",rank,": ",name,"mpi_irecv exited in error (",ierr,")"
+            endif
+
+            call mpi_wait(request, status, ierr)
+            if (ierr .ne. MPI_SUCCESS) then
+                print *,"PE ",rank,": ",name,": mpi_wait exited in error (",ierr,")"
+            endif
+
+        end block
+
+        errors = 0
+        do i=1,10
+            if (iar(i) .ne. i) then
+                print *, "rank 1: iar(", i, ")=", iar(i), ", expected ",i
+                errors = errors + 1
+            endif
+        end do
+        if (errors .eq. 0) then
+            print *, "PE ", rank,": PASS - ", trim(title)
+        else
+            print *, "PE ", rank,": FAIL - ", trim(title)
+        endif
+        print *, iar(1), iar(2), iar(3), iar(4), iar(5), iar(6), iar(7), iar(8), iar(9)
+    endif
+
+    call MPI_Barrier(MPI_COMM_WORLD, ierr);
+    if (ierr .ne. MPI_SUCCESS) then
+        print *,"PE ",rank,": ",name,": mpi_barrier exited in error (",ierr,")"
+        call MPI_Abort(MPI_COMM_WORLD, 9);
+    endif
+end subroutine test11
diff --git a/src/binding/fortran/use_mpi_f08/tests/fort_mpi_test12.f90 b/src/binding/fortran/use_mpi_f08/tests/fort_mpi_test12.f90
new file mode 100644
index 0000000..0b2ed19
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/tests/fort_mpi_test12.f90
@@ -0,0 +1,81 @@
+
+subroutine test12(rank)
+    use mpi_f08
+    implicit none
+
+    character (len=10) :: name='test12'
+    character (len=80) :: title='test 12: Isend/Irecv array slice - iar(2:7)'
+    
+    integer :: rank, ierr, sint, i, errors
+    integer, dimension(10) ::  iar, iar_check
+    type(MPI_Request) request
+    type(MPI_Status) status
+    
+    if (rank .eq. 0) then
+        print *, ' ===== ', trim(title), ' ====='
+        do i=1,10
+            iar(i)=i
+        end do
+        ierr = MPI_SUCCESS
+
+        block
+            ASYNCHRONOUS :: iar
+
+            call mpi_isend(iar(2:7), 6, MPI_INTEGER, 1, 678, MPI_COMM_WORLD, request, ierr);
+            if (ierr .ne. MPI_SUCCESS) then
+                print *,"PE ",rank,": ",name,": mpi_isend exited in error (",ierr,")"
+            endif
+
+            call mpi_wait(request, status, ierr)
+            if (ierr .ne. MPI_SUCCESS) then
+                print *,"PE ",rank,": ",name,": mpi_wait exited in error (",ierr,")"
+            endif
+
+        end block
+
+    else if (rank .eq. 1) then
+        do i=1,10
+            iar(i)=0
+            iar_check(i)=0
+        end do
+        do i=2,7
+            iar_check(i)=i
+        end do
+        ierr = MPI_SUCCESS
+
+        block
+            ASYNCHRONOUS :: iar
+
+            call mpi_irecv(iar(2:7), 6, MPI_INTEGER, 0, 678, MPI_COMM_WORLD, request, ierr);
+            if (ierr .ne. MPI_SUCCESS) then
+                print *,"PE ",rank,": ",name,"mpi_irecv exited in error (",ierr,")"
+            endif
+
+            call mpi_wait(request, status, ierr)
+            if (ierr .ne. MPI_SUCCESS) then
+                print *,"PE ",rank,": ",name,": mpi_wait exited in error (",ierr,")"
+            endif
+
+        end block
+
+        errors = 0
+        do i=1,10
+            if (iar(i) .ne. iar_check(i)) then
+                print *, "rank 1: iar(", i, ")=", iar(i), ", expected ",iar_check(i)
+                errors = errors + 1
+            endif
+        end do
+        if (errors .eq. 0) then
+            print *, "PE ", rank,": PASS - test 12 - ", trim(title)
+        else
+            print *, "PE ", rank,": FAIL - test 12 - ", trim(title)
+        endif
+        print *, iar(1), iar(2), iar(3), iar(4), iar(5), iar(6), iar(7), iar(8), iar(9)
+    endif
+
+    call MPI_Barrier(MPI_COMM_WORLD, ierr);
+    if (ierr .ne. MPI_SUCCESS) then
+        print *,"PE ",rank,": ",name,": mpi_barrier exited in error (",ierr,")"
+        call MPI_Abort(MPI_COMM_WORLD, 9);
+    endif
+end subroutine test12
diff --git a/src/binding/fortran/use_mpi_f08/tests/fort_mpi_test18.f90 b/src/binding/fortran/use_mpi_f08/tests/fort_mpi_test18.f90
new file mode 100644
index 0000000..666243e
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/tests/fort_mpi_test18.f90
@@ -0,0 +1,109 @@
+
+subroutine test18(rank)
+    use mpi_f08
+    implicit none
+
+    character (len=10) :: name='test18'
+    character (len=80) :: title='test 18: Isend/Irecv 2d array column slice - iar_2d(:,2:6:2)'
+    
+    integer :: rank, ierr, i, errors, j
+    integer, dimension(9,9) :: iar_2d, iar_2dch
+    type(MPI_Status) status
+    type(MPI_Request) request
+    
+    if (rank .eq. 0) then
+        print *, ' ===== ', trim(title), ' ====='
+
+        do i=1,9
+            do j=1,9
+                iar_2d(j,i) = (j * 10) + i
+            end do
+        end do
+
+        do j=1,9
+            print *, (iar_2d(i,j),i=1,9)
+        end do
+
+    else
+        do i=1,9
+            do j=1,9
+                iar_2d(j,i) = 0
+                iar_2dch(j,i) = 0
+            end do
+        end do
+
+        do i=2,6,2
+            do j=1,9
+                iar_2dch(j,i) = (j * 10) + i
+            end do
+        end do
+    endif
+
+    call MPI_Barrier(MPI_COMM_WORLD, ierr);
+    if (ierr .ne. MPI_SUCCESS) then
+        print *,"PE ",rank,": ",name,": A: mpi_barrier exited in error (",ierr,")"
+        call MPI_Abort(MPI_COMM_WORLD, 9);
+    endif
+
+    if (rank .eq. 0) then
+
+        ierr = MPI_SUCCESS
+
+        block
+            ASYNCHRONOUS :: iar_2d
+
+            call mpi_isend(iar_2d(:,2:6:2), 27, MPI_INTEGER, 1, 123, MPI_COMM_WORLD, request, ierr);
+            if (ierr .ne. MPI_SUCCESS) then
+                print *,"PE ",rank,": ",name,": mpi_isend exited in error (",ierr,")"
+            endif
+
+            call mpi_wait(request, status, ierr)
+            if (ierr .ne. MPI_SUCCESS) then
+                print *,"PE ",rank,": ",name,": mpi_wait exited in error (",ierr,")"
+            endif
+
+        end block
+
+    else if (rank .eq. 1) then
+
+        ierr = MPI_SUCCESS
+
+        block
+            ASYNCHRONOUS :: iar_2d
+
+            call mpi_irecv(iar_2d(:,2:6:2), 27, MPI_INTEGER, 0, 123, MPI_COMM_WORLD, request, ierr);
+            if (ierr .ne. MPI_SUCCESS) then
+                print *,"PE ",rank,": ",name,"mpi_irecv exited in error (",ierr,")"
+            endif
+
+            call mpi_wait(request, status, ierr)
+            if (ierr .ne. MPI_SUCCESS) then
+                print *,"PE ",rank,": ",name,": mpi_wait exited in error (",ierr,")"
+            endif
+        end block
+
+        errors = 0
+        do i=1,9
+            do j=1,9
+                if (iar_2d(j,i) .ne. iar_2dch(j,i)) then
+                    print *, "rank 1: iar_2d(", j, ",", i, ")=", iar_2d(j,i), ", expected ", iar_2dch(j,i)
+                    errors = errors + 1
+                endif
+            end do
+        end do
+        if (errors .eq. 0) then
+            print *, "PE ", rank,": PASS - ", trim(title)
+        else
+            print *, "PE ", rank,": FAIL - ", trim(title)
+        endif
+        do j=1,9
+            print *, (iar_2d(i,j),i=1,9)
+        end do
+    endif
+
+    call MPI_Barrier(MPI_COMM_WORLD, ierr);
+    if (ierr .ne. MPI_SUCCESS) then
+        print *,"PE ",rank,": ",name,": mpi_barrier exited in error (",ierr,")"
+        call MPI_Abort(MPI_COMM_WORLD, 9);
+    endif
+end subroutine test18
diff --git a/src/binding/fortran/use_mpi_f08/tests/fort_mpi_test19.f90 b/src/binding/fortran/use_mpi_f08/tests/fort_mpi_test19.f90
new file mode 100644
index 0000000..c6fd97d
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/tests/fort_mpi_test19.f90
@@ -0,0 +1,107 @@
+
+subroutine test19(rank)
+    use mpi_f08
+    implicit none
+
+    character (len=10) :: name='test19'
+    character (len=80) :: title='test 19: Isend/Irecv 2d array column slice - iar_2d(1:7:3,2:6:2)'
+    
+    integer :: rank, ierr, i, errors, j
+    integer, dimension(9,9) :: iar_2d, iar_2dch
+    type(MPI_Status) status
+    type(MPI_Request) request
+    
+    if (rank .eq. 0) then
+        print *, ' ===== ', trim(title), ' ====='
+
+        do i=1,9
+            do j=1,9
+                iar_2d(j,i) = (j * 10) + i
+            end do
+        end do
+
+        do j=1,9
+            print *, (iar_2d(i,j),i=1,9)
+        end do
+
+    else
+        do i=1,9
+            do j=1,9
+                iar_2d(j,i) = 0
+                iar_2dch(j,i) = 0
+            end do
+        end do
+        do i=2,6,2
+            do j=1,7,3
+                iar_2dch(j,i) = (j * 10) + i
+            end do
+        end do
+
+    endif
+
+    call MPI_Barrier(MPI_COMM_WORLD, ierr);
+    if (ierr .ne. MPI_SUCCESS) then
+        print *,"PE ",rank,": ",name,": A: mpi_barrier exited in error (",ierr,")"
+        call MPI_Abort(MPI_COMM_WORLD, 9);
+    endif
+
+    if (rank .eq. 0) then
+        ierr = MPI_SUCCESS
+
+        block
+            ASYNCHRONOUS :: iar_2d
+            call mpi_isend(iar_2d(1:7:3,2:6:2), 27, MPI_INTEGER, 1, 123, MPI_COMM_WORLD, request, ierr);
+            if (ierr .ne. MPI_SUCCESS) then
+                print *,"PE ",rank,": ",name,": mpi_isend exited in error (",ierr,")"
+            endif
+
+            call mpi_wait(request, status, ierr)
+            if (ierr .ne. MPI_SUCCESS) then
+                print *,"PE ",rank,": ",name,": mpi_wait exited in error (",ierr,")"
+            endif
+
+        end block
+    else if (rank .eq. 1) then
+
+        ierr = MPI_SUCCESS
+
+        block
+            ASYNCHRONOUS :: iar_2d
+
+            call mpi_irecv(iar_2d(1:7:3,2:6:2), 27, MPI_INTEGER, 0, 123, MPI_COMM_WORLD, request, ierr);
+            if (ierr .ne. MPI_SUCCESS) then
+                print *,"PE ",rank,": ",name,"mpi_irecv exited in error (",ierr,")"
+            endif
+
+            call mpi_wait(request, status, ierr)
+            if (ierr .ne. MPI_SUCCESS) then
+                print *,"PE ",rank,": ",name,": mpi_wait exited in error (",ierr,")"
+            endif
+
+        end block
+
+        errors = 0
+        do i=2,6,2
+            do j=1,7,3
+                if (iar_2d(j,i) .ne. iar_2dch(j,i)) then
+                    print *, "rank 1: iar_2d(", j, ",", i, ")=", iar_2d(j,i), ", expected ", iar_2dch(j,i)
+                    errors = errors + 1
+                endif
+            end do
+        end do
+        if (errors .eq. 0) then
+            print *, "PE ", rank,": PASS - ", trim(title)
+        else
+            print *, "PE ", rank,": FAIL - ", trim(title)
+        endif
+        do j=1,9
+            print *, (iar_2d(i,j),i=1,9)
+        end do
+    endif
+
+    call MPI_Barrier(MPI_COMM_WORLD, ierr);
+    if (ierr .ne. MPI_SUCCESS) then
+        print *,"PE ",rank,": ",name,": mpi_barrier exited in error (",ierr,")"
+        call MPI_Abort(MPI_COMM_WORLD, 9);
+    endif
+end subroutine test19
diff --git a/src/binding/fortran/use_mpi_f08/tests/fort_mpi_test2.f90 b/src/binding/fortran/use_mpi_f08/tests/fort_mpi_test2.f90
new file mode 100644
index 0000000..a058a80
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/tests/fort_mpi_test2.f90
@@ -0,0 +1,49 @@
+
+subroutine test2(rank)
+    use mpi_f08
+    implicit none
+
+    character (len=10) :: name='test2'
+    character (len=80) :: title='test 2: Send/Recv - 1d array - iar(10)'
+    
+    integer :: rank, ierr, i, errors
+    integer, dimension(10) ::  iar
+    type(MPI_Status) status
+    
+    if (rank .eq. 0) then
+        print *, ' ===== ', trim(title), ' ====='
+        do i=1,10
+            iar(i)=i
+        end do
+        ierr = MPI_SUCCESS
+        call mpi_send(iar, 10, MPI_INTEGER, 1, 567, MPI_COMM_WORLD, ierr);
+        if (ierr .ne. MPI_SUCCESS) then
+            print *,"PE ",rank,": ",name,": mpi_send exited in error (",ierr,")"
+        endif
+    else if (rank .eq. 1) then
+        ierr = MPI_SUCCESS
+        call mpi_recv(iar, 10, MPI_INTEGER, 0, 567, MPI_COMM_WORLD, status, ierr);
+        if (ierr .ne. MPI_SUCCESS) then
+            print *,"PE ",rank,": ",name,"mpi_recv exited in error (",ierr,")"
+        endif
+        errors = 0
+        do i=1,10
+            if (iar(i) .ne. i) then
+                print *, "rank 1: iar(", i, ")=", iar(i), ", expected ",i
+                errors = errors + 1
+            endif
+        end do
+        if (errors .eq. 0) then
+            print *, "PE ", rank,": PASS - ", trim(title)
+        else
+            print *, "PE ", rank,": FAIL - ", trim(title)
+        endif
+        print *, iar(1), iar(2), iar(3), iar(4), iar(5), iar(6), iar(7), iar(8), iar(9)
+    endif
+
+    call MPI_Barrier(MPI_COMM_WORLD, ierr);
+    if (ierr .ne. MPI_SUCCESS) then
+        print *,"PE ",rank,": ",name,": mpi_barrier exited in error (",ierr,")"
+        call MPI_Abort(MPI_COMM_WORLD, 9);
+    endif
+end subroutine test2
diff --git a/src/binding/fortran/use_mpi_f08/tests/fort_mpi_test3.f90 b/src/binding/fortran/use_mpi_f08/tests/fort_mpi_test3.f90
new file mode 100644
index 0000000..917054b
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/tests/fort_mpi_test3.f90
@@ -0,0 +1,56 @@
+
+subroutine test3(rank)
+    use mpi_f08
+    implicit none
+
+    character (len=10) :: name='test3'
+    character (len=80) :: title='test 3: Send/Recv array slice - iar(2:7)'
+    
+    integer :: rank, ierr, i, errors
+    integer, dimension(10) ::  iar, iar_check
+    type(MPI_Status) status
+    
+    if (rank .eq. 0) then
+        print *, ' ===== ', trim(title), ' ====='
+        do i=1,10
+            iar(i)=i
+        end do
+        ierr = MPI_SUCCESS
+        call mpi_send(iar(2:7), 6, MPI_INTEGER, 1, 678, MPI_COMM_WORLD, ierr);
+        if (ierr .ne. MPI_SUCCESS) then
+            print *,"PE ",rank,": ",name,": mpi_send exited in error (",ierr,")"
+        endif
+    else if (rank .eq. 1) then
+        do i=1,10
+            iar(i)=0
+            iar_check(i)=0
+        end do
+        do i=2,7
+            iar_check(i)=i
+        end do
+        ierr = MPI_SUCCESS
+        call mpi_recv(iar(2:7), 6, MPI_INTEGER, 0, 678, MPI_COMM_WORLD, status, ierr);
+        if (ierr .ne. MPI_SUCCESS) then
+            print *,"PE ",rank,": ",name,"mpi_recv exited in error (",ierr,")"
+        endif
+        errors = 0
+        do i=1,10
+            if (iar(i) .ne. iar_check(i)) then
+                print *, "rank 1: iar(", i, ")=", iar(i), ", expected ",iar_check(i)
+                errors = errors + 1
+            endif
+        end do
+        if (errors .eq. 0) then
+            print *, "PE ", rank,": PASS - test 3 - ", trim(title)
+        else
+            print *, "PE ", rank,": FAIL - test 3 - ", trim(title)
+        endif
+        print *, iar(1), iar(2), iar(3), iar(4), iar(5), iar(6), iar(7), iar(8), iar(9)
+    endif
+
+    call MPI_Barrier(MPI_COMM_WORLD, ierr);
+    if (ierr .ne. MPI_SUCCESS) then
+        print *,"PE ",rank,": ",name,": mpi_barrier exited in error (",ierr,")"
+        call MPI_Abort(MPI_COMM_WORLD, 9);
+    endif
+end subroutine test3
diff --git a/src/binding/fortran/use_mpi_f08/tests/fort_mpi_test4.f90 b/src/binding/fortran/use_mpi_f08/tests/fort_mpi_test4.f90
new file mode 100644
index 0000000..87f9225
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/tests/fort_mpi_test4.f90
@@ -0,0 +1,56 @@
+
+subroutine test4(rank)
+    use mpi_f08
+    implicit none
+
+    character (len=10) :: name='test4'
+    character (len=80) :: title='test 4: Send/Recv array slice with stride - iar(2:8:2)'
+    
+    integer :: rank, ierr, i, errors
+    integer, dimension(10) ::  iar, iar_check
+    type(MPI_Status) status
+    
+    if (rank .eq. 0) then
+        print *, ' ===== ', trim(title), ' ====='
+        do i=1,10
+            iar(i)=i
+        end do
+        ierr = MPI_SUCCESS
+        call mpi_send(iar(2:8:2), 4, MPI_INTEGER, 1, 789, MPI_COMM_WORLD, ierr);
+        if (ierr .ne. MPI_SUCCESS) then
+            print *,"PE ",rank,": ",name,": mpi_send exited in error (",ierr,")"
+        endif
+    else if (rank .eq. 1) then
+        do i=1,10
+            iar(i)=0
+            iar_check(i)=0
+        end do
+        do i=2,8,2
+            iar_check(i)=i
+        end do
+        ierr = MPI_SUCCESS
+        call mpi_recv(iar(2:8:2), 4, MPI_INTEGER, 0, 789, MPI_COMM_WORLD, status, ierr);
+        if (ierr .ne. MPI_SUCCESS) then
+            print *,"PE ",rank,": ",name,"mpi_recv exited in error (",ierr,")"
+        endif
+        errors = 0
+        do i=1,10
+            if (iar(i) .ne. iar_check(i)) then
+                print *, "rank 1: iar(", i, ")=", iar(i), ", expected ",iar_check(i)
+                errors = errors + 1
+            endif
+        end do
+        if (errors .eq. 0) then
+            print *, "PE ", rank,": PASS - ", trim(title)
+        else
+            print *, "PE ", rank,": FAIL - ", trim(title)
+        endif
+        print *, iar(1), iar(2), iar(3), iar(4), iar(5), iar(6), iar(7), iar(8), iar(9)
+    endif
+
+    call MPI_Barrier(MPI_COMM_WORLD, ierr);
+    if (ierr .ne. MPI_SUCCESS) then
+        print *,"PE ",rank,": ",name,": mpi_barrier exited in error (",ierr,")"
+        call MPI_Abort(MPI_COMM_WORLD, 9);
+    endif
+end subroutine test4
diff --git a/src/binding/fortran/use_mpi_f08/tests/fort_mpi_test5.f90 b/src/binding/fortran/use_mpi_f08/tests/fort_mpi_test5.f90
new file mode 100644
index 0000000..db90789
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/tests/fort_mpi_test5.f90
@@ -0,0 +1,78 @@
+
+subroutine test5(rank)
+    use mpi_f08
+    implicit none
+
+    character (len=10) :: name='test5'
+    character (len=80) :: title='test 5: Send/Recv 2d array - iar(9,9)'
+    
+    integer :: rank, ierr, i, errors, j
+    integer, dimension(9,9) :: iar_2d
+    type(MPI_Status) status
+    
+    if (rank .eq. 0) then
+        print *, ' ===== ', trim(title), ' ====='
+
+        do i=1,9
+            do j=1,9
+                iar_2d(j,i) = (j * 10) + i
+            end do
+        end do
+
+        do j=1,9
+            print *, (iar_2d(i,j),i=1,9)
+        end do
+
+    else
+        do i=1,9
+            do j=1,9
+                iar_2d(j,i) = 0
+            end do
+        end do
+
+    endif
+
+    call MPI_Barrier(MPI_COMM_WORLD, ierr);
+    if (ierr .ne. MPI_SUCCESS) then
+        print *,"PE ",rank,": ",name,": A: mpi_barrier exited in error (",ierr,")"
+        call MPI_Abort(MPI_COMM_WORLD, 9);
+    endif
+
+    if (rank .eq. 0) then
+        ierr = MPI_SUCCESS
+        call mpi_send(iar_2d, 81, MPI_INTEGER, 1, 890, MPI_COMM_WORLD, ierr);
+        if (ierr .ne. MPI_SUCCESS) then
+            print *,"PE ",rank,": ",name,": mpi_send exited in error (",ierr,")"
+        endif
+    else if (rank .eq. 1) then
+        ierr = MPI_SUCCESS
+        call mpi_recv(iar_2d, 81, MPI_INTEGER, 0, 890, MPI_COMM_WORLD, status, ierr);
+        if (ierr .ne. MPI_SUCCESS) then
+            print *,"PE ",rank,": ",name,"mpi_recv exited in error (",ierr,")"
+        endif
+
+        errors = 0
+        do i=1,9
+            do j=1,9
+                if (iar_2d(j,i) .ne. (j * 10) + i) then
+                    print *, "rank 1: iar_2d(", j, ",", i, ")=", iar_2d(j,i), ", expected ", (j * 10) + i
+                    errors = errors + 1
+                endif
+            end do
+        end do
+        if (errors .eq. 0) then
+            print *, "PE ", rank,": PASS - ", trim(title)
+        else
+            print *, "PE ", rank,": FAIL - ", trim(title)
+        endif
+        do j=1,9
+            print *, (iar_2d(i,j),i=1,9)
+        end do
+    endif
+
+    call MPI_Barrier(MPI_COMM_WORLD, ierr);
+    if (ierr .ne. MPI_SUCCESS) then
+        print *,"PE ",rank,": ",name,": mpi_barrier exited in error (",ierr,")"
+        call MPI_Abort(MPI_COMM_WORLD, 9);
+    endif
+end subroutine test5
diff --git a/src/binding/fortran/use_mpi_f08/tests/fort_mpi_test6.f90 b/src/binding/fortran/use_mpi_f08/tests/fort_mpi_test6.f90
new file mode 100644
index 0000000..ba648a1
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/tests/fort_mpi_test6.f90
@@ -0,0 +1,81 @@
+
+subroutine test6(rank)
+    use mpi_f08
+    implicit none
+
+    character (len=10) :: name='test6'
+    character (len=80) :: title='test 6: Send/Recv 2d array column - iar_2d(:,3)'
+    integer :: rank, ierr, i, errors, j
+    integer, dimension(9,9) :: iar_2d, iar_2dch
+    type(MPI_Status) status
+    
+    if (rank .eq. 0) then
+        print *, ' ===== ', trim(title), ' ====='
+
+        do i=1,9
+            do j=1,9
+                iar_2d(j,i) = (j * 10) + i
+            end do
+        end do
+
+        do j=1,9
+            print *, (iar_2d(i,j),i=1,9)
+        end do
+
+    else
+        do i=1,9
+            do j=1,9
+                iar_2d(j,i) = 0
+                iar_2dch(j,i) = 0
+            end do
+        end do
+
+        do j=1,9
+            iar_2dch(j,3) = (j * 10) + 3
+        end do
+    endif
+
+    call MPI_Barrier(MPI_COMM_WORLD, ierr);
+    if (ierr .ne. MPI_SUCCESS) then
+        print *,"PE ",rank,": ",name,": A: mpi_barrier exited in error (",ierr,")"
+        call MPI_Abort(MPI_COMM_WORLD, 9);
+    endif
+
+    if (rank .eq. 0) then
+        ierr = MPI_SUCCESS
+        call mpi_send(iar_2d(:,3), 9, MPI_INTEGER, 1, 890, MPI_COMM_WORLD, ierr);
+        if (ierr .ne. MPI_SUCCESS) then
+            print *,"PE ",rank,": ",name,": mpi_send exited in error (",ierr,")"
+        endif
+    else if (rank .eq. 1) then
+        ierr = MPI_SUCCESS
+        call mpi_recv(iar_2d(:,3), 9, MPI_INTEGER, 0, 890, MPI_COMM_WORLD, status, ierr);
+        if (ierr .ne. MPI_SUCCESS) then
+            print *,"PE ",rank,": ",name,"mpi_recv exited in error (",ierr,")"
+        endif
+
+        errors = 0
+        do i=1,9
+            do j=1,9
+                if (iar_2d(j,i) .ne. iar_2dch(j,i)) then
+                    print *, "rank 1: iar_2d(", j, ",", i, ")=", iar_2d(j,i), ", expected ", iar_2dch(j,i)
+                    errors = errors + 1
+                endif
+            end do
+        end do
+        if (errors .eq. 0) then
+            print *, "PE ", rank,": PASS - ", trim(title)
+        else
+            print *, "PE ", rank,": FAIL - ", trim(title)
+        endif
+        do j=1,9
+            print *, (iar_2d(i,j),i=1,9)
+        end do
+    endif
+
+    call MPI_Barrier(MPI_COMM_WORLD, ierr);
+    if (ierr .ne. MPI_SUCCESS) then
+        print *,"PE ",rank,": ",name,": mpi_barrier exited in error (",ierr,")"
+        call MPI_Abort(MPI_COMM_WORLD, 9);
+    endif
+end subroutine test6
diff --git a/src/binding/fortran/use_mpi_f08/tests/fort_mpi_test7.f90 b/src/binding/fortran/use_mpi_f08/tests/fort_mpi_test7.f90
new file mode 100644
index 0000000..3a081b8
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/tests/fort_mpi_test7.f90
@@ -0,0 +1,85 @@
+
+subroutine test7(rank)
+    use mpi_f08
+    implicit none
+
+    character (len=10) :: name='test7'
+    character (len=80) :: title='test 7: Send/Recv 2d array row - iar_2d(6,:)'
+    
+    integer :: rank, ierr, i, errors, j
+    integer, dimension(9,9) :: iar_2d, iar_2dch
+    type(MPI_Status) status
+    
+    if (rank .eq. 0) then
+        print *, ' ===== ', trim(title), ' ====='
+
+        do i=1,9
+            do j=1,9
+                iar_2d(j,i) = (j * 10) + i
+            end do
+        end do
+
+        do j=1,9
+            print *, (iar_2d(i,j),i=1,9)
+        end do
+
+    else
+        do i=1,9
+            do j=1,9
+                iar_2d(j,i) = 0
+                iar_2dch(j,i) = 0
+            end do
+        end do
+
+        do i=1,9
+            do j=6,6
+                iar_2dch(j,i) = (j * 10) + i
+            end do
+        end do
+    endif
+
+    call MPI_Barrier(MPI_COMM_WORLD, ierr);
+    if (ierr .ne. MPI_SUCCESS) then
+        print *,"PE ",rank,": ",name,": A: mpi_barrier exited in error (",ierr,")"
+        call MPI_Abort(MPI_COMM_WORLD, 9);
+    endif
+
+    if (rank .eq. 0) then
+        ierr = MPI_SUCCESS
+        call mpi_send(iar_2d(6,:), 9, MPI_INTEGER, 1, 890, MPI_COMM_WORLD, ierr);
+        if (ierr .ne. MPI_SUCCESS) then
+            print *,"PE ",rank,": ",name,": mpi_send exited in error (",ierr,")"
+        endif
+    else if (rank .eq. 1) then
+        ierr = MPI_SUCCESS
+        call mpi_recv(iar_2d(6,:), 9, MPI_INTEGER, 0, 890, MPI_COMM_WORLD, status, ierr);
+        if (ierr .ne. MPI_SUCCESS) then
+            print *,"PE ",rank,": ",name,"mpi_recv exited in error (",ierr,")"
+        endif
+
+        errors = 0
+        do i=1,9
+            do j=1,9
+                if (iar_2d(j,i) .ne. iar_2dch(j,i)) then
+                    print *, "rank 1: iar_2d(", j, ",", i, ")=", iar_2d(j,i), ", expected ", iar_2dch(j,i)
+                    errors = errors + 1
+                endif
+            end do
+        end do
+        if (errors .eq. 0) then
+            print *, "PE ", rank,": PASS - ", trim(title)
+        else
+            print *, "PE ", rank,": FAIL - ", trim(title)
+        endif
+        do j=1,9
+            print *, (iar_2d(i,j),i=1,9)
+        end do
+
+    endif
+
+    call MPI_Barrier(MPI_COMM_WORLD, ierr);
+    if (ierr .ne. MPI_SUCCESS) then
+        print *,"PE ",rank,": ",name,": mpi_barrier exited in error (",ierr,")"
+        call MPI_Abort(MPI_COMM_WORLD, 9);
+    endif
+end subroutine test7
diff --git a/src/binding/fortran/use_mpi_f08/tests/fort_mpi_test8.f90 b/src/binding/fortran/use_mpi_f08/tests/fort_mpi_test8.f90
new file mode 100644
index 0000000..accb6f1
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/tests/fort_mpi_test8.f90
@@ -0,0 +1,84 @@
+
+subroutine test8(rank)
+    use mpi_f08
+    implicit none
+
+    character (len=10) :: name='test8'
+    character (len=80) :: title='test 8: Send/Recv 2d array column slice - iar_2d(:,2:6:2)'
+    
+    integer :: rank, ierr, i, errors, j
+    integer, dimension(9,9) :: iar_2d, iar_2dch
+    type(MPI_Status) status
+    
+    if (rank .eq. 0) then
+        print *, ' ===== ', trim(title), ' ====='
+
+        do i=1,9
+            do j=1,9
+                iar_2d(j,i) = (j * 10) + i
+            end do
+        end do
+
+        do j=1,9
+            print *, (iar_2d(i,j),i=1,9)
+        end do
+
+    else
+        do i=1,9
+            do j=1,9
+                iar_2d(j,i) = 0
+                iar_2dch(j,i) = 0
+            end do
+        end do
+
+        do i=2,6,2
+            do j=1,9
+                iar_2dch(j,i) = (j * 10) + i
+            end do
+        end do
+    endif
+
+    call MPI_Barrier(MPI_COMM_WORLD, ierr);
+    if (ierr .ne. MPI_SUCCESS) then
+        print *,"PE ",rank,": ",name,": A: mpi_barrier exited in error (",ierr,")"
+        call MPI_Abort(MPI_COMM_WORLD, 9);
+    endif
+
+    if (rank .eq. 0) then
+        ierr = MPI_SUCCESS
+        call mpi_send(iar_2d(:,2:6:2), 27, MPI_INTEGER, 1, 123, MPI_COMM_WORLD, ierr);
+        if (ierr .ne. MPI_SUCCESS) then
+            print *,"PE ",rank,": ",name,": mpi_send exited in error (",ierr,")"
+        endif
+    else if (rank .eq. 1) then
+        ierr = MPI_SUCCESS
+        call mpi_recv(iar_2d(:,2:6:2), 27, MPI_INTEGER, 0, 123, MPI_COMM_WORLD, status, ierr);
+        if (ierr .ne. MPI_SUCCESS) then
+            print *,"PE ",rank,": ",name,"mpi_recv exited in error (",ierr,")"
+        endif
+
+        errors = 0
+        do i=1,9
+            do j=1,9
+                if (iar_2d(j,i) .ne. iar_2dch(j,i)) then
+                    print *, "rank 1: iar_2d(", j, ",", i, ")=", iar_2d(j,i), ", expected ", iar_2dch(j,i)
+                    errors = errors + 1
+                endif
+            end do
+        end do
+        if (errors .eq. 0) then
+            print *, "PE ", rank,": PASS - ", trim(title)
+        else
+            print *, "PE ", rank,": FAIL - ", trim(title)
+        endif
+        do j=1,9
+            print *, (iar_2d(i,j),i=1,9)
+        end do
+    endif
+
+    call MPI_Barrier(MPI_COMM_WORLD, ierr);
+    if (ierr .ne. MPI_SUCCESS) then
+        print *,"PE ",rank,": ",name,": mpi_barrier exited in error (",ierr,")"
+        call MPI_Abort(MPI_COMM_WORLD, 9);
+    endif
+end subroutine test8
diff --git a/src/binding/fortran/use_mpi_f08/tests/fort_mpi_test9.f90 b/src/binding/fortran/use_mpi_f08/tests/fort_mpi_test9.f90
new file mode 100644
index 0000000..b04d110
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/tests/fort_mpi_test9.f90
@@ -0,0 +1,84 @@
+
+subroutine test9(rank)
+    use mpi_f08
+    implicit none
+
+    character (len=10) :: name='test9'
+    character (len=80) :: title='test 9: Send/Recv 2d array column slice - iar_2d(1:7:3,2:6:2)'
+    
+    integer :: rank, ierr, i, errors, j
+    integer, dimension(9,9) :: iar_2d, iar_2dch
+    type(MPI_Status) status
+    
+    if (rank .eq. 0) then
+        print *, ' ===== ', trim(title), ' ====='
+
+        do i=1,9
+            do j=1,9
+                iar_2d(j,i) = (j * 10) + i
+            end do
+        end do
+
+        do j=1,9
+            print *, (iar_2d(i,j),i=1,9)
+        end do
+
+    else
+        do i=1,9
+            do j=1,9
+                iar_2d(j,i) = 0
+                iar_2dch(j,i) = 0
+            end do
+        end do
+        do i=2,6,2
+            do j=1,7,3
+                iar_2dch(j,i) = (j * 10) + i
+            end do
+        end do
+
+    endif
+
+    call MPI_Barrier(MPI_COMM_WORLD, ierr);
+    if (ierr .ne. MPI_SUCCESS) then
+        print *,"PE ",rank,": ",name,": A: mpi_barrier exited in error (",ierr,")"
+        call MPI_Abort(MPI_COMM_WORLD, 9);
+    endif
+
+    if (rank .eq. 0) then
+        ierr = MPI_SUCCESS
+        call mpi_send(iar_2d(1:7:3,2:6:2), 27, MPI_INTEGER, 1, 123, MPI_COMM_WORLD, ierr);
+        if (ierr .ne. MPI_SUCCESS) then
+            print *,"PE ",rank,": ",name,": mpi_send exited in error (",ierr,")"
+        endif
+    else if (rank .eq. 1) then
+        ierr = MPI_SUCCESS
+        call mpi_recv(iar_2d(1:7:3,2:6:2), 27, MPI_INTEGER, 0, 123, MPI_COMM_WORLD, status, ierr);
+        if (ierr .ne. MPI_SUCCESS) then
+            print *,"PE ",rank,": ",name,"mpi_recv exited in error (",ierr,")"
+        endif
+
+        errors = 0
+        do i=2,6,2
+            do j=1,7,3
+                if (iar_2d(j,i) .ne. iar_2dch(j,i)) then
+                    print *, "rank 1: iar_2d(", j, ",", i, ")=", iar_2d(j,i), ", expected ", iar_2dch(j,i)
+                    errors = errors + 1
+                endif
+            end do
+        end do
+        if (errors .eq. 0) then
+            print *, "PE ", rank,": PASS - ", trim(title)
+        else
+            print *, "PE ", rank,": FAIL - ", trim(title)
+        endif
+        do j=1,9
+            print *, (iar_2d(i,j),i=1,9)
+        end do
+    endif
+
+    call MPI_Barrier(MPI_COMM_WORLD, ierr);
+    if (ierr .ne. MPI_SUCCESS) then
+        print *,"PE ",rank,": ",name,": mpi_barrier exited in error (",ierr,")"
+        call MPI_Abort(MPI_COMM_WORLD, 9);
+    endif
+end subroutine test9
diff --git a/src/binding/fortran/use_mpi_f08/tests/fort_mpi_tests.f90 b/src/binding/fortran/use_mpi_f08/tests/fort_mpi_tests.f90
new file mode 100644
index 0000000..d9c6490
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/tests/fort_mpi_tests.f90
@@ -0,0 +1,59 @@
+
+program main
+    use mpi_f08
+    implicit none
+
+    integer size, rank, ierr
+
+    call mpi_init(ierr)
+
+    call mpi_comm_size(MPI_COMM_WORLD, size, ierr)
+    call mpi_comm_rank(MPI_COMM_WORLD, rank, ierr)
+
+    print *, 'Hello, I am ', rank, ' of ', size, '.'
+
+    ! Simple scalar
+    call test1(rank)
+
+    ! Send/Recv iar(10)
+    call test2(rank)
+
+    ! Send/Recv iar(2:7)
+    call test3(rank)
+
+    ! Send/Recv iar(2:8:2)
+    call test4(rank)
+
+    ! Send/Recv iar_2d(9,9)
+    call test5(rank)
+
+    ! Send/Recv 2d row iar_2d(:,3)
+    call test6(rank)
+
+    ! Send/Recv 2d row iar_2d(6,:)
+    call test7(rank)
+
+    ! Send/Recv 2d row iar_2d(:,2:6:2)
+    call test8(rank)
+
+    ! Send/Recv 2d row iar_2d(1:7:3,2:6:2)
+    call test9(rank)
+
+    ! Isend/Irecv 2d row iar_2d(:,2:6:2)
+    call test10(rank)
+
+    ! Isend/Irecv iar(10)
+    call test11(rank)
+
+    ! Isend/Irecv iar(2:7)
+    call test12(rank)
+
+    ! Isend/Irecv 2d row iar_2d(:,2:6:2)
+    call test18(rank)
+
+    ! Isend/Irecv 2d row iar_2d(1:7:3,2:6:2)
+    call test19(rank)
+
+    call mpi_finalize(ierr)
+end program main
+
diff --git a/src/binding/fortran/use_mpi_f08/tests/fort_test.f90 b/src/binding/fortran/use_mpi_f08/tests/fort_test.f90
new file mode 100644
index 0000000..5274444
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/tests/fort_test.f90
@@ -0,0 +1,150 @@
+!
+program main
+
+use mpi_f08
+
+implicit none
+
+integer ierr
+integer size, rank
+integer sint, iar(10)
+type(MPI_Status) status
+integer i
+integer junk(100)
+integer save_my_rank
+
+call mpi_init(ierr)
+
+call mpi_comm_size(MPI_COMM_WORLD, size, ierr)
+call mpi_comm_rank(MPI_COMM_WORLD, rank, ierr)
+
+print *, 'Hello, I am ', rank, ' of ', size, '.'
+
+save_my_rank = rank
+
+! ----------------------------------------------------------
+if (rank .eq. 0) then
+    sint = 789
+    print *, ' ===== Trivial send/recv ====='
+    print *, "rank 0 sends ", sint
+    ierr = MPI_SUCCESS
+    call mpi_send(sint, 1, MPI_INTEGER, 1, 567, MPI_COMM_WORLD, ierr);
+    if (ierr .ne. MPI_SUCCESS) then
+        print *, "PE ", rank, ": mpi_send exited in error (",ierr,")"
+    endif
+else
+    ierr = MPI_SUCCESS
+    call mpi_recv(sint, 1, MPI_INTEGER, 0, 567, MPI_COMM_WORLD, status, ierr);
+    if (ierr .ne. MPI_SUCCESS) then
+        print *, "PE ", rank,": mpi_recv exited in error (",ierr,")"
+    endif
+    print *, "rank 1 receives ",sint
+endif
+
+call MPI_Barrier(MPI_COMM_WORLD, ierr);
+if (ierr .ne. MPI_SUCCESS) then
+    print *, "PE ", rank, ": mpi_barrier exited in error (",ierr,")"
+    call MPI_Abort(MPI_COMM_WORLD, 9);
+endif
+
+! ----------------------------------------------------------
+if (rank .eq. 0) then
+    print *, ' ===== Send/Recv iar(10) ====='
+    do i=1,10
+        iar(i)=i
+    end do
+    ierr = MPI_SUCCESS
+    print *, 'PE 0: loc(iar)=',loc(iar)
+    call mpi_send(iar, 10, MPI_INTEGER, 1, 567, MPI_COMM_WORLD, ierr);
+    if (ierr .ne. MPI_SUCCESS) then
+        print *, "PE ", rank, ": mpi_send exited in error (",ierr,")"
+    endif
+else if (rank .eq. 1) then
+    ierr = MPI_SUCCESS
+    print *, 'PE 1: loc(iar)=',loc(iar)
+    call mpi_recv(iar, 10, MPI_INTEGER, 0, 567, MPI_COMM_WORLD, status, ierr);
+    if (ierr .ne. MPI_SUCCESS) then
+        print *, "PE 1: mpi_recv exited in error (",ierr,")"
+    endif
+    do i=1,10
+        if (iar(i) .ne. i) then
+            print *, "rank 1: iar(", i, ")=", iar(i), ", expected ",i
+        endif
+    end do
+endif
+
+call MPI_Barrier(MPI_COMM_WORLD, ierr);
+if (ierr .ne. MPI_SUCCESS) then
+    print *, "PE ", rank, ": mpi_barrier exited in error (",ierr,")"
+    call MPI_Abort(MPI_COMM_WORLD, 9);
+endif
+
+! ----------------------------------------------------------
+if (rank .eq. 0) then
+    print *, ' ===== Send/Recv iar(2:7) ====='
+    do i=1,10
+        iar(i)=i
+    end do
+    ierr = MPI_SUCCESS
+    print *, 'PE ', rank, '(0),[', save_my_rank, ']: loc(iar)=',loc(iar)
+    print *, 'PE 0: loc(iar)=',loc(iar)
+    call mpi_send(iar(2:7), 10, MPI_INTEGER, 1, 678, MPI_COMM_WORLD, ierr);
+    if (ierr .ne. MPI_SUCCESS) then
+        print *, "PE ", rank, "(0): mpi_send exited in error (",ierr,")"
+    endif
+else if (rank .eq. 1) then
+    ierr = MPI_SUCCESS
+    print *, 'PE 1: loc(iar)=',loc(iar)
+    call mpi_recv(iar(2:7), 10, MPI_INTEGER, 0, 678, MPI_COMM_WORLD, status, ierr);
+    if (ierr .ne. MPI_SUCCESS) then
+        print *, "PE ", rank, "(1): mpi_recv exited in error (",ierr,")"
+    endif
+    do i=2,7
+        if (iar(i) .ne. i) then
+            print *, "rank 1: iar(", i, ")=", iar(i), ", expected ",i
+        endif
+    end do
+endif
+
+call MPI_Barrier(MPI_COMM_WORLD, ierr);
+if (ierr .ne. MPI_SUCCESS) then
+    print *, "PE ", rank, ": mpi_barrier exited in error (",ierr,")"
+    call MPI_Abort(MPI_COMM_WORLD, 9);
+endif
+
+! ----------------------------------------------------------
+if (rank .eq. 0) then
+    print *, ' ===== Send/Recv iar(2:8:2) ====='
+    do i=1,10
+        iar(i)=i
+    end do
+    ierr = MPI_SUCCESS
+    print *, 'PE ', rank, '(0),[', save_my_rank, ']: loc(iar)=',loc(iar)
+    print *, 'PE 0: loc(iar)=',loc(iar)
+    call mpi_send(iar(2:8:2), 10, MPI_INTEGER, 1, 678, MPI_COMM_WORLD, ierr);
+    if (ierr .ne. MPI_SUCCESS) then
+        print *, "PE ", rank, "(0): mpi_send exited in error (",ierr,")"
+    endif
+else if (rank .eq. 1) then
+    ierr = MPI_SUCCESS
+    print *, 'PE 1: loc(iar)=',loc(iar)
+    call mpi_recv(iar(2:8:2), 10, MPI_INTEGER, 0, 678, MPI_COMM_WORLD, status, ierr);
+    if (ierr .ne. MPI_SUCCESS) then
+        print *, "PE ", rank, "(1): mpi_recv exited in error (",ierr,")"
+    endif
+    do i=2,8,2
+        if (iar(i) .ne. i) then
+            print *, "rank 1: iar(", i, ")=", iar(i), ", expected ",i
+        endif
+    end do
+endif
+
+call MPI_Barrier(MPI_COMM_WORLD, ierr);
+if (ierr .ne. MPI_SUCCESS) then
+    print *, "PE ", rank, ": mpi_barrier exited in error (",ierr,")"
+    call MPI_Abort(MPI_COMM_WORLD, 9);
+endif
+! ----------------------------------------------------------
+
+call mpi_finalize(ierr)
+end
diff --git a/src/binding/fortran/use_mpi_f08/tests/fort_test_2d.f90 b/src/binding/fortran/use_mpi_f08/tests/fort_test_2d.f90
new file mode 100644
index 0000000..9a30c4b
--- /dev/null
+++ b/src/binding/fortran/use_mpi_f08/tests/fort_test_2d.f90
@@ -0,0 +1,237 @@
+
+!
+program main
+
+use mpi_f08
+
+implicit none
+
+integer ierr
+integer size, rank
+integer sint, iar(10), iar_2d(9,9), iar_3d(9,9,9)
+type(MPI_Status) status
+integer i, j, k
+integer junk(1000)
+integer save_my_rank
+integer errors
+
+call mpi_init(ierr)
+
+call mpi_comm_size(MPI_COMM_WORLD, size, ierr)
+call mpi_comm_rank(MPI_COMM_WORLD, rank, ierr)
+
+print *, 'Hello, I am ', rank, ' of ', size, '.'
+
+
+save_my_rank = rank
+
+! ----------------------------------------------------------
+if (rank .eq. 0) then
+    sint = 789
+    write (0,*) ' ===== Trivial send/recv ====='
+    print *, ' ===== Trivial send/recv ====='
+    print *, "rank 0 sends ", sint
+    ierr = MPI_SUCCESS
+    call mpi_send(sint, 1, MPI_INTEGER, 1, 567, MPI_COMM_WORLD, ierr);
+    if (ierr .ne. MPI_SUCCESS) then
+        print *, "PE ", rank, ": mpi_send exited in error (",ierr,")"
+    endif
+else
+    ierr = MPI_SUCCESS
+    call mpi_recv(sint, 1, MPI_INTEGER, 0, 567, MPI_COMM_WORLD, status, ierr);
+    if (ierr .ne. MPI_SUCCESS) then
+        print *, "PE ", rank,": mpi_recv exited in error (",ierr,")"
+    endif
+    print *, "rank 1 receives ",sint
+    if (sint .eq. 789) then
+        print *, "PE ", rank,": PASS - Trivial send/recv"
+    else
+        print *, "PE ", rank,": FAIL - Trivial send/recv"
+    endif
+endif
+
+call MPI_Barrier(MPI_COMM_WORLD, ierr);
+if (ierr .ne. MPI_SUCCESS) then
+    print *, "PE ", rank, ": mpi_barrier exited in error (",ierr,")"
+    call MPI_Abort(MPI_COMM_WORLD, 9);
+endif
+
+! ----------------------------------------------------------
+if (rank .eq. 0) then
+    write (0,*) ' ===== Send/Recv iar(2:8:2) ====='
+    print *, ' ===== Send/Recv iar(2:8:2) ====='
+    do i=1,10
+        iar(i)=i
+    end do
+    ierr = MPI_SUCCESS
+    print *, 'PE ', rank, '(0),[', save_my_rank, ']: loc(iar)=',loc(iar)
+    print *, 'PE 0: loc(iar)=',loc(iar)
+    call mpi_send(iar(2:8:2), 10, MPI_INTEGER, 1, 678, MPI_COMM_WORLD, ierr);
+    if (ierr .ne. MPI_SUCCESS) then
+        print *, "PE ", rank, "(0): mpi_send exited in error (",ierr,")"
+    endif
+else if (rank .eq. 1) then
+    ierr = MPI_SUCCESS
+    print *, 'PE 1: loc(iar)=',loc(iar)
+    call mpi_recv(iar(2:8:2), 10, MPI_INTEGER, 0, 678, MPI_COMM_WORLD, status, ierr);
+    if (ierr .ne. MPI_SUCCESS) then
+        print *, "PE ", rank, "(1): mpi_recv exited in error (",ierr,")"
+    endif
+    errors = 0
+    do i=2,8,2
+        if (iar(i) .ne. i) then
+            print *, "rank 1: iar(", i, ")=", iar(i), ", expected ",i
+            errors = errors + 1
+        endif
+    end do
+    if (errors .eq. 0) then
+        print *, "PE ", rank,": PASS - Send/Recv iar(2:8:2)"
+    else
+        print *, "PE ", rank,": FAIL - Send/Recv iar(2:8:2)"
+    endif
+endif
+
+call MPI_Barrier(MPI_COMM_WORLD, ierr);
+if (ierr .ne. MPI_SUCCESS) then
+    print *, "PE ", rank, ": mpi_barrier exited in error (",ierr,")"
+    call MPI_Abort(MPI_COMM_WORLD, 9);
+endif
+
+! ----------------------------------------------------------
+if (rank .eq. 0) then
+    write (0, *) " ======== Simple 2d array test (iar_2d) ======== "
+    print *, " ======== Simple 2d array test (iar_2d) ======== "
+
+    do i=1,9
+        do j=1,9
+            iar_2d(j,i) = (j * 10) + i
+        end do
+    end do
+
+    do j=1,9
+        print *, iar_2d(1,j), iar_2d(2,j), iar_2d(3,j), iar_2d(4,j), iar_2d(5,j), iar_2d(6,j), iar_2d(7,j), iar_2d(8,j), iar_2d(9,j)
+    end do
+
+else
+    do i=1,9
+        do j=1,9
+            iar_2d(j,i) = 0
+        end do
+    end do
+
+endif
+
+call MPI_Barrier(MPI_COMM_WORLD, ierr);
+if (ierr .ne. MPI_SUCCESS) then
+    print *, "PE ", rank, ": mpi_barrier exited in error (",ierr,")"
+    call MPI_Abort(MPI_COMM_WORLD, 9);
+endif
+
+if (rank .eq. 0) then
+    print *, 'PE 0: Sending: loc(iar_2d)=',loc(iar_2d)
+    ierr = MPI_SUCCESS
+    call mpi_send(iar_2d, 81, MPI_INTEGER, 1, 789, MPI_COMM_WORLD, ierr);
+    if (ierr .ne. MPI_SUCCESS) then
+        print *, "PE ", rank, ": mpi_send exited in error (",ierr,")"
+    endif
+else
+    print *, 'PE 1: Receiving: loc(iar_2d)=',loc(iar_2d)
+    ierr = MPI_SUCCESS
+    call mpi_recv(iar_2d, 81, MPI_INTEGER, 0, 789, MPI_COMM_WORLD, status, ierr);
+    if (ierr .ne. MPI_SUCCESS) then
+        print *, "PE ", rank, "(1): mpi_recv exited in error (",ierr,")"
+    endif
+    errors = 0
+    do i=1,9
+        do j=1,9
+            if (iar_2d(j,i) .ne. (j * 10) + i) then
+                print *, "rank 1: iar_2d(", j, ",", i, ")=", iar_2d(j,i), ", expected ", (j * 10) + i
+                errors = errors + 1
+            endif
+        end do
+    end do
+    if (errors .eq. 0) then
+        print *, "PE ", rank,": PASS - Send/Recv iar_2d()"
+    else
+        print *, "PE ", rank,": FAIL - Send/Recv iar_2d()"
+    endif
+endif
+
+! ----------------------------------------------------------
+if (rank .eq. 0) then
+    write (0, *) " ======== Simple 3d array test (iar_3d) ======== "
+    print *, " ======== Simple 3d array test (iar_3d) ======== "
+
+    do i=1,9
+        do j=1,9
+            do k=1,9
+                iar_3d(k,j,i) = (k * 100) + (j * 10) + i
+            end do
+        end do
+    end do
+
+else
+    do i=1,9
+        do j=1,9
+            do k=1,9
+                iar_3d(k, j,i) = 0
+            end do
+        end do
+    end do
+
+endif
+
+call MPI_Barrier(MPI_COMM_WORLD, ierr);
+if (ierr .ne. MPI_SUCCESS) then
+    print *, "PE ", rank, ": mpi_barrier exited in error (",ierr,")"
+    call MPI_Abort(MPI_COMM_WORLD, 9);
+endif
+
+if (rank .eq. 0) then
+    print *, 'PE 0: Sending: loc(iar_3d)=',loc(iar_3d)
+    ierr = MPI_SUCCESS
+    call mpi_send(iar_3d, 729, MPI_INTEGER, 1, 891, MPI_COMM_WORLD, ierr);
+    if (ierr .ne. MPI_SUCCESS) then
+        print *, "PE ", rank, ": mpi_send exited in error (",ierr,")"
+    endif
+else
+    print *, 'PE 1: Receiving: loc(iar_3d)=',loc(iar_3d)
+    ierr = MPI_SUCCESS
+    call mpi_recv(iar_3d, 729, MPI_INTEGER, 0, 891, MPI_COMM_WORLD, status, ierr);
+    if (ierr .ne. MPI_SUCCESS) then
+        print *, "PE ", rank, "(1): mpi_recv exited in error (",ierr,")"
+    endif
+
+    errors = 0
+
+    do i=1,9
+        do j=1,9
+            do k=1,9
+                if (iar_3d(k, j,i) .ne. (k * 100) + (j * 10) + i) then
+                    print *, "rank 1: iar_3d(", k, ",", j, ",", i, ")=", iar_3d(k, j,i), ", expected ", (k * 100) + (j * 10) + i
+                    errors = errors + 1
+                endif
+            end do
+        end do
+    end do
+
+    if (errors .eq. 0) then
+        print *, "PE ", rank,": PASS - Send/Recv iar_3d()"
+    else
+        print *, "PE ", rank,": FAIL - Send/Recv iar_3d()"
+    endif
+endif
+
+! ----------------------------------------------------------
+write (0, *) "PE ", rank, ": calling last barrier"
+print *, "PE ", rank, ": calling last barrier"
+call MPI_Barrier(MPI_COMM_WORLD, ierr);
+if (ierr .ne. MPI_SUCCESS) then
+    print *, "PE ", rank, ": mpi_barrier exited in error (",ierr,")"
+    call MPI_Abort(MPI_COMM_WORLD, 9);
+endif
+
+write (0, *) "PE ", rank, ": calling Finalize"
+print *, "PE ", rank, ": calling Finalize"
+call mpi_finalize(ierr)
+end
diff --git a/src/include/mpi.h.in b/src/include/mpi.h.in
index 62fa0a9..abdfcfa 100644
--- a/src/include/mpi.h.in
+++ b/src/include/mpi.h.in
@@ -571,7 +571,8 @@ static const MPI_Datatype mpich_mpi_aint   MPICH_ATTR_TYPE_TAG(MPI_Aint)   = MPI
 static const MPI_Datatype mpich_mpi_offset MPICH_ATTR_TYPE_TAG(MPI_Offset) = MPI_OFFSET;
 #endif
 
-/* The order of these elements must match that in mpif.h */
+/* The order of these elements must match that in mpif.h, mpi_f08_types.f90,
+   and mpi_c_interface_types.f90 */
 typedef struct MPI_Status {
     int count_lo;
     int count_hi_and_cancelled;

-----------------------------------------------------------------------

Summary of changes:
 .gitignore                                         |   11 +
 CHANGES                                            |    3 +
 Makefile.am                                        |    2 +
 autogen.sh                                         |   18 +-
 confdb/aclocal_fc.m4                               |   96 +
 configure.ac                                       |   23 +-
 src/binding/Makefile.mk                            |    2 +-
 src/binding/fortran/use_mpi/buildiface             |    9 +-
 src/binding/fortran/use_mpi_f08/buildiface         |  190 +
 .../fortran/use_mpi_f08/mpi_c_interface.F90        |   11 +
 .../fortran/use_mpi_f08/mpi_c_interface_cdesc.F90  | 1440 ++++++++
 .../fortran/use_mpi_f08/mpi_c_interface_glue.F90   |  312 ++
 .../fortran/use_mpi_f08/mpi_c_interface_nobuf.F90  | 2364 ++++++++++++
 .../fortran/use_mpi_f08/mpi_c_interface_types.F90  |   83 +
 src/binding/fortran/use_mpi_f08/mpi_f08.F90        | 3799 ++++++++++++++++++++
 .../fortran/use_mpi_f08/mpi_f08_callbacks.F90      |  307 ++
 .../use_mpi_f08/mpi_f08_compile_constants.F90      |  459 +++
 .../fortran/use_mpi_f08/mpi_f08_link_constants.F90 |   87 +
 src/binding/fortran/use_mpi_f08/mpi_f08_types.F90  | 1262 +++++++
 .../fortran/use_mpi_f08/wrappers_c/buildiface      |  527 +++
 .../fortran/use_mpi_f08/wrappers_c/comm_spawn_c.c  |   27 +
 .../use_mpi_f08/wrappers_c/comm_spawn_multiple_c.c |   57 +
 .../fortran/use_mpi_f08/wrappers_c/f_sync_reg_c.c  |   11 +
 src/binding/fortran/use_mpi_f08/wrappers_c/utils.c |   89 +
 .../fortran/use_mpi_f08/wrappers_f/abort_f08ts.F90 |   32 +
 .../use_mpi_f08/wrappers_f/accumulate_f08ts.F90    |   55 +
 .../wrappers_f/add_error_class_f08ts.F90           |   27 +
 .../wrappers_f/add_error_code_f08ts.F90            |   31 +
 .../wrappers_f/add_error_string_f08ts.F90          |   33 +
 .../use_mpi_f08/wrappers_f/allgather_f08ts.F90     |   46 +
 .../use_mpi_f08/wrappers_f/allgatherv_f08ts.F90    |   52 +
 .../use_mpi_f08/wrappers_f/alloc_mem_f08ts.F90     |   37 +
 .../use_mpi_f08/wrappers_f/allreduce_f08ts.F90     |   40 +
 .../use_mpi_f08/wrappers_f/alltoall_f08ts.F90      |   46 +
 .../use_mpi_f08/wrappers_f/alltoallv_f08ts.F90     |   56 +
 .../use_mpi_f08/wrappers_f/alltoallw_f08ts.F90     |   56 +
 .../use_mpi_f08/wrappers_f/barrier_f08ts.F90       |   29 +
 .../fortran/use_mpi_f08/wrappers_f/bcast_f08ts.F90 |   39 +
 .../fortran/use_mpi_f08/wrappers_f/bsend_f08ts.F90 |   42 +
 .../use_mpi_f08/wrappers_f/bsend_init_f08ts.F90    |   45 +
 .../use_mpi_f08/wrappers_f/buffer_attach_f08ts.F90 |   28 +
 .../use_mpi_f08/wrappers_f/buffer_detach_f08ts.F90 |   32 +
 .../use_mpi_f08/wrappers_f/cancel_f08ts.F90        |   29 +
 .../use_mpi_f08/wrappers_f/cart_coords_f08ts.F90   |   38 +
 .../use_mpi_f08/wrappers_f/cart_create_f08ts.F90   |   45 +
 .../use_mpi_f08/wrappers_f/cart_get_f08ts.F90      |   42 +
 .../use_mpi_f08/wrappers_f/cart_map_f08ts.F90      |   42 +
 .../use_mpi_f08/wrappers_f/cart_rank_f08ts.F90     |   37 +
 .../use_mpi_f08/wrappers_f/cart_shift_f08ts.F90    |   41 +
 .../use_mpi_f08/wrappers_f/cart_sub_f08ts.F90      |   36 +
 .../use_mpi_f08/wrappers_f/cartdim_get_f08ts.F90   |   32 +
 .../use_mpi_f08/wrappers_f/close_port_f08ts.F90    |   25 +
 .../use_mpi_f08/wrappers_f/comm_accept_f08ts.F90   |   43 +
 .../wrappers_f/comm_call_errhandler_f08ts.F90      |   32 +
 .../use_mpi_f08/wrappers_f/comm_compare_f08ts.F90  |   35 +
 .../use_mpi_f08/wrappers_f/comm_connect_f08ts.F90  |   43 +
 .../wrappers_f/comm_create_errhandler_f08ts.F90    |   34 +
 .../use_mpi_f08/wrappers_f/comm_create_f08ts.F90   |   35 +
 .../wrappers_f/comm_create_group_f08ts.F90         |   38 +
 .../wrappers_f/comm_create_keyval_f08ts.F90        |   38 +
 .../wrappers_f/comm_delete_attr_f08ts.F90          |   32 +
 .../wrappers_f/comm_disconnect_f08ts.F90           |   30 +
 .../use_mpi_f08/wrappers_f/comm_dup_f08ts.F90      |   32 +
 .../wrappers_f/comm_dup_with_info_f08ts.F90        |   35 +
 .../use_mpi_f08/wrappers_f/comm_free_f08ts.F90     |   30 +
 .../wrappers_f/comm_free_keyval_f08ts.F90          |   28 +
 .../use_mpi_f08/wrappers_f/comm_get_attr_f08ts.F90 |   38 +
 .../wrappers_f/comm_get_errhandler_f08ts.F90       |   32 +
 .../use_mpi_f08/wrappers_f/comm_get_name_f08ts.F90 |   38 +
 .../wrappers_f/comm_get_parent_f08ts.F90           |   29 +
 .../use_mpi_f08/wrappers_f/comm_group_f08ts.F90    |   32 +
 .../use_mpi_f08/wrappers_f/comm_idup_f08ts.F90     |   35 +
 .../use_mpi_f08/wrappers_f/comm_join_f08ts.F90     |   32 +
 .../use_mpi_f08/wrappers_f/comm_rank_f08ts.F90     |   32 +
 .../wrappers_f/comm_remote_group_f08ts.F90         |   32 +
 .../wrappers_f/comm_remote_size_f08ts.F90          |   32 +
 .../use_mpi_f08/wrappers_f/comm_set_attr_f08ts.F90 |   35 +
 .../wrappers_f/comm_set_errhandler_f08ts.F90       |   32 +
 .../use_mpi_f08/wrappers_f/comm_set_name_f08ts.F90 |   34 +
 .../use_mpi_f08/wrappers_f/comm_size_f08ts.F90     |   32 +
 .../use_mpi_f08/wrappers_f/comm_spawn_f08ts.F90    |   77 +
 .../wrappers_f/comm_spawn_multiple_f08ts.F90       |   81 +
 .../use_mpi_f08/wrappers_f/comm_split_f08ts.F90    |   38 +
 .../wrappers_f/comm_split_type_f08ts.F90           |   41 +
 .../wrappers_f/comm_test_inter_f08ts.F90           |   32 +
 .../use_mpi_f08/wrappers_f/dims_create_f08ts.F90   |   34 +
 .../dist_graph_create_adjacent_f08ts.F90           |   97 +
 .../wrappers_f/dist_graph_create_f08ts.F90         |   78 +
 .../dist_graph_neighbors_count_f08ts.F90           |   38 +
 .../wrappers_f/dist_graph_neighbors_f08ts.F90      |   50 +
 .../wrappers_f/errhandler_free_f08ts.F90           |   30 +
 .../use_mpi_f08/wrappers_f/error_class_f08ts.F90   |   30 +
 .../use_mpi_f08/wrappers_f/error_string_f08ts.F90  |   37 +
 .../use_mpi_f08/wrappers_f/exscan_f08ts.F90        |   40 +
 .../use_mpi_f08/wrappers_f/f_sync_reg_f08ts.F90    |   18 +
 .../wrappers_f/file_call_errhandler_f08ts.F90      |   33 +
 .../use_mpi_f08/wrappers_f/file_close_f08ts.F90    |   27 +
 .../wrappers_f/file_create_errhandler_f08ts.F90    |   34 +
 .../use_mpi_f08/wrappers_f/file_delete_f08ts.F90   |   34 +
 .../wrappers_f/file_get_amode_f08ts.F90            |   33 +
 .../wrappers_f/file_get_atomicity_f08ts.F90        |   29 +
 .../wrappers_f/file_get_byte_offset_f08ts.F90      |   37 +
 .../wrappers_f/file_get_errhandler_f08ts.F90       |   33 +
 .../wrappers_f/file_get_group_f08ts.F90            |   33 +
 .../use_mpi_f08/wrappers_f/file_get_info_f08ts.F90 |   33 +
 .../wrappers_f/file_get_position_f08ts.F90         |   34 +
 .../wrappers_f/file_get_position_shared_f08ts.F90  |   34 +
 .../use_mpi_f08/wrappers_f/file_get_size_f08ts.F90 |   34 +
 .../wrappers_f/file_get_type_extent_f08ts.F90      |   37 +
 .../use_mpi_f08/wrappers_f/file_get_view_f08ts.F90 |   45 +
 .../use_mpi_f08/wrappers_f/file_iread_at_f08ts.F90 |   44 +
 .../use_mpi_f08/wrappers_f/file_iread_f08ts.F90    |   40 +
 .../wrappers_f/file_iread_shared_f08ts.F90         |   40 +
 .../wrappers_f/file_iwrite_at_f08ts.F90            |   44 +
 .../use_mpi_f08/wrappers_f/file_iwrite_f08ts.F90   |   40 +
 .../wrappers_f/file_iwrite_shared_f08ts.F90        |   40 +
 .../use_mpi_f08/wrappers_f/file_open_f08ts.F90     |   44 +
 .../wrappers_f/file_preallocate_f08ts.F90          |   34 +
 .../wrappers_f/file_read_all_begin_f08ts.F90       |   37 +
 .../wrappers_f/file_read_all_end_f08ts.F90         |   37 +
 .../use_mpi_f08/wrappers_f/file_read_all_f08ts.F90 |   51 +
 .../wrappers_f/file_read_at_all_begin_f08ts.F90    |   41 +
 .../wrappers_f/file_read_at_all_end_f08ts.F90      |   37 +
 .../wrappers_f/file_read_at_all_f08ts.F90          |   55 +
 .../use_mpi_f08/wrappers_f/file_read_at_f08ts.F90  |   55 +
 .../use_mpi_f08/wrappers_f/file_read_f08ts.F90     |   51 +
 .../wrappers_f/file_read_ordered_begin_f08ts.F90   |   37 +
 .../wrappers_f/file_read_ordered_end_f08ts.F90     |   37 +
 .../wrappers_f/file_read_ordered_f08ts.F90         |   51 +
 .../wrappers_f/file_read_shared_f08ts.F90          |   51 +
 .../use_mpi_f08/wrappers_f/file_seek_f08ts.F90     |   37 +
 .../wrappers_f/file_seek_shared_f08ts.F90          |   37 +
 .../wrappers_f/file_set_atomicity_f08ts.F90        |   29 +
 .../wrappers_f/file_set_errhandler_f08ts.F90       |   33 +
 .../use_mpi_f08/wrappers_f/file_set_info_f08ts.F90 |   33 +
 .../use_mpi_f08/wrappers_f/file_set_size_f08ts.F90 |   34 +
 .../use_mpi_f08/wrappers_f/file_set_view_f08ts.F90 |   48 +
 .../use_mpi_f08/wrappers_f/file_sync_f08ts.F90     |   26 +
 .../wrappers_f/file_write_all_begin_f08ts.F90      |   37 +
 .../wrappers_f/file_write_all_end_f08ts.F90        |   37 +
 .../wrappers_f/file_write_all_f08ts.F90            |   51 +
 .../wrappers_f/file_write_at_all_begin_f08ts.F90   |   41 +
 .../wrappers_f/file_write_at_all_end_f08ts.F90     |   37 +
 .../wrappers_f/file_write_at_all_f08ts.F90         |   55 +
 .../use_mpi_f08/wrappers_f/file_write_at_f08ts.F90 |   55 +
 .../use_mpi_f08/wrappers_f/file_write_f08ts.F90    |   51 +
 .../wrappers_f/file_write_ordered_begin_f08ts.F90  |   37 +
 .../wrappers_f/file_write_ordered_end_f08ts.F90    |   37 +
 .../wrappers_f/file_write_ordered_f08ts.F90        |   51 +
 .../wrappers_f/file_write_shared_f08ts.F90         |   51 +
 .../use_mpi_f08/wrappers_f/finalize_f08ts.F90      |   20 +
 .../use_mpi_f08/wrappers_f/finalized_f08ts.F90     |   23 +
 .../use_mpi_f08/wrappers_f/free_mem_f08ts.F90      |   21 +
 .../use_mpi_f08/wrappers_f/gather_f08ts.F90        |   49 +
 .../use_mpi_f08/wrappers_f/gatherv_f08ts.F90       |   54 +
 .../use_mpi_f08/wrappers_f/get_address_f08ts.F90   |   23 +
 .../use_mpi_f08/wrappers_f/get_count_f08ts.F90     |   38 +
 .../use_mpi_f08/wrappers_f/get_elements_f08ts.F90  |   38 +
 .../wrappers_f/get_elements_x_f08ts.F90            |   39 +
 .../fortran/use_mpi_f08/wrappers_f/get_f08ts.F90   |   52 +
 .../wrappers_f/get_library_version_f08ts.F90       |   33 +
 .../wrappers_f/get_processor_name_f08ts.F90        |   33 +
 .../use_mpi_f08/wrappers_f/get_version_f08ts.F90   |   30 +
 .../use_mpi_f08/wrappers_f/graph_create_f08ts.F90  |   46 +
 .../use_mpi_f08/wrappers_f/graph_get_f08ts.F90     |   41 +
 .../use_mpi_f08/wrappers_f/graph_map_f08ts.F90     |   42 +
 .../wrappers_f/graph_neighbors_count_f08ts.F90     |   35 +
 .../wrappers_f/graph_neighbors_f08ts.F90           |   38 +
 .../use_mpi_f08/wrappers_f/graphdims_get_f08ts.F90 |   35 +
 .../wrappers_f/grequest_complete_f08ts.F90         |   29 +
 .../wrappers_f/grequest_start_f08ts.F90            |   46 +
 .../use_mpi_f08/wrappers_f/group_compare_f08ts.F90 |   35 +
 .../wrappers_f/group_difference_f08ts.F90          |   35 +
 .../use_mpi_f08/wrappers_f/group_excl_f08ts.F90    |   38 +
 .../use_mpi_f08/wrappers_f/group_free_f08ts.F90    |   30 +
 .../use_mpi_f08/wrappers_f/group_incl_f08ts.F90    |   38 +
 .../wrappers_f/group_intersection_f08ts.F90        |   35 +
 .../wrappers_f/group_range_excl_f08ts.F90          |   39 +
 .../wrappers_f/group_range_incl_f08ts.F90          |   39 +
 .../use_mpi_f08/wrappers_f/group_rank_f08ts.F90    |   32 +
 .../use_mpi_f08/wrappers_f/group_size_f08ts.F90    |   32 +
 .../wrappers_f/group_translate_ranks_f08ts.F90     |   41 +
 .../use_mpi_f08/wrappers_f/group_union_f08ts.F90   |   35 +
 .../use_mpi_f08/wrappers_f/iallgather_f08ts.F90    |   49 +
 .../use_mpi_f08/wrappers_f/iallgatherv_f08ts.F90   |   55 +
 .../use_mpi_f08/wrappers_f/iallreduce_f08ts.F90    |   44 +
 .../use_mpi_f08/wrappers_f/ialltoall_f08ts.F90     |   49 +
 .../use_mpi_f08/wrappers_f/ialltoallv_f08ts.F90    |   59 +
 .../use_mpi_f08/wrappers_f/ialltoallw_f08ts.F90    |   59 +
 .../use_mpi_f08/wrappers_f/ibarrier_f08ts.F90      |   32 +
 .../use_mpi_f08/wrappers_f/ibcast_f08ts.F90        |   42 +
 .../use_mpi_f08/wrappers_f/ibsend_f08ts.F90        |   45 +
 .../use_mpi_f08/wrappers_f/iexscan_f08ts.F90       |   44 +
 .../use_mpi_f08/wrappers_f/igather_f08ts.F90       |   52 +
 .../use_mpi_f08/wrappers_f/igatherv_f08ts.F90      |   58 +
 .../use_mpi_f08/wrappers_f/improbe_f08ts.F90       |   55 +
 .../use_mpi_f08/wrappers_f/imrecv_f08ts.F90        |   40 +
 .../wrappers_f/ineighbor_allgather_f08ts.F90       |   49 +
 .../wrappers_f/ineighbor_allgatherv_f08ts.F90      |   55 +
 .../wrappers_f/ineighbor_alltoall_f08ts.F90        |   49 +
 .../wrappers_f/ineighbor_alltoallv_f08ts.F90       |   58 +
 .../wrappers_f/ineighbor_alltoallw_f08ts.F90       |   56 +
 .../use_mpi_f08/wrappers_f/info_create_f08ts.F90   |   29 +
 .../use_mpi_f08/wrappers_f/info_delete_f08ts.F90   |   34 +
 .../use_mpi_f08/wrappers_f/info_dup_f08ts.F90      |   32 +
 .../use_mpi_f08/wrappers_f/info_free_f08ts.F90     |   30 +
 .../use_mpi_f08/wrappers_f/info_get_f08ts.F90      |   45 +
 .../wrappers_f/info_get_nkeys_f08ts.F90            |   32 +
 .../wrappers_f/info_get_nthkey_f08ts.F90           |   37 +
 .../wrappers_f/info_get_valuelen_f08ts.F90         |   40 +
 .../use_mpi_f08/wrappers_f/info_set_f08ts.F90      |   38 +
 .../fortran/use_mpi_f08/wrappers_f/init_f08ts.F90  |   19 +
 .../use_mpi_f08/wrappers_f/init_thread_f08ts.F90   |   30 +
 .../use_mpi_f08/wrappers_f/initialized_f08ts.F90   |   23 +
 .../wrappers_f/intercomm_create_f08ts.F90          |   47 +
 .../wrappers_f/intercomm_merge_f08ts.F90           |   35 +
 .../use_mpi_f08/wrappers_f/iprobe_f08ts.F90        |   52 +
 .../fortran/use_mpi_f08/wrappers_f/irecv_f08ts.F90 |   45 +
 .../use_mpi_f08/wrappers_f/ireduce_f08ts.F90       |   48 +
 .../wrappers_f/ireduce_scatter_block_f08ts.F90     |   46 +
 .../wrappers_f/ireduce_scatter_f08ts.F90           |   48 +
 .../use_mpi_f08/wrappers_f/irsend_f08ts.F90        |   45 +
 .../wrappers_f/is_thread_main_f08ts.F90            |   23 +
 .../fortran/use_mpi_f08/wrappers_f/iscan_f08ts.F90 |   44 +
 .../use_mpi_f08/wrappers_f/iscatter_f08ts.F90      |   52 +
 .../use_mpi_f08/wrappers_f/iscatterv_f08ts.F90     |   59 +
 .../fortran/use_mpi_f08/wrappers_f/isend_f08ts.F90 |   45 +
 .../use_mpi_f08/wrappers_f/issend_f08ts.F90        |   45 +
 .../use_mpi_f08/wrappers_f/lookup_name_f08ts.F90   |   40 +
 .../use_mpi_f08/wrappers_f/mprobe_f08ts.F90        |   52 +
 .../fortran/use_mpi_f08/wrappers_f/mrecv_f08ts.F90 |   51 +
 .../wrappers_f/neighbor_allgather_f08ts.F90        |   46 +
 .../wrappers_f/neighbor_allgatherv_f08ts.F90       |   52 +
 .../wrappers_f/neighbor_alltoall_f08ts.F90         |   46 +
 .../wrappers_f/neighbor_alltoallv_f08ts.F90        |   55 +
 .../wrappers_f/neighbor_alltoallw_f08ts.F90        |   55 +
 .../wrappers_f/op_commutative_f08ts.F90            |   32 +
 .../use_mpi_f08/wrappers_f/op_create_f08ts.F90     |   37 +
 .../use_mpi_f08/wrappers_f/op_free_f08ts.F90       |   30 +
 .../use_mpi_f08/wrappers_f/open_port_f08ts.F90     |   35 +
 .../use_mpi_f08/wrappers_f/pack_external_f08ts.F90 |   50 +
 .../wrappers_f/pack_external_size_f08ts.F90        |   41 +
 .../fortran/use_mpi_f08/wrappers_f/pack_f08ts.F90  |   44 +
 .../use_mpi_f08/wrappers_f/pack_size_f08ts.F90     |   38 +
 .../use_mpi_f08/wrappers_f/pcontrol_f08ts.F90      |   25 +
 .../fortran/use_mpi_f08/wrappers_f/probe_f08ts.F90 |   49 +
 .../use_mpi_f08/wrappers_f/publish_name_f08ts.F90  |   38 +
 .../fortran/use_mpi_f08/wrappers_f/put_f08ts.F90   |   52 +
 .../use_mpi_f08/wrappers_f/query_thread_f08ts.F90  |   27 +
 .../fortran/use_mpi_f08/wrappers_f/recv_f08ts.F90  |   56 +
 .../use_mpi_f08/wrappers_f/recv_init_f08ts.F90     |   45 +
 .../use_mpi_f08/wrappers_f/reduce_f08ts.F90        |   43 +
 .../use_mpi_f08/wrappers_f/reduce_local_f08ts.F90  |   37 +
 .../wrappers_f/reduce_scatter_block_f08ts.F90      |   43 +
 .../wrappers_f/reduce_scatter_f08ts.F90            |   44 +
 .../wrappers_f/register_datarep_f08ts.F90          |   50 +
 .../use_mpi_f08/wrappers_f/request_free_f08ts.F90  |   30 +
 .../wrappers_f/request_get_status_f08ts.F90        |   46 +
 .../fortran/use_mpi_f08/wrappers_f/rsend_f08ts.F90 |   42 +
 .../use_mpi_f08/wrappers_f/rsend_init_f08ts.F90    |   45 +
 .../fortran/use_mpi_f08/wrappers_f/scan_f08ts.F90  |   40 +
 .../use_mpi_f08/wrappers_f/scatter_f08ts.F90       |   49 +
 .../use_mpi_f08/wrappers_f/scatterv_f08ts.F90      |   56 +
 .../fortran/use_mpi_f08/wrappers_f/send_f08ts.F90  |   42 +
 .../use_mpi_f08/wrappers_f/send_init_f08ts.F90     |   45 +
 .../use_mpi_f08/wrappers_f/sendrecv_f08ts.F90      |   74 +
 .../wrappers_f/sendrecv_replace_f08ts.F90          |   67 +
 .../fortran/use_mpi_f08/wrappers_f/ssend_f08ts.F90 |   42 +
 .../use_mpi_f08/wrappers_f/ssend_init_f08ts.F90    |   45 +
 .../fortran/use_mpi_f08/wrappers_f/start_f08ts.F90 |   30 +
 .../use_mpi_f08/wrappers_f/startall_f08ts.F90      |   33 +
 .../wrappers_f/status_set_cancelled_f08ts.F90      |   34 +
 .../wrappers_f/status_set_elements_f08ts.F90       |   46 +
 .../wrappers_f/status_set_elements_x_f08ts.F90     |   47 +
 .../wrappers_f/test_cancelled_f08ts.F90            |   29 +
 .../fortran/use_mpi_f08/wrappers_f/test_f08ts.F90  |   47 +
 .../use_mpi_f08/wrappers_f/testall_f08ts.F90       |   55 +
 .../use_mpi_f08/wrappers_f/testany_f08ts.F90       |   54 +
 .../use_mpi_f08/wrappers_f/testsome_f08ts.F90      |   61 +
 .../use_mpi_f08/wrappers_f/topo_test_f08ts.F90     |   32 +
 .../use_mpi_f08/wrappers_f/type_commit_f08ts.F90   |   30 +
 .../wrappers_f/type_contiguous_f08ts.F90           |   35 +
 .../wrappers_f/type_create_darray_f08ts.F90        |   60 +
 .../wrappers_f/type_create_f90_complex_f08ts.F90   |   35 +
 .../wrappers_f/type_create_f90_integer_f08ts.F90   |   32 +
 .../wrappers_f/type_create_f90_real_f08ts.F90      |   35 +
 .../type_create_hindexed_block_f08ts.F90           |   45 +
 .../wrappers_f/type_create_hindexed_f08ts.F90      |   45 +
 .../wrappers_f/type_create_hvector_f08ts.F90       |   42 +
 .../wrappers_f/type_create_indexed_block_f08ts.F90 |   44 +
 .../wrappers_f/type_create_keyval_f08ts.F90        |   38 +
 .../wrappers_f/type_create_resized_f08ts.F90       |   39 +
 .../wrappers_f/type_create_struct_f08ts.F90        |   43 +
 .../wrappers_f/type_create_subarray_f08ts.F90      |   50 +
 .../wrappers_f/type_delete_attr_f08ts.F90          |   32 +
 .../use_mpi_f08/wrappers_f/type_dup_f08ts.F90      |   32 +
 .../use_mpi_f08/wrappers_f/type_free_f08ts.F90     |   30 +
 .../wrappers_f/type_free_keyval_f08ts.F90          |   28 +
 .../use_mpi_f08/wrappers_f/type_get_attr_f08ts.F90 |   38 +
 .../wrappers_f/type_get_contents_f08ts.F90         |   50 +
 .../wrappers_f/type_get_envelope_f08ts.F90         |   44 +
 .../wrappers_f/type_get_extent_f08ts.F90           |   36 +
 .../wrappers_f/type_get_extent_x_f08ts.F90         |   36 +
 .../use_mpi_f08/wrappers_f/type_get_name_f08ts.F90 |   38 +
 .../wrappers_f/type_get_true_extent_f08ts.F90      |   36 +
 .../wrappers_f/type_get_true_extent_x_f08ts.F90    |   37 +
 .../use_mpi_f08/wrappers_f/type_indexed_f08ts.F90  |   44 +
 .../wrappers_f/type_match_size_f08ts.F90           |   35 +
 .../use_mpi_f08/wrappers_f/type_set_attr_f08ts.F90 |   35 +
 .../use_mpi_f08/wrappers_f/type_set_name_f08ts.F90 |   34 +
 .../use_mpi_f08/wrappers_f/type_size_f08ts.F90     |   32 +
 .../use_mpi_f08/wrappers_f/type_size_x_f08ts.F90   |   33 +
 .../use_mpi_f08/wrappers_f/type_vector_f08ts.F90   |   41 +
 .../wrappers_f/unpack_external_f08ts.F90           |   49 +
 .../use_mpi_f08/wrappers_f/unpack_f08ts.F90        |   45 +
 .../wrappers_f/unpublish_name_f08ts.F90            |   38 +
 .../fortran/use_mpi_f08/wrappers_f/wait_f08ts.F90  |   44 +
 .../use_mpi_f08/wrappers_f/waitall_f08ts.F90       |   47 +
 .../use_mpi_f08/wrappers_f/waitany_f08ts.F90       |   51 +
 .../use_mpi_f08/wrappers_f/waitsome_f08ts.F90      |   61 +
 .../wrappers_f/win_call_errhandler_f08ts.F90       |   32 +
 .../use_mpi_f08/wrappers_f/win_complete_f08ts.F90  |   29 +
 .../wrappers_f/win_create_errhandler_f08ts.F90     |   34 +
 .../use_mpi_f08/wrappers_f/win_create_f08ts.F90    |   41 +
 .../wrappers_f/win_create_keyval_f08ts.F90         |   38 +
 .../wrappers_f/win_delete_attr_f08ts.F90           |   32 +
 .../use_mpi_f08/wrappers_f/win_fence_f08ts.F90     |   32 +
 .../use_mpi_f08/wrappers_f/win_free_f08ts.F90      |   30 +
 .../wrappers_f/win_free_keyval_f08ts.F90           |   28 +
 .../use_mpi_f08/wrappers_f/win_get_attr_f08ts.F90  |   38 +
 .../wrappers_f/win_get_errhandler_f08ts.F90        |   32 +
 .../use_mpi_f08/wrappers_f/win_get_group_f08ts.F90 |   32 +
 .../use_mpi_f08/wrappers_f/win_get_name_f08ts.F90  |   38 +
 .../use_mpi_f08/wrappers_f/win_lock_f08ts.F90      |   38 +
 .../use_mpi_f08/wrappers_f/win_post_f08ts.F90      |   35 +
 .../use_mpi_f08/wrappers_f/win_set_attr_f08ts.F90  |   35 +
 .../wrappers_f/win_set_errhandler_f08ts.F90        |   32 +
 .../use_mpi_f08/wrappers_f/win_set_name_f08ts.F90  |   34 +
 .../use_mpi_f08/wrappers_f/win_start_f08ts.F90     |   35 +
 .../use_mpi_f08/wrappers_f/win_test_f08ts.F90      |   32 +
 .../use_mpi_f08/wrappers_f/win_unlock_f08ts.F90    |   32 +
 .../use_mpi_f08/wrappers_f/win_wait_f08ts.F90      |   29 +
 .../fortran/use_mpi_f08/wrappers_f/wtick_f08ts.F90 |   14 +
 .../fortran/use_mpi_f08/wrappers_f/wtime_f08ts.F90 |   14 +
 src/include/mpi.h.in                               |   23 +-
 src/mpi/init/initthread.c                          |   30 +
 test/mpi/.gitignore                                |   40 +
 test/mpi/Makefile.am                               |    2 +-
 test/mpi/Makefile_f08.mtest                        |   26 +
 test/mpi/configure.ac                              |   26 +-
 test/mpi/errors/Makefile.am                        |    2 +-
 test/mpi/errors/f08/Makefile.am                    |   13 +
 test/mpi/errors/f08/io/Makefile.am                 |   19 +
 test/mpi/errors/f08/io/testlist                    |    1 +
 test/mpi/errors/f08/io/uerrhandf08.f90             |  146 +
 test/mpi/errors/f08/testlist                       |    1 +
 test/mpi/f08/Makefile.am                           |   17 +
 test/mpi/f08/attr/Makefile.am                      |   37 +
 test/mpi/f08/attr/attrlangc.c                      |  628 ++++
 test/mpi/f08/attr/attrlangf08.f90                  |  944 +++++
 test/mpi/f08/attr/attrmpi1f08.f90                  |   63 +
 test/mpi/f08/attr/baseattr2f08.f90                 |  113 +
 test/mpi/f08/attr/baseattr3f08.f90                 |  118 +
 test/mpi/f08/attr/baseattrf08.f90                  |   63 +
 test/mpi/f08/attr/commattr2f08.f90                 |  104 +
 test/mpi/f08/attr/commattr3f08.f90                 |   85 +
 test/mpi/f08/attr/commattrf08.f90                  |  155 +
 test/mpi/f08/attr/fandcattrc.c                     |  121 +
 test/mpi/f08/attr/fandcattrf08.f90                 |  138 +
 test/mpi/f08/attr/testlist                         |   12 +
 test/mpi/f08/attr/typeattr2f08.f90                 |  103 +
 test/mpi/f08/attr/typeattr3f08.f90                 |   84 +
 test/mpi/f08/attr/typeattrf08.f90                  |  158 +
 test/mpi/f08/coll/Makefile.am                      |   26 +
 test/mpi/f08/coll/allredint8f08.f90                |   22 +
 test/mpi/f08/coll/allredopttf08.f90                |   46 +
 test/mpi/f08/coll/alltoallvf08.f90                 |  148 +
 test/mpi/f08/coll/alltoallwf08.f90                 |   69 +
 test/mpi/f08/coll/exscanf08.f90                    |  108 +
 test/mpi/f08/coll/inplacef08.f90                   |   92 +
 test/mpi/f08/coll/nonblocking_inpf08.f90           |  127 +
 test/mpi/f08/coll/nonblockingf08.f90               |  100 +
 test/mpi/f08/coll/red_scat_blockf08.f90            |   57 +
 test/mpi/f08/coll/redscatf08.f90                   |   86 +
 test/mpi/f08/coll/reducelocalf08.f90               |   98 +
 test/mpi/f08/coll/split_typef08.f90                |   48 +
 test/mpi/f08/coll/testlist                         |   12 +
 test/mpi/f08/coll/uallreducef08.f90                |   64 +
 test/mpi/f08/coll/vw_inplacef08.f90                |  111 +
 test/mpi/f08/comm/Makefile.am                      |   18 +
 test/mpi/f08/comm/commerrf08.f90                   |  127 +
 test/mpi/f08/comm/commnamef08.f90                  |   83 +
 test/mpi/f08/comm/testlist                         |    2 +
 test/mpi/f08/datatype/Makefile.am                  |   17 +
 test/mpi/f08/datatype/allctypesf08.f90             |  141 +
 test/mpi/f08/datatype/createf08.f90                |   70 +
 test/mpi/f08/datatype/createf90.f90                |   68 +
 test/mpi/f08/datatype/gaddressf08.f90              |   39 +
 test/mpi/f08/datatype/get_elem_d.f90               |  127 +
 test/mpi/f08/datatype/get_elem_u.f90               |   74 +
 test/mpi/f08/datatype/hindex1f08.f90               |   62 +
 test/mpi/f08/datatype/hindexed_blockf08.f90        |  181 +
 test/mpi/f08/datatype/indtype.f90                  |  117 +
 test/mpi/f08/datatype/kinds.f90                    |  115 +
 test/mpi/f08/datatype/packef08.f90                 |  188 +
 test/mpi/f08/datatype/sizeof.f90                   |  128 +
 test/mpi/f08/datatype/structf.f90                  |  113 +
 test/mpi/f08/datatype/testlist                     |   19 +
 test/mpi/f08/datatype/trf08.f90                    |   25 +
 test/mpi/f08/datatype/typecntsf08.f90              |   93 +
 test/mpi/f08/datatype/typem2f08.f90                |  180 +
 test/mpi/f08/datatype/typename3f08.f90             |   41 +
 test/mpi/f08/datatype/typenamef08.f90              |  205 ++
 test/mpi/f08/datatype/typesnamef08.f90             |   68 +
 test/mpi/f08/datatype/typesubf08.f90               |   74 +
 test/mpi/f08/hello_usempif08.f90                   |   29 +
 test/mpi/f08/pt2pt/Makefile.am                     |   18 +
 test/mpi/f08/pt2pt/allpairf08.f90                  | 1037 ++++++
 test/mpi/f08/pt2pt/dummyf08.f90                    |   20 +
 test/mpi/f08/pt2pt/greqf08.f90                     |  115 +
 test/mpi/f08/pt2pt/mprobef08.f90                   |  636 ++++
 test/mpi/f08/pt2pt/statusesf08.f90                 |   56 +
 test/mpi/f08/pt2pt/testlist                        |    4 +
 test/mpi/f08/ring_usempif08.f90                    |   76 +
 test/mpi/f08/rma/Makefile.am                       |   34 +
 test/mpi/f08/rma/baseattrwinf08.f90                |   83 +
 test/mpi/f08/rma/c2f2cwinf08.f90                   |   55 +
 test/mpi/f08/rma/c2f902cwin.c                      |   92 +
 test/mpi/f08/rma/testlist                          |   12 +
 test/mpi/f08/rma/winaccf08.f90                     |   97 +
 test/mpi/f08/rma/winattr2f08.f90                   |   89 +
 test/mpi/f08/rma/winattrf08.f90                    |  181 +
 test/mpi/f08/rma/winerrf08.f90                     |  136 +
 test/mpi/f08/rma/winfencef08.f90                   |   97 +
 test/mpi/f08/rma/wingetf08.f90                     |   97 +
 test/mpi/f08/rma/wingroupf08.f90                   |   45 +
 test/mpi/f08/rma/winnamef08.f90                    |   80 +
 test/mpi/f08/rma/winscale1f08.f90                  |  110 +
 test/mpi/f08/rma/winscale2f08.f90                  |  115 +
 test/mpi/f08/testlist                              |    8 +
 test/mpi/f08/util/Makefile.am                      |   13 +
 test/mpi/f08/util/mtestf08.f90                     |  106 +
 test/mpi/testlist.in                               |    1 +
 443 files changed, 34270 insertions(+), 15 deletions(-)
 create mode 100755 src/binding/fortran/use_mpi_f08/buildiface
 create mode 100644 src/binding/fortran/use_mpi_f08/mpi_c_interface.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/mpi_c_interface_cdesc.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/mpi_c_interface_glue.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/mpi_c_interface_nobuf.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/mpi_c_interface_types.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/mpi_f08.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/mpi_f08_callbacks.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/mpi_f08_compile_constants.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/mpi_f08_link_constants.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/mpi_f08_types.F90
 create mode 100755 src/binding/fortran/use_mpi_f08/wrappers_c/buildiface
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_c/comm_spawn_c.c
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_c/comm_spawn_multiple_c.c
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_c/f_sync_reg_c.c
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_c/utils.c
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/abort_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/accumulate_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/add_error_class_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/add_error_code_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/add_error_string_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/allgather_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/allgatherv_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/alloc_mem_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/allreduce_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/alltoall_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/alltoallv_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/alltoallw_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/barrier_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/bcast_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/bsend_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/bsend_init_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/buffer_attach_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/buffer_detach_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/cancel_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/cart_coords_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/cart_create_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/cart_get_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/cart_map_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/cart_rank_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/cart_shift_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/cart_sub_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/cartdim_get_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/close_port_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/comm_accept_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/comm_call_errhandler_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/comm_compare_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/comm_connect_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/comm_create_errhandler_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/comm_create_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/comm_create_group_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/comm_create_keyval_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/comm_delete_attr_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/comm_disconnect_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/comm_dup_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/comm_dup_with_info_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/comm_free_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/comm_free_keyval_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/comm_get_attr_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/comm_get_errhandler_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/comm_get_name_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/comm_get_parent_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/comm_group_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/comm_idup_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/comm_join_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/comm_rank_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/comm_remote_group_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/comm_remote_size_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/comm_set_attr_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/comm_set_errhandler_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/comm_set_name_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/comm_size_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/comm_spawn_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/comm_spawn_multiple_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/comm_split_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/comm_split_type_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/comm_test_inter_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/dims_create_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/dist_graph_create_adjacent_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/dist_graph_create_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/dist_graph_neighbors_count_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/dist_graph_neighbors_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/errhandler_free_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/error_class_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/error_string_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/exscan_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/f_sync_reg_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/file_call_errhandler_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/file_close_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/file_create_errhandler_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/file_delete_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/file_get_amode_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/file_get_atomicity_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/file_get_byte_offset_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/file_get_errhandler_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/file_get_group_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/file_get_info_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/file_get_position_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/file_get_position_shared_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/file_get_size_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/file_get_type_extent_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/file_get_view_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/file_iread_at_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/file_iread_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/file_iread_shared_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/file_iwrite_at_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/file_iwrite_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/file_iwrite_shared_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/file_open_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/file_preallocate_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/file_read_all_begin_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/file_read_all_end_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/file_read_all_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/file_read_at_all_begin_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/file_read_at_all_end_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/file_read_at_all_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/file_read_at_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/file_read_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/file_read_ordered_begin_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/file_read_ordered_end_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/file_read_ordered_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/file_read_shared_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/file_seek_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/file_seek_shared_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/file_set_atomicity_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/file_set_errhandler_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/file_set_info_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/file_set_size_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/file_set_view_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/file_sync_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/file_write_all_begin_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/file_write_all_end_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/file_write_all_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/file_write_at_all_begin_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/file_write_at_all_end_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/file_write_at_all_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/file_write_at_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/file_write_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/file_write_ordered_begin_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/file_write_ordered_end_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/file_write_ordered_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/file_write_shared_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/finalize_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/finalized_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/free_mem_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/gather_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/gatherv_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/get_address_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/get_count_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/get_elements_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/get_elements_x_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/get_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/get_library_version_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/get_processor_name_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/get_version_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/graph_create_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/graph_get_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/graph_map_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/graph_neighbors_count_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/graph_neighbors_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/graphdims_get_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/grequest_complete_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/grequest_start_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/group_compare_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/group_difference_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/group_excl_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/group_free_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/group_incl_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/group_intersection_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/group_range_excl_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/group_range_incl_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/group_rank_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/group_size_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/group_translate_ranks_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/group_union_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/iallgather_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/iallgatherv_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/iallreduce_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/ialltoall_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/ialltoallv_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/ialltoallw_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/ibarrier_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/ibcast_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/ibsend_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/iexscan_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/igather_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/igatherv_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/improbe_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/imrecv_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/ineighbor_allgather_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/ineighbor_allgatherv_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/ineighbor_alltoall_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/ineighbor_alltoallv_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/ineighbor_alltoallw_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/info_create_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/info_delete_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/info_dup_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/info_free_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/info_get_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/info_get_nkeys_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/info_get_nthkey_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/info_get_valuelen_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/info_set_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/init_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/init_thread_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/initialized_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/intercomm_create_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/intercomm_merge_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/iprobe_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/irecv_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/ireduce_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/ireduce_scatter_block_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/ireduce_scatter_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/irsend_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/is_thread_main_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/iscan_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/iscatter_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/iscatterv_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/isend_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/issend_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/lookup_name_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/mprobe_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/mrecv_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/neighbor_allgather_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/neighbor_allgatherv_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/neighbor_alltoall_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/neighbor_alltoallv_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/neighbor_alltoallw_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/op_commutative_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/op_create_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/op_free_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/open_port_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/pack_external_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/pack_external_size_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/pack_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/pack_size_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/pcontrol_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/probe_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/publish_name_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/put_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/query_thread_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/recv_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/recv_init_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/reduce_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/reduce_local_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/reduce_scatter_block_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/reduce_scatter_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/register_datarep_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/request_free_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/request_get_status_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/rsend_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/rsend_init_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/scan_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/scatter_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/scatterv_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/send_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/send_init_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/sendrecv_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/sendrecv_replace_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/ssend_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/ssend_init_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/start_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/startall_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/status_set_cancelled_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/status_set_elements_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/status_set_elements_x_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/test_cancelled_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/test_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/testall_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/testany_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/testsome_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/topo_test_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/type_commit_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/type_contiguous_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/type_create_darray_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/type_create_f90_complex_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/type_create_f90_integer_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/type_create_f90_real_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/type_create_hindexed_block_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/type_create_hindexed_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/type_create_hvector_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/type_create_indexed_block_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/type_create_keyval_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/type_create_resized_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/type_create_struct_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/type_create_subarray_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/type_delete_attr_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/type_dup_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/type_free_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/type_free_keyval_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/type_get_attr_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/type_get_contents_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/type_get_envelope_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/type_get_extent_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/type_get_extent_x_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/type_get_name_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/type_get_true_extent_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/type_get_true_extent_x_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/type_indexed_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/type_match_size_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/type_set_attr_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/type_set_name_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/type_size_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/type_size_x_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/type_vector_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/unpack_external_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/unpack_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/unpublish_name_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/wait_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/waitall_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/waitany_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/waitsome_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/win_call_errhandler_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/win_complete_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/win_create_errhandler_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/win_create_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/win_create_keyval_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/win_delete_attr_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/win_fence_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/win_free_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/win_free_keyval_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/win_get_attr_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/win_get_errhandler_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/win_get_group_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/win_get_name_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/win_lock_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/win_post_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/win_set_attr_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/win_set_errhandler_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/win_set_name_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/win_start_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/win_test_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/win_unlock_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/win_wait_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/wtick_f08ts.F90
 create mode 100644 src/binding/fortran/use_mpi_f08/wrappers_f/wtime_f08ts.F90
 create mode 100644 test/mpi/Makefile_f08.mtest
 create mode 100644 test/mpi/errors/f08/Makefile.am
 create mode 100644 test/mpi/errors/f08/io/Makefile.am
 create mode 100644 test/mpi/errors/f08/io/testlist
 create mode 100644 test/mpi/errors/f08/io/uerrhandf08.f90
 create mode 100644 test/mpi/errors/f08/testlist
 create mode 100644 test/mpi/f08/Makefile.am
 create mode 100644 test/mpi/f08/attr/Makefile.am
 create mode 100644 test/mpi/f08/attr/attrlangc.c
 create mode 100644 test/mpi/f08/attr/attrlangf08.f90
 create mode 100644 test/mpi/f08/attr/attrmpi1f08.f90
 create mode 100644 test/mpi/f08/attr/baseattr2f08.f90
 create mode 100644 test/mpi/f08/attr/baseattr3f08.f90
 create mode 100644 test/mpi/f08/attr/baseattrf08.f90
 create mode 100644 test/mpi/f08/attr/commattr2f08.f90
 create mode 100644 test/mpi/f08/attr/commattr3f08.f90
 create mode 100644 test/mpi/f08/attr/commattrf08.f90
 create mode 100644 test/mpi/f08/attr/fandcattrc.c
 create mode 100644 test/mpi/f08/attr/fandcattrf08.f90
 create mode 100644 test/mpi/f08/attr/testlist
 create mode 100644 test/mpi/f08/attr/typeattr2f08.f90
 create mode 100644 test/mpi/f08/attr/typeattr3f08.f90
 create mode 100644 test/mpi/f08/attr/typeattrf08.f90
 create mode 100644 test/mpi/f08/coll/Makefile.am
 create mode 100644 test/mpi/f08/coll/allredint8f08.f90
 create mode 100644 test/mpi/f08/coll/allredopttf08.f90
 create mode 100644 test/mpi/f08/coll/alltoallvf08.f90
 create mode 100644 test/mpi/f08/coll/alltoallwf08.f90
 create mode 100644 test/mpi/f08/coll/exscanf08.f90
 create mode 100644 test/mpi/f08/coll/inplacef08.f90
 create mode 100644 test/mpi/f08/coll/nonblocking_inpf08.f90
 create mode 100644 test/mpi/f08/coll/nonblockingf08.f90
 create mode 100644 test/mpi/f08/coll/red_scat_blockf08.f90
 create mode 100644 test/mpi/f08/coll/redscatf08.f90
 create mode 100644 test/mpi/f08/coll/reducelocalf08.f90
 create mode 100644 test/mpi/f08/coll/split_typef08.f90
 create mode 100644 test/mpi/f08/coll/testlist
 create mode 100644 test/mpi/f08/coll/uallreducef08.f90
 create mode 100644 test/mpi/f08/coll/vw_inplacef08.f90
 create mode 100644 test/mpi/f08/comm/Makefile.am
 create mode 100644 test/mpi/f08/comm/commerrf08.f90
 create mode 100644 test/mpi/f08/comm/commnamef08.f90
 create mode 100644 test/mpi/f08/comm/testlist
 create mode 100644 test/mpi/f08/datatype/Makefile.am
 create mode 100644 test/mpi/f08/datatype/allctypesf08.f90
 create mode 100644 test/mpi/f08/datatype/createf08.f90
 create mode 100644 test/mpi/f08/datatype/createf90.f90
 create mode 100644 test/mpi/f08/datatype/gaddressf08.f90
 create mode 100644 test/mpi/f08/datatype/get_elem_d.f90
 create mode 100644 test/mpi/f08/datatype/get_elem_u.f90
 create mode 100644 test/mpi/f08/datatype/hindex1f08.f90
 create mode 100644 test/mpi/f08/datatype/hindexed_blockf08.f90
 create mode 100644 test/mpi/f08/datatype/indtype.f90
 create mode 100644 test/mpi/f08/datatype/kinds.f90
 create mode 100644 test/mpi/f08/datatype/packef08.f90
 create mode 100644 test/mpi/f08/datatype/sizeof.f90
 create mode 100644 test/mpi/f08/datatype/structf.f90
 create mode 100644 test/mpi/f08/datatype/testlist
 create mode 100644 test/mpi/f08/datatype/trf08.f90
 create mode 100644 test/mpi/f08/datatype/typecntsf08.f90
 create mode 100644 test/mpi/f08/datatype/typem2f08.f90
 create mode 100644 test/mpi/f08/datatype/typename3f08.f90
 create mode 100644 test/mpi/f08/datatype/typenamef08.f90
 create mode 100644 test/mpi/f08/datatype/typesnamef08.f90
 create mode 100644 test/mpi/f08/datatype/typesubf08.f90
 create mode 100644 test/mpi/f08/hello_usempif08.f90
 create mode 100644 test/mpi/f08/pt2pt/Makefile.am
 create mode 100644 test/mpi/f08/pt2pt/allpairf08.f90
 create mode 100644 test/mpi/f08/pt2pt/dummyf08.f90
 create mode 100644 test/mpi/f08/pt2pt/greqf08.f90
 create mode 100644 test/mpi/f08/pt2pt/mprobef08.f90
 create mode 100644 test/mpi/f08/pt2pt/statusesf08.f90
 create mode 100644 test/mpi/f08/pt2pt/testlist
 create mode 100644 test/mpi/f08/ring_usempif08.f90
 create mode 100644 test/mpi/f08/rma/Makefile.am
 create mode 100644 test/mpi/f08/rma/baseattrwinf08.f90
 create mode 100644 test/mpi/f08/rma/c2f2cwinf08.f90
 create mode 100644 test/mpi/f08/rma/c2f902cwin.c
 create mode 100644 test/mpi/f08/rma/testlist
 create mode 100644 test/mpi/f08/rma/winaccf08.f90
 create mode 100644 test/mpi/f08/rma/winattr2f08.f90
 create mode 100644 test/mpi/f08/rma/winattrf08.f90
 create mode 100644 test/mpi/f08/rma/winerrf08.f90
 create mode 100644 test/mpi/f08/rma/winfencef08.f90
 create mode 100644 test/mpi/f08/rma/wingetf08.f90
 create mode 100644 test/mpi/f08/rma/wingroupf08.f90
 create mode 100644 test/mpi/f08/rma/winnamef08.f90
 create mode 100644 test/mpi/f08/rma/winscale1f08.f90
 create mode 100644 test/mpi/f08/rma/winscale2f08.f90
 create mode 100644 test/mpi/f08/testlist
 create mode 100644 test/mpi/f08/util/Makefile.am
 create mode 100644 test/mpi/f08/util/mtestf08.f90


hooks/post-receive
-- 
MPICH primary repository


More information about the commits mailing list